X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fmain%2Fscala%2FSbtTapReporting.scala;h=20b1130bbeab5ff6e9bda4f6b418bcb4a2183217;hb=e630619482d67c7a1ac57d6e70b5219b7d11255d;hp=097157a520359f862faee08c7ba748c7597908b4;hpb=e40c84ca5cab8fe4a1ead6f26c6193ceb2de8e0d;p=chaz%2Fsbt-tap diff --git a/src/main/scala/SbtTapReporting.scala b/src/main/scala/SbtTapReporting.scala index 097157a..20b1130 100644 --- a/src/main/scala/SbtTapReporting.scala +++ b/src/main/scala/SbtTapReporting.scala @@ -20,55 +20,56 @@ 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) { - writeTapFields("#", "start", name) - } + def startGroup(name: String) = + writeTapDiag("start", name) - def endGroup(name: String, result: TestResult.Value) { - writeTapFields("#", "end", name, "with result", result.toString.toLowerCase) - } + def endGroup(name: String, result: TestResult.Value) = + writeTapDiag("end", name, "with result", result.toString.toLowerCase) - def endGroup(name: String, t: Throwable) { - writeTapFields("#", "end", name) + def endGroup(name: String, t: Throwable) = { + writeTapDiag("end", name) + writeTapDiag(stackTraceForError(t)) } - def testEvent(event: TestEvent) { + 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 writeTapFields(s: Any*) { - fileWriter.write(s.mkString("", " ", "\n")) - fileWriter.flush() + private def writeTap(s: Any*) = { + fileWriter.write(s.mkString("", " ", "\n")) + fileWriter.flush } + 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