Added >1 framework class per framework support, this enables sbt to support both old and new framework API at the same time.

This commit is contained in:
cheeseng
2013-04-23 12:00:05 +08:00
parent f38a244d0f
commit a76523a5f6
4 changed files with 46 additions and 29 deletions
+25 -16
View File
@@ -8,6 +8,7 @@ package sbt
import testing.{Logger=>TLogger, _}
import org.scalatools.testing.{Framework => OldFramework}
import classpath.{ClasspathUtilities, DualLoader, FilteredLoader}
import scala.annotation.tailrec
object TestResult extends Enumeration
{
@@ -17,30 +18,38 @@ object TestResult extends Enumeration
object TestFrameworks
{
val ScalaCheck = new TestFramework("org.scalacheck.ScalaCheckFramework")
val ScalaTest = new TestFramework("org.scalatest.tools.Framework")
val ScalaTest = new TestFramework("org.scalatest.tools.Framework", "org.scalatest.tools.ScalaTestFramework")
val Specs = new TestFramework("org.specs.runner.SpecsFramework")
val Specs2 = new TestFramework("org.specs2.runner.SpecsFramework")
val JUnit = new TestFramework("com.novocode.junit.JUnitFramework")
}
case class TestFramework(val implClassName: String)
case class TestFramework(val implClassNames: String*)
{
def create(loader: ClassLoader, log: Logger): Option[Framework] =
{
try
{
Some(
Class.forName(implClassName, true, loader).newInstance match {
case newFramework: Framework => newFramework
case oldFramework: OldFramework => new FrameworkWrapper(oldFramework)
}
)
}
catch
{
case e: ClassNotFoundException => log.debug("Framework implementation '" + implClassName + "' not present."); None
@tailrec
private def createFramework(loader: ClassLoader, log: Logger, frameworkClassNames: List[String]): Option[Framework] = {
frameworkClassNames match {
case head :: tail =>
try
{
Some(Class.forName(head, true, loader).newInstance match {
case newFramework: Framework => newFramework
case oldFramework: OldFramework => new FrameworkWrapper(oldFramework)
})
}
catch
{
case e: ClassNotFoundException =>
log.debug("Framework implementation '" + head + "' not present.");
createFramework(loader, log, tail)
}
case Nil =>
None
}
}
def create(loader: ClassLoader, log: Logger): Option[Framework] =
createFramework(loader, log, implClassNames.toList)
}
final class TestDefinition(val name: String, val fingerprint: Fingerprint)
{