diff options
Diffstat (limited to 'compiler')
3 files changed, 116 insertions, 1 deletions
diff --git a/compiler/test/dotty/tools/dotc/parsing/DocstringTest.scala b/compiler/test/dotty/tools/dotc/parsing/DocstringTest.scala index 30e885f70..a67b58cc6 100644 --- a/compiler/test/dotty/tools/dotc/parsing/DocstringTest.scala +++ b/compiler/test/dotty/tools/dotc/parsing/DocstringTest.scala @@ -27,7 +27,7 @@ trait DocstringTest extends DottyTest { def checkFrontend(source: String)(docAssert: PartialFunction[Tree[Untyped], Unit]) = { checkCompile("frontend", source) { (_, ctx) => - implicit val c = ctx + implicit val c: Context = ctx (docAssert orElse defaultAssertion)(ctx.compilationUnit.untpdTree) } } diff --git a/compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTest.scala b/compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTest.scala new file mode 100644 index 000000000..807e3a40a --- /dev/null +++ b/compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTest.scala @@ -0,0 +1,70 @@ +package dotty.tools +package dotc +package reporting + +import diagnostic._ +import core.Contexts.Context + +import scala.collection.mutable + +import org.junit.Assert._ + +trait ErrorMessagesTest extends DottyTest { + + class Report(messages: List[Message], ictx: Context) { + def expect(f: (Context, List[Message]) => Unit): Unit = { + f(ictx, messages) + } + + def expectNoErrors: Unit = this.isInstanceOf[FailedReport] + } + + class FailedReport extends Report(Nil, null) { + override def expect(f: (Context, List[Message]) => Unit) = + fail("""| + |Couldn't capture errors from compiled sources, this can happen if + |there are no errors or the compiler crashes.""".stripMargin) + } + + class CapturingReporter extends Reporter + with UniqueMessagePositions with HideNonSensicalMessages { + private[this] val buffer = new mutable.ListBuffer[Message] + private[this] var capturedContext: Context = _ + + def doReport(m: MessageContainer)(implicit ctx: Context) = { + capturedContext = ctx + buffer append m.contained + } + + def toReport: Report = + if (capturedContext eq null) + new FailedReport + else { + val xs = buffer.reverse.toList + buffer.clear() + + val ctx = capturedContext + capturedContext = null + + new Report(xs, ctx) + } + } + + ctx = freshReporter(ctx) + + private def freshReporter(ctx: Context) = + ctx.fresh.setReporter(new CapturingReporter) + + def checkMessages(source: String): Report = { + checkCompile("frontend", source) { (_,ictx) => () } + val rep = ctx.reporter.asInstanceOf[CapturingReporter].toReport + ctx = freshReporter(ctx) + rep + } + + def messageCount(expected: Int, messages: List[Message]): Unit = + assertEquals( + expected, + messages.length + ) +} diff --git a/compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTests.scala b/compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTests.scala new file mode 100644 index 000000000..eb7b944b1 --- /dev/null +++ b/compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTests.scala @@ -0,0 +1,45 @@ +package dotty.tools +package dotc +package reporting + +import core.Contexts.Context +import diagnostic.messages._ + +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 = + checkMessages("""class Foo""") + .expectNoErrors + + @Test def typeMismatch = + checkMessages { + """ + |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 + messageCount(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") + } +} |