diff options
author | Jesse Luehrs <doy@tozt.net> | 2013-03-06 15:32:26 -0600 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2013-03-06 15:32:26 -0600 |
commit | 7efb2caf7d8832a7d3a9d2ac55862e43267a3eb2 (patch) | |
tree | 49fcb4d31bec67bcb67c1262abc25c5e5ecb1e51 /src/main/scala/com/iinteractive/test/sbt | |
parent | 66bcf3627a38ef58dabaf90b7e597569b91ea3e8 (diff) | |
download | scala-test-more-7efb2caf7d8832a7d3a9d2ac55862e43267a3eb2.tar.gz scala-test-more-7efb2caf7d8832a7d3a9d2ac55862e43267a3eb2.zip |
move the directory structure too
Diffstat (limited to 'src/main/scala/com/iinteractive/test/sbt')
5 files changed, 157 insertions, 0 deletions
diff --git a/src/main/scala/com/iinteractive/test/sbt/Fingerprint.scala b/src/main/scala/com/iinteractive/test/sbt/Fingerprint.scala new file mode 100644 index 0000000..bab13c5 --- /dev/null +++ b/src/main/scala/com/iinteractive/test/sbt/Fingerprint.scala @@ -0,0 +1,11 @@ +package com.iinteractive.test.sbt + +import org.scalatools.testing + +/** Implementation of + * [[http://github.com/harrah/test-interface/blob/master/src/org/scalatools/testing/Fingerprint.java org.scalatools.testing.Fingerprint]]. + */ +object Fingerprint extends testing.SubclassFingerprint { + def isModule: Boolean = false + def superClassName: String = "com.iinteractive.test.Test" +} diff --git a/src/main/scala/com/iinteractive/test/sbt/Framework.scala b/src/main/scala/com/iinteractive/test/sbt/Framework.scala new file mode 100644 index 0000000..bb3d0bb --- /dev/null +++ b/src/main/scala/com/iinteractive/test/sbt/Framework.scala @@ -0,0 +1,18 @@ +package com.iinteractive.test.sbt + +import org.scalatools.testing + +/** Implementation of + * [[http://github.com/harrah/test-interface/blob/master/src/org/scalatools/testing/Framework.java org.scalatools.testing.Framework]]. + */ +class Framework extends testing.Framework { + val name: String = "Perl8 Test" + val tests: Array[testing.Fingerprint] = Array(Fingerprint) + + def testRunner ( + testClassLoader: ClassLoader, + loggers: Array[testing.Logger] + ): testing.Runner = { + new Runner(testClassLoader, loggers) + } +} diff --git a/src/main/scala/com/iinteractive/test/sbt/Runner.scala b/src/main/scala/com/iinteractive/test/sbt/Runner.scala new file mode 100644 index 0000000..0eee4cf --- /dev/null +++ b/src/main/scala/com/iinteractive/test/sbt/Runner.scala @@ -0,0 +1,25 @@ +package com.iinteractive.test.sbt + +import org.scalatools.testing + +import com.iinteractive.test.harness.SummaryReporter +import com.iinteractive.test.Test + +/** Implementation of + * [[http://github.com/harrah/test-interface/blob/master/src/org/scalatools/testing/Runner2.java org.scalatools.testing.Runner2]] + * using [[com.iinteractive.test.sbt.SBTReporter SBTReporter]]. + */ +class Runner ( + loader: ClassLoader, + loggers: Array[testing.Logger] +) extends testing.Runner2 { + def run ( + testClassName: String, + fingerprint: testing.Fingerprint, + eventHandler: testing.EventHandler, + args: Array[String] + ) { + val reporter = new SBTReporter(loader, loggers, eventHandler) + reporter.run(testClassName) + } +} diff --git a/src/main/scala/com/iinteractive/test/sbt/SBTReporter.scala b/src/main/scala/com/iinteractive/test/sbt/SBTReporter.scala new file mode 100644 index 0000000..34df60d --- /dev/null +++ b/src/main/scala/com/iinteractive/test/sbt/SBTReporter.scala @@ -0,0 +1,99 @@ +package com.iinteractive.test.sbt + +import org.scalatools.testing + +import com.iinteractive.test.harness.{Reporter,SummarizedTests} +import com.iinteractive.test.tap.{TAPEvent,ResultEvent,EndEvent} +import com.iinteractive.test.Test + +/** Runs a single test under the SBT test harness. */ +class SBTReporter ( + loader: ClassLoader, + loggers: Array[testing.Logger], + eventHandler: testing.EventHandler +) extends Reporter with SummarizedTests { + def run (testName: String): Int = { + val cb = (e: TAPEvent) => e match { + case ResultEvent(r) => { + val event = new testing.Event { + val testName: String = r.description + val description: String = r.description + val result: testing.Result = + if (r.passed) { + testing.Result.Success + } + else if (r.directive.isDefined) { + testing.Result.Skipped + } + else { + testing.Result.Failure + } + val error: Throwable = null + } + eventHandler.handle(event) + } + case EndEvent(result) => { + val testsPassed = result.success + val correctCode = result.exitCode == 0 + val event = new testing.Event { + val testName: String = "exit code is 0" + val description: String = "exit code is 0" + val result: testing.Result = + if (correctCode) { + testing.Result.Success + } + else { + testing.Result.Failure + } + val error: Throwable = null + } + eventHandler.handle(event) + + if (testsPassed && correctCode) { + logInfo("PASS " + testName) + } + else { + val results = result.results.length + val failed = result.results.count { t => + !t.passed && !t.directive.isDefined + } + + val errors = Seq( + (if (testsPassed) + None + else + Some("failed " + failed + "/" + results)), + (if (correctCode) + None + else + Some("non-zero exit code: " + result.exitCode)) + ).flatten.mkString("(", ", ", ")") + + logError("FAIL " + testName + " " + errors) + } + } + case _ => () + } + + runOneTest( + loader.loadClass(testName).newInstance.asInstanceOf[Test], + cb + ).exitCode + } + + private def logDebug (msg: String) { + loggers.foreach(_.debug(msg)) + } + + private def logInfo (msg: String) { + loggers.foreach(_.info(msg)) + } + + private def logWarn (msg: String) { + loggers.foreach(_.warn(msg)) + } + + private def logError (msg: String) { + loggers.foreach(_.error(msg)) + } +} diff --git a/src/main/scala/com/iinteractive/test/sbt/package.scala b/src/main/scala/com/iinteractive/test/sbt/package.scala new file mode 100644 index 0000000..eeb1f68 --- /dev/null +++ b/src/main/scala/com/iinteractive/test/sbt/package.scala @@ -0,0 +1,4 @@ +package com.iinteractive.test + +/** Classes for interoperating with `sbt test`. */ +package object sbt |