forked from skipoleschris/xsbt-cucumber-plugin
/
CucumberFramework.scala
67 lines (54 loc) · 2.18 KB
/
CucumberFramework.scala
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
55
56
57
58
59
60
61
62
63
64
65
66
67
package templemore.sbt.cucumber
import org.scalatools.testing._
import java.util.Properties
/**
* Framework implementation that allows cucumber to be run as part of sbt's
* standard 'test' phase.
*
* @author Chris Turner
*/
class CucumberFramework extends Framework {
val name = "cucumber"
val tests = Array[Fingerprint](CucumberRunOnceFingerprint)
def testRunner(testClassLoader: ClassLoader, loggers: Array[Logger]) = {
loggers foreach (_.debug("Creating a new Cucumber test runner"))
new CucumberRunner(testClassLoader, loggers)
}
}
class CucumberRunner(testClassLoader: ClassLoader, loggers: Array[Logger]) extends Runner2 {
private val cucumber = new ReflectingCucumberLauncher(debug = logDebug, error = logError)
def run(testClassName: String, fingerprint: Fingerprint, eventHandler: EventHandler, args: Array[String]) = try {
val arguments = Array("--glue", "", "--format", "pretty", "classpath:")
cucumber(arguments, testClassLoader) match {
case 0 =>
logDebug("Cucumber tests completed successfully")
eventHandler.handle(SuccessEvent(testClassName))
case _ =>
logDebug("Failure while running Cucumber tests")
eventHandler.handle(FailureEvent(testClassName))
}
} catch {
case e => eventHandler.handle(ErrorEvent(testClassName, e))
}
private def logError(message: String) = loggers foreach (_ error message)
private def logDebug(message: String) = loggers foreach (_ debug message)
case class SuccessEvent(testName: String) extends Event {
val description = "Cucumber tests completed successfully."
val result = Result.Success
val error: Throwable = null
}
case class FailureEvent(testName: String) extends Event {
val description = "There were test failures (or undefined/pending steps)."
val result = Result.Failure
val error: Throwable = null
}
case class ErrorEvent(testName: String, error: Throwable) extends Event {
val description = "An error occurred while running Cucumber."
val result = Result.Error
}
}
object CucumberRunOnceFingerprint extends SubclassFingerprint {
val isModule = false
val superClassName = classOf[RunCucumber].getName
}
trait RunCucumber