diff options
author | Felix Mulder <felix.mulder@gmail.com> | 2017-02-10 14:35:00 +0100 |
---|---|---|
committer | Felix Mulder <felix.mulder@gmail.com> | 2017-02-10 14:35:00 +0100 |
commit | 14bfa1ab9a7ce95e99f44449b56f52ec4b6439e0 (patch) | |
tree | 43a4e6eaa2f6609b08a1a55a4993244371f22d32 /compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTest.scala | |
parent | 75bea8dccce2bc3c0e8298ee71061c9871fd26ac (diff) | |
download | dotty-14bfa1ab9a7ce95e99f44449b56f52ec4b6439e0.tar.gz dotty-14bfa1ab9a7ce95e99f44449b56f52ec4b6439e0.tar.bz2 dotty-14bfa1ab9a7ce95e99f44449b56f52ec4b6439e0.zip |
Fix #1965: add proper testing infrastructure for reporting tests
Diffstat (limited to 'compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTest.scala')
-rw-r--r-- | compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTest.scala | 70 |
1 files changed, 70 insertions, 0 deletions
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 + ) +} |