diff options
author | Jesse Luehrs <doy@tozt.net> | 2013-02-23 16:09:06 -0600 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2013-02-23 16:15:11 -0600 |
commit | 073d5a06c07c85c0d1794c4a15d564e8463b31fc (patch) | |
tree | dfb53af9f24d8cec55f41ea7024de1060be07c36 /src/main | |
parent | 18854928e8697f733d2758d274151999bcc4a238 (diff) | |
download | scala-test-more-073d5a06c07c85c0d1794c4a15d564e8463b31fc.tar.gz scala-test-more-073d5a06c07c85c0d1794c4a15d564e8463b31fc.zip |
tests shouldn't produce anything other than tap
the harness can parse the tap to figure out whatever it needs from that
Diffstat (limited to 'src/main')
-rw-r--r-- | src/main/scala/org/perl8/test/Test.scala | 2 | ||||
-rw-r--r-- | src/main/scala/org/perl8/test/TestMore.scala | 12 | ||||
-rw-r--r-- | src/main/scala/org/perl8/test/Utils.scala | 7 | ||||
-rw-r--r-- | src/main/scala/org/perl8/test/harness/SummaryReporter.scala | 34 | ||||
-rw-r--r-- | src/main/scala/org/perl8/test/harness/TAPReporter.scala | 20 | ||||
-rw-r--r-- | src/main/scala/org/perl8/test/sbt/SBTReporter.scala | 10 | ||||
-rw-r--r-- | src/main/scala/org/perl8/test/tap/Consumer.scala | 27 | ||||
-rw-r--r-- | src/main/scala/org/perl8/test/tap/TestBuilder.scala | 7 |
8 files changed, 72 insertions, 47 deletions
diff --git a/src/main/scala/org/perl8/test/Test.scala b/src/main/scala/org/perl8/test/Test.scala index 93933dd..cc79df8 100644 --- a/src/main/scala/org/perl8/test/Test.scala +++ b/src/main/scala/org/perl8/test/Test.scala @@ -6,5 +6,5 @@ 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 (): Unit } diff --git a/src/main/scala/org/perl8/test/TestMore.scala b/src/main/scala/org/perl8/test/TestMore.scala index 487b023..2253d31 100644 --- a/src/main/scala/org/perl8/test/TestMore.scala +++ b/src/main/scala/org/perl8/test/TestMore.scala @@ -16,22 +16,13 @@ class TestMore (plan: Option[Plan] = None) extends Test with DelayedInit { testBody = () => body } - def run (): Int = { + def run () { if (testBody == null) { delayedInit { } } testBody() builder.doneTesting - if (builder.isPassing) { - 0 - } - else if (builder.failedTests == 0) { - 255 - } - else { - builder.failedTests - } } def ok (cond: Boolean, desc: Message = NoMessage): Boolean = { @@ -125,7 +116,6 @@ class TestMore (plan: Option[Plan] = None) extends Test with DelayedInit { ) body builder.doneTesting - builder.isPassing } finally { builder = oldBuilder diff --git a/src/main/scala/org/perl8/test/Utils.scala b/src/main/scala/org/perl8/test/Utils.scala index 5135688..31a66b1 100644 --- a/src/main/scala/org/perl8/test/Utils.scala +++ b/src/main/scala/org/perl8/test/Utils.scala @@ -10,13 +10,10 @@ object Utils { } case class NumericPlan ( - override val plan: Int, - override val message: Option[String] = None + override val plan: Int ) extends Plan { override val skipAll = false - - def this (plan: Int, message: String) = - this(plan, Some(message)) + override val message = None } case class SkipAll ( diff --git a/src/main/scala/org/perl8/test/harness/SummaryReporter.scala b/src/main/scala/org/perl8/test/harness/SummaryReporter.scala index 23e5244..460059a 100644 --- a/src/main/scala/org/perl8/test/harness/SummaryReporter.scala +++ b/src/main/scala/org/perl8/test/harness/SummaryReporter.scala @@ -10,12 +10,12 @@ import Utils._ class SummaryReporter extends MultiTestReporter { def run (testNames: Seq[String]): Int = { val results = runTests(testNames) - val success = results.values.map(_._1).forall(_ == 0) + val success = results.values.forall(_.success) printTestSummary(success, results) if (success) 0 else 1 } - def runTests (testNames: Seq[String]): Map[String, (Int, TAPResult)] = { + def runTests (testNames: Seq[String]): Map[String, TAPResult] = { val maxLength = testNames.map(_.length).max testNames.map { name => @@ -23,12 +23,12 @@ class SummaryReporter extends MultiTestReporter { val out = new ByteArrayOutputStream val test = newInstance[Test](name) - val exitCode = Console.withOut(out) { + Console.withOut(out) { test.run } val result = tap.Consumer.parse(out) - if (exitCode == 0) { + if (result.success) { println("ok") } else { @@ -37,17 +37,17 @@ class SummaryReporter extends MultiTestReporter { !t.passed && !t.directive.isDefined } - println("Dubious, test returned " + exitCode) + println("Dubious, test returned " + result.exitCode) println("Failed " + failed + "/" + results + " subtests") } - name -> (exitCode, result) + name -> result }.toMap } def printTestSummary ( success: Boolean, - results: Map[String, (Int, TAPResult)] + results: Map[String, TAPResult] ) { printSuccess(success) printShortSummary(results) @@ -61,16 +61,14 @@ class SummaryReporter extends MultiTestReporter { } } - private def printShortSummary (results: Map[String, (Int, TAPResult)]) { + private def printShortSummary (results: Map[String, TAPResult]) { val files = results.size - val tests = results.values.map(_._2.results.length).sum + val tests = results.values.map(_.results.length).sum println("Files=" + files + ", Tests=" + tests) } - private def printLongSummary (results: Map[String, (Int, TAPResult)]) { - val resultMap = results.map { case (s, r) => s -> r._2 } - - val todoSucceeded = resultMap.mapValues { r => + private def printLongSummary (results: Map[String, TAPResult]) { + val todoSucceeded = results.mapValues { r => r.results.filter { t => t.directive match { case Some(TodoDirective(_)) => t.passed @@ -79,7 +77,7 @@ class SummaryReporter extends MultiTestReporter { } }.filter(_._2.length > 0) - val testsFailed = resultMap.mapValues { r => + val testsFailed = results.mapValues { r => r.results.filter { t => t.directive match { case None => !t.passed @@ -98,7 +96,7 @@ class SummaryReporter extends MultiTestReporter { val maxLength = testNames.map(_.length).max for (name <- testNames) { - val result = resultMap(name) + val result = results(name) println( name + (" " * (maxLength - name.length)) + " " + @@ -122,7 +120,7 @@ class SummaryReporter extends MultiTestReporter { ) } - val exitCode = results(name)._1 + val exitCode = results(name).exitCode if (exitCode != 0) { println(" Non-zero exit status: " + exitCode) } @@ -132,7 +130,7 @@ class SummaryReporter extends MultiTestReporter { private def printPassFail ( success: Boolean, - results: Map[String, (Int, TAPResult)] + results: Map[String, TAPResult] ) { if (success) { println("Result: PASS") @@ -140,7 +138,7 @@ class SummaryReporter extends MultiTestReporter { else { println("Result: FAIL") - val testResults = results.values.map(_._2) + val testResults = results.values val testsFailed = testResults.map { r => r.results.count { t => diff --git a/src/main/scala/org/perl8/test/harness/TAPReporter.scala b/src/main/scala/org/perl8/test/harness/TAPReporter.scala index e478880..574dd39 100644 --- a/src/main/scala/org/perl8/test/harness/TAPReporter.scala +++ b/src/main/scala/org/perl8/test/harness/TAPReporter.scala @@ -1,9 +1,25 @@ package org.perl8.test.harness +import java.io.ByteArrayOutputStream + +import org.perl8.test.tap import org.perl8.test.Test import Utils._ class TAPReporter extends Reporter { - def run (testName: String): Int = - newInstance[Test](testName).run + def run (testName: String): Int = { + val out = new ByteArrayOutputStream + Console.withOut(out) { + Console.withErr(out) { + newInstance[Test](testName).run + } + } + + // XXX this is wrong: it sends everything to stdout + // need to write a tee-like outputstream to fix it + print(out) + + val result = tap.Consumer.parse(out) + result.exitCode + } } diff --git a/src/main/scala/org/perl8/test/sbt/SBTReporter.scala b/src/main/scala/org/perl8/test/sbt/SBTReporter.scala index 6307f55..2f47af2 100644 --- a/src/main/scala/org/perl8/test/sbt/SBTReporter.scala +++ b/src/main/scala/org/perl8/test/sbt/SBTReporter.scala @@ -41,14 +41,14 @@ class SBTReporter ( eventHandler.handle(event) } - if (result.results.exists { r => !r.passed && !r.directive.isDefined }) { - logError(testName + " failed.") - 1 - } - else { + if (result.success) { logInfo(testName + " succeeded.") 0 } + else { + logError(testName + " failed.") + 1 + } } private def logDebug (msg: String) { diff --git a/src/main/scala/org/perl8/test/tap/Consumer.scala b/src/main/scala/org/perl8/test/tap/Consumer.scala index 7a0f7aa..2c542f1 100644 --- a/src/main/scala/org/perl8/test/tap/Consumer.scala +++ b/src/main/scala/org/perl8/test/tap/Consumer.scala @@ -135,7 +135,32 @@ case class TestResult ( val subtest: Option[TAPResult] ) -class TAPResult (val plan: Plan, val results: Seq[TestResult]) +class TAPResult (val plan: Plan, val results: Seq[TestResult]) { + val correctPlan = plan match { + case NumericPlan(n) => results.length == n + case SkipAll(_) => results.length == 0 + } + + val fails = results.count { r => + !r.passed && !r.directive.isDefined + } + + val testsPassed = fails == 0 + + val success = + correctPlan && testsPassed + + val exitCode = + if (success) { + 0 + } + else if (!correctPlan) { + 255 + } + else { + fails + } +} case class ParseException ( val message: String diff --git a/src/main/scala/org/perl8/test/tap/TestBuilder.scala b/src/main/scala/org/perl8/test/tap/TestBuilder.scala index 203080c..b1d8579 100644 --- a/src/main/scala/org/perl8/test/tap/TestBuilder.scala +++ b/src/main/scala/org/perl8/test/tap/TestBuilder.scala @@ -51,13 +51,13 @@ class TestBuilder ( throw new BailOutException(message.getOrElse("")) } - def doneTesting () { + def doneTesting (): Boolean = { plan match { case None => outLine(Producer.plan(state.currentTest - 1)) case _ => () } - if (!isPassing) { + if (!state.isPassing) { if (!state.matchesPlan) { val planCount = (plan match { case Some(p) => p.plan @@ -80,10 +80,9 @@ class TestBuilder ( diag("Looks like you failed " + fails + " of " + total + ".") } } - } - def isPassing: Boolean = state.isPassing + } def failedTests: Int = state.failCount |