X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fmain%2Fscala%2FSbtTapReporting.scala;h=531a86b463b9af88ba0650108a2779788268a96e;hb=acb04aafc7e5c5aef6ecc460721b134441d1f9bc;hp=c6e0068738448572f84d65eb177139faf199e7ab;hpb=48588653b0b55b976ef0a0d08ce731685ebc0310;p=chaz%2Fsbt-tap diff --git a/src/main/scala/SbtTapReporting.scala b/src/main/scala/SbtTapReporting.scala index c6e0068..531a86b 100644 --- a/src/main/scala/SbtTapReporting.scala +++ b/src/main/scala/SbtTapReporting.scala @@ -1,11 +1,11 @@ +import java.io.{PrintWriter, StringWriter, File, FileWriter} import sbt._ import org.scalatools.testing.{Event => TEvent, Result => TResult} import java.util.concurrent.atomic.AtomicInteger -import java.io.{File, FileWriter} object SbtTapReporting extends Plugin { - lazy val tapListener = new SbtTapListener + def apply() = new SbtTapListener } /** @@ -20,36 +20,57 @@ class SbtTapListener extends TestsListener { var testId = new AtomicInteger(0) var fileWriter: FileWriter = _ - override def doInit { - new File("test-results").mkdirs() + 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) = + writeTapDiag("start", name) - def testEvent(event: TestEvent) { + def endGroup(name: String, result: TestResult.Value) = + writeTapDiag("end", name, "with result", result.toString.toLowerCase) + + def endGroup(name: String, t: Throwable) = { + writeTapDiag("end", name) + writeTapDiag(stackTraceForError(t)) + } + + def testEvent(event: TestEvent) = { event.detail.foreach { e: TEvent => e.result match { - case TResult.Success => writeTapFields("ok", testId.incrementAndGet(), "-", e.testName()) + case TResult.Success => writeTap("ok", testId.incrementAndGet, "-", e.testName) case TResult.Error | TResult.Failure => - writeTapFields("not ok", testId.incrementAndGet(), "-", e.testName()) - // TODO: for exceptions, write stack trace to tap file. + writeTap("not ok", testId.incrementAndGet, "-", e.testName) + // TODO: It would be nice if we could report the exact line in the test where this happened. + writeTapDiag(stackTraceForError(e.error)) case TResult.Skipped => // it doesn't look like this framework distinguishes between pending and ignored. - writeTapFields("ok", testId.incrementAndGet(), "#", "skip", e.testName()) + writeTap("ok", testId.incrementAndGet, e.testName, "#", "skip", e.testName) } } } - 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")) } + private def writeTap(s: Any*) = { + fileWriter.write(s.mkString("", " ", "\n")) + fileWriter.flush + } - def endGroup(name: String, t: Throwable) { } + private def writeTapDiag(s: Any*) = + writeTap("#", s.mkString("", " ", "\n").trim.replaceAll("\\n", "\n# ")) - def endGroup(name: String, result: TestResult.Value) { } + private def stackTraceForError(t: Throwable): String = { + val sw = new StringWriter + val printWriter = new PrintWriter(sw) + t.printStackTrace(printWriter) + sw.toString + } }