aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/scala/com/iinteractive/test/harness/SummarizedTests.scala
blob: df204729239377dd01e79e130b73362bbb18186c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package com.iinteractive.test.harness

import java.io.{PipedInputStream,PipedOutputStream}
import scala.concurrent.Await
import scala.concurrent.duration.Duration
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future

import com.iinteractive.test.tap.{Parser,TAPEvent,TAPResult,TodoDirective}
import com.iinteractive.test.Test

/** This is a trait for classes that run tests and summarize the results. It
  * provides a single `runOneTest` method, which runs a test class and
  * produces a stream of [[com.iinteractive.test.tap.TAPEvent TAP events]]
  * which can be used to produce whatever summarized output you need.
  */
trait SummarizedTests {
  /** Runs a single [[com.iinteractive.test.Test test]] instance, calling `cb`
    * with each [[com.iinteractive.test.tap.TAPEvent TAP event]] as it is
    * produced.
    *
    * @return The overall result of the test instance.
    */
  protected def runOneTest (
    test:    Test,
    cb:      TAPEvent => Unit,
    combine: Boolean = false
  ): TAPResult = {
    val out = new PipedOutputStream
    val in  = new PipedInputStream(out)
    val err = if (combine) out else Console.err

    val testFuture = Future {
      Console.withOut(out) {
        Console.withErr(err) {
          if (combine) {
            test.run
          }
          else {
            test.runInHarness
          }
        }
      }
      out.close
    }

    val parser = new Parser(cb)
    val result = parser.parse(in)
    in.close
    Await.ready(testFuture, Duration.Inf)

    result
  }
}