]> Dogcows Code - chaz/sbt-tap/blobdiff - src/main/scala/SbtTapReporting.scala
output start/end group as tap diagnostics
[chaz/sbt-tap] / src / main / scala / SbtTapReporting.scala
index 45510ac640ab887139f7d1c9b8f8919a648e4995..097157a520359f862faee08c7ba748c7597908b4 100644 (file)
@@ -5,7 +5,7 @@ import org.scalatools.testing.{Event => TEvent, Result => TResult}
 import java.util.concurrent.atomic.AtomicInteger
 
 object SbtTapReporting extends Plugin {
-  lazy val tapListener = new SbtTapListener
+  def apply() = new SbtTapListener
 }
 
 /**
@@ -23,10 +23,22 @@ class SbtTapListener extends TestsListener {
   override def doInit {
     new File("test-results").mkdirs()
 
-    fileWriter = new FileWriter("test-results/test.tap")
+    fileWriter = new FileWriter(
+      scala.util.Properties.envOrElse("SBT_TAP_OUTPUT", "test-results/test.tap")
+    )
   }
 
-  def startGroup(name: String) {}
+  def startGroup(name: String) {
+    writeTapFields("#", "start", name)
+  }
+
+  def endGroup(name: String, result: TestResult.Value) {
+    writeTapFields("#", "end", name, "with result", result.toString.toLowerCase)
+  }
+
+  def endGroup(name: String, t: Throwable) {
+    writeTapFields("#", "end", name)
+  }
 
   def testEvent(event: TestEvent) {
     event.detail.foreach { e: TEvent =>
@@ -34,10 +46,13 @@ class SbtTapListener extends TestsListener {
         case TResult.Success => writeTapFields("ok", testId.incrementAndGet(), "-", e.testName())
         case TResult.Error | TResult.Failure =>
           writeTapFields("not ok", testId.incrementAndGet(), "-", e.testName())
-          writeTapFields(stackTraceForError(e.error()))
+          // According to the TAP spec, as long as there is any kind of whitespace, this output should belong to the
+          // the test that failed and it should get displayed in the UI.
+          // TODO:It would be nice if we could report the exact line in the test where this happened.
+          writeTapFields(" ", stackTraceForError(e.error()))
         case TResult.Skipped =>
           // it doesn't look like this framework distinguishes between pending and ignored.
-          writeTapFields("ok", testId.incrementAndGet(), e.testName(), "#", "skip")
+          writeTapFields("ok", testId.incrementAndGet(), e.testName(), "#", "skip", e.testName())
       }
     }
   }
@@ -47,7 +62,10 @@ class SbtTapListener extends TestsListener {
     fileWriter.close()
   }
 
-  private def writeTapFields(s: Any*) { fileWriter.write(s.mkString("",  " ", "\n")) }
+  private def writeTapFields(s: Any*) {
+    fileWriter.write(s.mkString("",  " ", "\n"))
+    fileWriter.flush()
+  }
 
   private def stackTraceForError(t: Throwable): String = {
     val sw = new StringWriter()
@@ -55,7 +73,4 @@ class SbtTapListener extends TestsListener {
     t.printStackTrace(printWriter)
     sw.toString
   }
-  def endGroup(name: String, t: Throwable) { }
-
-  def endGroup(name: String, result: TestResult.Value) { }
 }
This page took 0.02148 seconds and 4 git commands to generate.