-package sbttap
-
+import java.io.{PrintWriter, StringWriter, File, FileWriter}
import sbt._
import org.scalatools.testing.{Event => TEvent, Result => TResult}
-import Keys._
import java.util.concurrent.atomic.AtomicInteger
-import io.Source
-import java.io.{File, FileWriter, PrintWriter, StringWriter}
object SbtTapReporting extends Plugin {
- override def settings = Seq(
- testListeners ++= Seq(new SbtTapListener)
- )
+ def apply() = new SbtTapListener
}
/**
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 =>
case TResult.Success => writeTapFields("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.
+ // 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(), "#", "skip", e.testName())
+ writeTapFields("ok", testId.incrementAndGet(), e.testName(), "#", "skip", e.testName())
}
}
}
fileWriter.close()
}
- private def writeTapFields(s: Any*) { fileWriter.write(s.mkString("", " ", "\n")) }
-
- def endGroup(name: String, t: Throwable) { }
+ private def writeTapFields(s: Any*) {
+ fileWriter.write(s.mkString("", " ", "\n"))
+ fileWriter.flush()
+ }
- 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
+ }
}