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