From 90ca99b744e638b569d8a6bba2cc076c9a419cd2 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Wed, 27 Feb 2013 19:19:13 -0600 Subject: add a leading newline to diags when running under a non-raw reporter makes things easier to read this way, when diags are printed to stderr interspersed with test summary information --- src/main/scala/org/perl8/test/ExternalTest.scala | 2 +- src/main/scala/org/perl8/test/Test.scala | 8 ++- src/main/scala/org/perl8/test/TestMore.scala | 74 +++++++++++++++------- .../scala/org/perl8/test/harness/TAPReporter.scala | 2 +- .../scala/org/perl8/test/tap/TestBuilder.scala | 17 +++-- src/test/scala/org/perl8/test/ExtensionTest.scala | 2 +- src/test/scala/org/perl8/test/TestMoreTest.scala | 2 +- 7 files changed, 72 insertions(+), 35 deletions(-) diff --git a/src/main/scala/org/perl8/test/ExternalTest.scala b/src/main/scala/org/perl8/test/ExternalTest.scala index 73016e4..89d7bbc 100644 --- a/src/main/scala/org/perl8/test/ExternalTest.scala +++ b/src/main/scala/org/perl8/test/ExternalTest.scala @@ -8,7 +8,7 @@ import scala.concurrent.Future._ import scala.annotation.tailrec class ExternalTest (cmdLine: String*) extends Test { - def run: Int = { + def runTests (raw: Boolean): Int = { val processBuilder = new ProcessBuilder(cmdLine: _*) // Ensure that if stdout and stderr are both pointing to the same place (a diff --git a/src/main/scala/org/perl8/test/Test.scala b/src/main/scala/org/perl8/test/Test.scala index a348871..9868174 100644 --- a/src/main/scala/org/perl8/test/Test.scala +++ b/src/main/scala/org/perl8/test/Test.scala @@ -6,5 +6,11 @@ trait Test { /** Runs the test. The TAP stream will be written to Console.out and * Console.err, so you can swap these out as required in order to parse it. */ - def run: Int + def run: Int = + runTests(false) + + def runRaw: Int = + runTests(true) + + protected def runTests (raw: Boolean): Int } diff --git a/src/main/scala/org/perl8/test/TestMore.scala b/src/main/scala/org/perl8/test/TestMore.scala index 3872a86..3cb0cfa 100644 --- a/src/main/scala/org/perl8/test/TestMore.scala +++ b/src/main/scala/org/perl8/test/TestMore.scala @@ -9,23 +9,25 @@ class TestMore (plan: Option[Plan] = None) extends Test with DelayedInit { this(Some(plan)) def delayedInit (body: => Unit) { - todo = NoMessage - builder = new TestBuilder(plan, "") - testBody = () => body + testBody = { raw => + todo = NoMessage + builder = new TestBuilder(plan, "", raw) + body + } } - def run: Int = { + def runTests (raw: Boolean): Int = { if (testBody == null) { delayedInit { } } - testBody() + testBody(raw) builder.doneTesting builder.exitCode } def ok (cond: Boolean, desc: Message = NoMessage): Boolean = { - builder.ok(cond, desc.map(d => "- " + d), todo) + builderOk(cond, desc) if (!cond) { failed(desc) } @@ -33,37 +35,49 @@ class TestMore (plan: Option[Plan] = None) extends Test with DelayedInit { } def is[T] (got: T, expected: T, desc: Message = NoMessage): Boolean = { - val cond = ok(got == expected, desc) + val cond = got == expected + builderOk(cond, desc) if (!cond) { - builder.diag(" got: '" + got + "'") - builder.diag(" expected: '" + expected + "'") + val reason = + " got: '" + got + "'\n" + + " expected: '" + expected + "'\n" + failed(desc, reason) } cond } def isnt[T] (got: T, expected: T, desc: Message = NoMessage): Boolean = { - val cond = ok(got != expected, desc) + val cond = got != expected + builderOk(cond, desc) if (!cond) { - builder.diag(" got: '" + got + "'") - builder.diag(" expected: anything else") + val reason = + " got: '" + got + "'\n" + + " expected: anything else\n" + failed(desc, reason) } cond } def like (got: String, rx: Regex, desc: Message = NoMessage): Boolean = { - val cond = ok(rx.findFirstIn(got).nonEmpty, desc) + val cond = rx.findFirstIn(got).nonEmpty + builderOk(cond, desc) if (!cond) { - builder.diag(" '" + got + "'") - builder.diag(" doesn't match '" + rx + "'") + val reason = + " '" + got + "'\n" + + " doesn't match '" + rx + "'\n" + failed(desc, reason) } cond } def unlike (got: String, rx: Regex, desc: Message = NoMessage): Boolean = { - val cond = ok(rx.findFirstIn(got).isEmpty, desc) + val cond = rx.findFirstIn(got).isEmpty + builderOk(cond, desc) if (!cond) { - builder.diag(" '" + got + "'") - builder.diag(" matches '" + rx + "'") + val reason = + " '" + got + "'\n" + + " matches '" + rx + "'\n" + failed(desc, reason) } cond } @@ -108,7 +122,11 @@ class TestMore (plan: Option[Plan] = None) extends Test with DelayedInit { )(body: => Unit): Boolean = { val oldBuilder = builder val success = try { - builder = new TestBuilder(plan, oldBuilder.indent + " ") + builder = new TestBuilder( + plan, + oldBuilder.indent + " ", + oldBuilder.raw + ) body builder.doneTesting } @@ -135,7 +153,15 @@ class TestMore (plan: Option[Plan] = None) extends Test with DelayedInit { """\$class$""".r.findFirstIn(className).nonEmpty } - private def failed (desc: Message) { + private def builderOk (cond: Boolean, desc: Message) { + builder.ok(cond, desc.map(d => "- " + d), todo) + } + + private def failed (desc: Message, reason: String) { + failed(desc, Some(reason)) + } + + private def failed (desc: Message, reason: Option[String] = None) { val stack = Thread.currentThread.getStackTrace.drop(1).filter { frame => !ignoreFrame(frame) } @@ -162,7 +188,7 @@ class TestMore (plan: Option[Plan] = None) extends Test with DelayedInit { case NoMessage => " " }) val trace = "at " + file + " line " + line + "." - builder.diag(message + trace) + builder.diag(message + trace + reason.map("\n" + _).getOrElse("")) } // this just adds a method call with a known name to the stack trace, so @@ -171,7 +197,7 @@ class TestMore (plan: Option[Plan] = None) extends Test with DelayedInit { body } - private var todo: Message = _ - private var builder: TestBuilder = _ - private var testBody: () => Unit = _ + private var todo: Message = _ + private var builder: TestBuilder = _ + private var testBody: Boolean => Unit = _ } diff --git a/src/main/scala/org/perl8/test/harness/TAPReporter.scala b/src/main/scala/org/perl8/test/harness/TAPReporter.scala index d6f27fd..340c0db 100644 --- a/src/main/scala/org/perl8/test/harness/TAPReporter.scala +++ b/src/main/scala/org/perl8/test/harness/TAPReporter.scala @@ -7,5 +7,5 @@ import org.perl8.test.Test class TAPReporter extends Reporter { def run (testName: String): Int = - newInstance[Test](testName).run + newInstance[Test](testName).runRaw } diff --git a/src/main/scala/org/perl8/test/tap/TestBuilder.scala b/src/main/scala/org/perl8/test/tap/TestBuilder.scala index 39b38c9..9f7e874 100644 --- a/src/main/scala/org/perl8/test/tap/TestBuilder.scala +++ b/src/main/scala/org/perl8/test/tap/TestBuilder.scala @@ -2,14 +2,14 @@ package org.perl8.test.tap import org.perl8.test._ -class TestBuilder (plan: Option[Plan], val indent: String) { +class TestBuilder (plan: Option[Plan], val indent: String, val raw: Boolean) { plan.foreach(p => outLine(Producer.plan(p))) - def this (plan: Plan, indent: String = "") = - this(Some(plan), indent) + def this (plan: Plan, indent: String = "", raw: Boolean = true) = + this(Some(plan), indent, raw) - def this (indent: String = "") = - this(None, indent) + def this (indent: String = "", raw: Boolean = true) = + this(None, indent, raw) def ok ( test: Boolean, @@ -28,7 +28,12 @@ class TestBuilder (plan: Option[Plan], val indent: String) { } def diag (message: Message) { - message.foreach(m => errLine(Producer.comment(m))) + message.foreach { m => + if (!raw) { + Console.err.print("\n") + } + errLine(Producer.comment(m)) + } } def note (message: Message) { diff --git a/src/test/scala/org/perl8/test/ExtensionTest.scala b/src/test/scala/org/perl8/test/ExtensionTest.scala index f5635c4..0d14d7a 100644 --- a/src/test/scala/org/perl8/test/ExtensionTest.scala +++ b/src/test/scala/org/perl8/test/ExtensionTest.scala @@ -30,7 +30,7 @@ class ExtensionTest extends TestMore { val out = new ByteArrayOutputStream Console.withOut(out) { Console.withErr(out) { - (new ExtensionTestTest).run + (new ExtensionTestTest).runRaw } } diff --git a/src/test/scala/org/perl8/test/TestMoreTest.scala b/src/test/scala/org/perl8/test/TestMoreTest.scala index b1af5da..5e5156d 100644 --- a/src/test/scala/org/perl8/test/TestMoreTest.scala +++ b/src/test/scala/org/perl8/test/TestMoreTest.scala @@ -60,7 +60,7 @@ class TestMoreTest extends TestMore { val out = new ByteArrayOutputStream Console.withOut(out) { Console.withErr(out) { - (new MyBasicTest).run + (new MyBasicTest).runRaw } } -- cgit v1.2.3-54-g00ecf