X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fmain%2Fscala%2FSbtTapReporting.scala;h=097157a520359f862faee08c7ba748c7597908b4;hb=e40c84ca5cab8fe4a1ead6f26c6193ceb2de8e0d;hp=45510ac640ab887139f7d1c9b8f8919a648e4995;hpb=37a33da19bc4034f15db3d9468f74293902647ca;p=chaz%2Fsbt-tap diff --git a/src/main/scala/SbtTapReporting.scala b/src/main/scala/SbtTapReporting.scala index 45510ac..097157a 100644 --- a/src/main/scala/SbtTapReporting.scala +++ b/src/main/scala/SbtTapReporting.scala @@ -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) { } }