aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/scala/com/iinteractive/test/sbt/SBTReporter.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/com/iinteractive/test/sbt/SBTReporter.scala')
-rw-r--r--src/main/scala/com/iinteractive/test/sbt/SBTReporter.scala99
1 files changed, 99 insertions, 0 deletions
diff --git a/src/main/scala/com/iinteractive/test/sbt/SBTReporter.scala b/src/main/scala/com/iinteractive/test/sbt/SBTReporter.scala
new file mode 100644
index 0000000..34df60d
--- /dev/null
+++ b/src/main/scala/com/iinteractive/test/sbt/SBTReporter.scala
@@ -0,0 +1,99 @@
+package com.iinteractive.test.sbt
+
+import org.scalatools.testing
+
+import com.iinteractive.test.harness.{Reporter,SummarizedTests}
+import com.iinteractive.test.tap.{TAPEvent,ResultEvent,EndEvent}
+import com.iinteractive.test.Test
+
+/** Runs a single test under the SBT test harness. */
+class SBTReporter (
+ loader: ClassLoader,
+ loggers: Array[testing.Logger],
+ eventHandler: testing.EventHandler
+) extends Reporter with SummarizedTests {
+ def run (testName: String): Int = {
+ val cb = (e: TAPEvent) => e match {
+ case ResultEvent(r) => {
+ val event = new testing.Event {
+ val testName: String = r.description
+ val description: String = r.description
+ val result: testing.Result =
+ if (r.passed) {
+ testing.Result.Success
+ }
+ else if (r.directive.isDefined) {
+ testing.Result.Skipped
+ }
+ else {
+ testing.Result.Failure
+ }
+ val error: Throwable = null
+ }
+ eventHandler.handle(event)
+ }
+ case EndEvent(result) => {
+ val testsPassed = result.success
+ val correctCode = result.exitCode == 0
+ val event = new testing.Event {
+ val testName: String = "exit code is 0"
+ val description: String = "exit code is 0"
+ val result: testing.Result =
+ if (correctCode) {
+ testing.Result.Success
+ }
+ else {
+ testing.Result.Failure
+ }
+ val error: Throwable = null
+ }
+ eventHandler.handle(event)
+
+ if (testsPassed && correctCode) {
+ logInfo("PASS " + testName)
+ }
+ else {
+ val results = result.results.length
+ val failed = result.results.count { t =>
+ !t.passed && !t.directive.isDefined
+ }
+
+ val errors = Seq(
+ (if (testsPassed)
+ None
+ else
+ Some("failed " + failed + "/" + results)),
+ (if (correctCode)
+ None
+ else
+ Some("non-zero exit code: " + result.exitCode))
+ ).flatten.mkString("(", ", ", ")")
+
+ logError("FAIL " + testName + " " + errors)
+ }
+ }
+ case _ => ()
+ }
+
+ runOneTest(
+ loader.loadClass(testName).newInstance.asInstanceOf[Test],
+ cb
+ ).exitCode
+ }
+
+ private def logDebug (msg: String) {
+ loggers.foreach(_.debug(msg))
+ }
+
+ private def logInfo (msg: String) {
+ loggers.foreach(_.info(msg))
+ }
+
+ private def logWarn (msg: String) {
+ loggers.foreach(_.warn(msg))
+ }
+
+ private def logError (msg: String) {
+ loggers.foreach(_.error(msg))
+ }
+}