]> Dogcows Code - chaz/sbt-tap/blob - src/main/scala/SbtTapReporting.scala
50035afa33babf70a5a9422fd323e497fbb79d9e
[chaz/sbt-tap] / src / main / scala / SbtTapReporting.scala
1 package sbttap
2
3 import sbt._
4 import org.scalatools.testing.{Event => TEvent, Result => TResult}
5
6 import Keys._
7 import java.util.concurrent.atomic.AtomicInteger
8 import io.Source
9 import java.io.{File, FileWriter, PrintWriter, StringWriter}
10
11 object SbtTapReporting extends Plugin {
12 override def settings = Seq(
13 testListeners ++= Seq(new SbtTapListener)
14 )
15 }
16
17 /**
18 * Listens to sbt test listener events and writes them to a tap compatible file. Results for all groups
19 * go to a single file although it might be desirable to generate one tap file per group.
20 * <p>
21 * sbt runs tests in parallel and the protocol does not seem to provide a way to match a group to a test event. It
22 * does look line one thread calls startGroup/testEvent/endGroup sequentially and using thread local to keep
23 * the current active group might be one way to go.
24 */
25 class SbtTapListener extends TestsListener {
26 var testId = new AtomicInteger(0)
27 var fileWriter: FileWriter = _
28
29 override def doInit {
30 new File("test-results").mkdirs()
31
32 fileWriter = new FileWriter("test-results/test.tap")
33 }
34
35 def startGroup(name: String) {}
36
37 def testEvent(event: TestEvent) {
38 event.detail.foreach { e: TEvent =>
39 e.result match {
40 case TResult.Success => writeTapFields("ok", testId.incrementAndGet(), "-", e.testName())
41 case TResult.Error | TResult.Failure =>
42 writeTapFields("not ok", testId.incrementAndGet(), "-", e.testName())
43 // TODO: for exceptions, write stack trace to tap file.
44 case TResult.Skipped =>
45 // it doesn't look like this framework distinguishes between pending and ignored.
46 writeTapFields("ok", testId.incrementAndGet(), "#", "skip", e.testName())
47 }
48 }
49 }
50
51 override def doComplete(finalResult: TestResult.Value) {
52 writeTapFields("1.." + testId.get)
53 fileWriter.close()
54 }
55
56 private def writeTapFields(s: Any*) { fileWriter.write(s.mkString("", " ", "\n")) }
57
58 def endGroup(name: String, t: Throwable) { }
59
60 def endGroup(name: String, result: TestResult.Value) { }
61 }
This page took 0.034264 seconds and 3 git commands to generate.