package dotty.tools
package dotc
package reporting
import core.Contexts.Context
import diagnostic.messages._
import dotty.tools.dotc.parsing.Tokens
import org.junit.Assert._
import org.junit.Test
class ErrorMessagesTests extends ErrorMessagesTest {
// In the case where there are no errors, we can do "expectNoErrors" in the
// `Report`
@Test def noErrors =
checkMessagesAfter("frontend")("""class Foo""")
.expectNoErrors
@Test def typeMismatch =
checkMessagesAfter("frontend") {
"""
|object Foo {
| def bar: String = 1
|}
""".stripMargin
}
.expect { (ictx, messages) =>
implicit val ctx: Context = ictx
val defn = ictx.definitions
// Assert that we only got one error message
assertMessageCount(1, messages)
// Pattern match out the expected error
val TypeMismatch(found, expected, _, _) :: Nil = messages
// The type of the right hand side will actually be the constant 1,
// therefore we check if it "derivesFrom" `IntClass`
assert(found.derivesFrom(defn.IntClass), s"found was: $found")
// The expected type is `scala.String` which we dealias to
// `java.lang.String` and compare with `=:=` to `defn.StringType` which
// is a type reference to `java.lang.String`
assert(expected.dealias =:= defn.StringType, s"expected was: $expected")
}
@Test def overridesNothing =
checkMessagesAfter("refchecks") {
"""
|object Foo {
| override def bar: Unit = {}
|}
""".stripMargin
}
.expect { (ictx, messages) =>
implicit val ctx: Context = ictx
val defn = ictx.definitions
assertMessageCount(1, messages)
val OverridesNothing(member) :: Nil = messages
assertEquals("bar", member.name.show)
}
@Test def overridesNothingDifferentSignature =
checkMessagesAfter("refchecks") {
"""
|class Bar {
| def bar(s: String): Unit = {}
| def bar(s: Int): Unit = {}
| final def bar(s: Long): Unit = {}
|}
|object Foo extends Bar {
| override def bar: Unit = {}
|}
""".stripMargin
}
.expect { (ictx, messages) =>
implicit val ctx: Context = ictx
val defn = ictx.definitions
assertMessageCount(1, messages)
val OverridesNothingButNameExists(member, sameName) :: Nil = messages
// check expected context data
assertEquals("bar", member.name.show)
assertEquals(3, sameName.size)
assert(sameName.forall(_.symbol.name.show == "bar"),
"at least one method had an unexpected name")
}
@Test def forwardReference =
checkMessagesAfter("refchecks") {
"""
|object Forward {
| def block = {
| a.toInt
| val b = 2
| val a = BigDecimal("4")
| }
|}
""".stripMargin
}
.expect { (ictx, messages) =>
implicit val ctx: Context = ictx
val defn = ictx.definitions
assertMessageCount(1, messages)
val ForwardReferenceExtendsOverDefinition(value, definition) :: Nil = messages
assertEquals("value b", value.show)
assertEquals("value a", definition.show)
}
@Test def unexpectedToken =
checkMessagesAfter("frontend") {
"""
|object Forward {
| def val = "ds"
|}
""".stripMargin
}
.expect { (ictx, messages) =>
implicit val ctx: Context = ictx
val defn = ictx.definitions
assertMessageCount(1, messages)
val ExpectedTokenButFound(expected, found, foundName) :: Nil = messages
assertEquals(Tokens.IDENTIFIER, expected)
assertEquals(Tokens.VAL, found)
assertEquals("val", foundName.show)
}
@Test def expectedToken =
checkMessagesAfter("frontend") {
"""
|object Forward {
| def `val` = "ds"
|}
""".stripMargin
}
.expectNoErrors
}