X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fmain%2Fscala%2FSbtTapReporting.scala;h=20b1130bbeab5ff6e9bda4f6b418bcb4a2183217;hb=e630619482d67c7a1ac57d6e70b5219b7d11255d;hp=14b0576c2e742ff46d06f701ea44539537ec3105;hpb=9435e96901b26a2c52e40a3ea7a993634b746c8b;p=chaz%2Fsbt-tap diff --git a/src/main/scala/SbtTapReporting.scala b/src/main/scala/SbtTapReporting.scala index 14b0576..20b1130 100644 --- a/src/main/scala/SbtTapReporting.scala +++ b/src/main/scala/SbtTapReporting.scala @@ -20,47 +20,58 @@ class SbtTapListener extends TestsListener { var testId = new AtomicInteger(0) var fileWriter: FileWriter = _ - override def doInit { - new File("test-results").mkdirs() - - fileWriter = new FileWriter( - scala.util.Properties.envOrElse("SBT_TAP_OUTPUT", "test-results/test.tap") - ) + override def doInit = { + val filename = scala.util.Properties.envOrElse("SBT_TAP_OUTPUT", "test-results/test.tap") + val file = new File(filename) + new File(file.getParent).mkdirs + fileWriter = new FileWriter(file) + writeTap("TAP", "version", 13) } - def startGroup(name: String) {} + def startGroup(name: String) = + writeTapDiag("start", name) + + def endGroup(name: String, result: TestResult.Value) = + writeTapDiag("end", name, "with result", result.toString.toLowerCase) - def testEvent(event: TestEvent) { + def endGroup(name: String, t: Throwable) = { + writeTapDiag("end", name) + writeTapDiag(stackTraceForError(t)) + } + + def testEvent(event: TestEvent) = { event.detail.foreach { e: TEvent => + val description = e.testName.replaceAll("#", "%23") e.result match { - case TResult.Success => writeTapFields("ok", testId.incrementAndGet(), "-", e.testName()) - case TResult.Error | TResult.Failure => - writeTapFields("not ok", testId.incrementAndGet(), "-", e.testName()) - // 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.Success => + writeTap("ok", testId.incrementAndGet, "-", description) case TResult.Skipped => - // it doesn't look like this framework distinguishes between pending and ignored. - writeTapFields("ok", testId.incrementAndGet(), e.testName(), "#", "skip", e.testName()) + writeTap("ok", testId.incrementAndGet, "-", description, "# SKIP") + case TResult.Error | TResult.Failure => + writeTap("not ok", testId.incrementAndGet, "-", description) + // TODO: It would be nice if we could report the exact line in the test where this happened. + writeTapDiag(stackTraceForError(e.error)) } } } - override def doComplete(finalResult: TestResult.Value) { - writeTapFields("1.." + testId.get) - fileWriter.close() + override def doComplete(finalResult: TestResult.Value) = { + writeTap("1.." + testId.get) + fileWriter.close + } + + private def writeTap(s: Any*) = { + fileWriter.write(s.mkString("", " ", "\n")) + fileWriter.flush } - private def writeTapFields(s: Any*) { fileWriter.write(s.mkString("", " ", "\n")) } + private def writeTapDiag(s: Any*) = + writeTap("#", s.mkString("", " ", "\n").trim.replaceAll("\\n", "\n# ")) private def stackTraceForError(t: Throwable): String = { - val sw = new StringWriter() + val sw = new StringWriter val printWriter = new PrintWriter(sw) t.printStackTrace(printWriter) sw.toString } - def endGroup(name: String, t: Throwable) { } - - def endGroup(name: String, result: TestResult.Value) { } }