2009-06-26 03:26:06 +02:00
|
|
|
/* sbt -- Simple Build Tool
|
|
|
|
|
* Copyright 2008, 2009 Steven Blundy, Mark Harrah
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
package sbt
|
|
|
|
|
|
2009-10-23 01:10:54 +02:00
|
|
|
import org.scalatools.testing.{Logger => TLogger, Event => TEvent, Result => TResult}
|
|
|
|
|
|
2009-06-26 03:26:06 +02:00
|
|
|
trait TestReportListener
|
|
|
|
|
{
|
|
|
|
|
/** called for each class or equivalent grouping */
|
|
|
|
|
def startGroup(name: String)
|
|
|
|
|
/** called for each test method or equivalent */
|
|
|
|
|
def testEvent(event: TestEvent)
|
|
|
|
|
/** called if there was an error during test */
|
|
|
|
|
def endGroup(name: String, t: Throwable)
|
|
|
|
|
/** called if test completed */
|
|
|
|
|
def endGroup(name: String, result: Result.Value)
|
2009-10-23 01:10:54 +02:00
|
|
|
/** Used by the test framework for logging test results*/
|
|
|
|
|
def contentLogger: Option[TLogger] = None
|
2009-06-26 03:26:06 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
trait TestsListener extends TestReportListener
|
|
|
|
|
{
|
|
|
|
|
/** called once, at beginning. */
|
|
|
|
|
def doInit
|
|
|
|
|
/** called once, at end. */
|
|
|
|
|
def doComplete(finalResult: Result.Value)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
abstract class TestEvent extends NotNull
|
|
|
|
|
{
|
|
|
|
|
def result: Option[Result.Value]
|
2009-10-23 01:10:54 +02:00
|
|
|
def detail: Seq[TEvent] = Nil
|
2009-06-26 03:26:06 +02:00
|
|
|
}
|
2009-10-23 01:10:54 +02:00
|
|
|
object TestEvent
|
2009-06-26 03:26:06 +02:00
|
|
|
{
|
2009-10-23 01:10:54 +02:00
|
|
|
def apply(events: Seq[TEvent]): TestEvent =
|
|
|
|
|
{
|
|
|
|
|
val overallResult = (Result.Passed /: events) { (sum, event) =>
|
|
|
|
|
val result = event.result
|
|
|
|
|
if(sum == Result.Error || result == TResult.Error) Result.Error
|
|
|
|
|
else if(sum == Result.Failed || result == TResult.Failure) Result.Failed
|
|
|
|
|
else Result.Passed
|
2009-06-26 03:26:06 +02:00
|
|
|
}
|
2009-10-23 01:10:54 +02:00
|
|
|
new TestEvent {
|
|
|
|
|
val result = Some(overallResult)
|
|
|
|
|
override val detail = events
|
2009-06-26 03:26:06 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2009-10-23 01:10:54 +02:00
|
|
|
object TestLogger
|
2009-06-26 03:26:06 +02:00
|
|
|
{
|
2009-10-23 01:10:54 +02:00
|
|
|
def apply(logger: sbt.Logger): TestLogger = new TestLogger(wrap(logger))
|
|
|
|
|
def wrap(logger: sbt.Logger): TLogger =
|
|
|
|
|
new TLogger
|
2009-06-26 03:26:06 +02:00
|
|
|
{
|
2009-10-23 01:10:54 +02:00
|
|
|
def error(s: String) = log(Level.Error, s)
|
|
|
|
|
def warn(s: String) = log(Level.Warn, s)
|
|
|
|
|
def info(s: String) = log(Level.Info, s)
|
|
|
|
|
def debug(s: String) = log(Level.Debug, s)
|
2009-11-11 00:51:18 +01:00
|
|
|
def trace(t: Throwable) = logger.trace(t)
|
2009-10-23 01:10:54 +02:00
|
|
|
private def log(level: Level.Value, s: String) = logger.log(level, s)
|
|
|
|
|
def ansiCodesSupported() = logger.ansiCodesSupported
|
2009-06-26 03:26:06 +02:00
|
|
|
}
|
|
|
|
|
}
|
2009-10-23 01:10:54 +02:00
|
|
|
class TestLogger(val log: TLogger) extends TestsListener
|
2009-06-26 03:26:06 +02:00
|
|
|
{
|
2009-10-23 01:10:54 +02:00
|
|
|
protected var skipped, errors, passed, failures = 0
|
2009-06-26 03:26:06 +02:00
|
|
|
|
|
|
|
|
def startGroup(name: String) {}
|
2009-10-23 01:10:54 +02:00
|
|
|
def testEvent(event: TestEvent): Unit = event.detail.foreach(count)
|
2009-06-26 03:26:06 +02:00
|
|
|
def endGroup(name: String, t: Throwable)
|
|
|
|
|
{
|
2010-01-26 04:52:50 +01:00
|
|
|
log.trace(t)
|
2009-06-26 03:26:06 +02:00
|
|
|
log.error("Could not run test " + name + ": " + t.toString)
|
|
|
|
|
}
|
2009-10-23 01:10:54 +02:00
|
|
|
def endGroup(name: String, result: Result.Value) {}
|
|
|
|
|
protected def count(event: TEvent): Unit =
|
2009-08-09 00:16:25 +02:00
|
|
|
{
|
2009-10-23 01:10:54 +02:00
|
|
|
event.result match
|
2009-08-09 00:16:25 +02:00
|
|
|
{
|
2009-10-23 01:10:54 +02:00
|
|
|
case TResult.Error => errors +=1
|
|
|
|
|
case TResult.Success => passed +=1
|
|
|
|
|
case TResult.Failure => failures +=1
|
|
|
|
|
case TResult.Skipped => skipped += 1
|
2009-08-09 00:16:25 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
def doInit
|
|
|
|
|
{
|
2009-10-23 01:10:54 +02:00
|
|
|
failures = 0
|
2009-08-09 00:16:25 +02:00
|
|
|
errors = 0
|
|
|
|
|
passed = 0
|
2009-10-23 01:10:54 +02:00
|
|
|
skipped = 0
|
2009-08-09 00:16:25 +02:00
|
|
|
}
|
|
|
|
|
/** called once, at end. */
|
|
|
|
|
def doComplete(finalResult: Result.Value): Unit =
|
2009-10-23 01:10:54 +02:00
|
|
|
{
|
|
|
|
|
val totalCount = failures + errors + skipped + passed
|
|
|
|
|
val postfix = ": Total " + totalCount + ", Failed " + failures + ", Errors " + errors + ", Passed " + passed + ", Skipped " + skipped
|
|
|
|
|
finalResult match
|
|
|
|
|
{
|
|
|
|
|
case Result.Error => log.error("Error" + postfix)
|
|
|
|
|
case Result.Passed => log.info("Passed: " + postfix)
|
|
|
|
|
case Result.Failed => log.error("Failed: " + postfix)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
override def contentLogger: Option[TLogger] = Some(log)
|
2009-06-26 03:26:06 +02:00
|
|
|
}
|