mirror of https://github.com/sbt/sbt.git
Compatibility test framework support and tests
This commit is contained in:
parent
c8057f414b
commit
64fae31248
|
|
@ -211,7 +211,24 @@ trait BasicManagedProject extends ManagedProject with ReflectiveManagedProject w
|
||||||
/** The settings that represent inline declarations. The default settings combines the information
|
/** The settings that represent inline declarations. The default settings combines the information
|
||||||
* from 'ivyXML', 'projectID', 'repositories', ivyConfigurations, defaultConfiguration,
|
* from 'ivyXML', 'projectID', 'repositories', ivyConfigurations, defaultConfiguration,
|
||||||
* ivyScala, and 'libraryDependencies' and does not typically need to be be overridden. */
|
* ivyScala, and 'libraryDependencies' and does not typically need to be be overridden. */
|
||||||
def inlineSettings = new InlineConfiguration(projectID, libraryDependencies, ivyXML, ivyConfigurations, defaultConfiguration, ivyScala, ivyValidate)
|
def inlineSettings = new InlineConfiguration(projectID, withCompat, ivyXML, ivyConfigurations, defaultConfiguration, ivyScala, ivyValidate)
|
||||||
|
/** Library dependencies with extra dependencies for compatibility*/
|
||||||
|
private def withCompat =
|
||||||
|
{
|
||||||
|
val deps = libraryDependencies
|
||||||
|
deps ++ compatExtra(deps)
|
||||||
|
}
|
||||||
|
/** Determines extra libraries needed for compatibility. Currently, this is the compatibility test framework. */
|
||||||
|
private def compatExtra(deps: Set[ModuleID]) = if(deps.exists(requiresCompat)) compatTestFramework else Nil
|
||||||
|
/** True if the given dependency requires the compatibility test framework. */
|
||||||
|
private def requiresCompat(m: ModuleID) =
|
||||||
|
(m.name == "scalacheck" && Set("1.5", "1.6").contains(m.revision)) ||
|
||||||
|
(m.name == "specs" && Set("1.6.0", "1.6.1").contains(m.revision)) ||
|
||||||
|
(m.name == "scalatest" && m.revision == "1.0")
|
||||||
|
/** Extra dependencies to add if a dependency on an older test framework (one released before the uniform test interface) is declared.
|
||||||
|
* This is the compatibility test framework by default.*/
|
||||||
|
def compatTestFramework = Set("org.scala-tools.sbt" %% "test-compat" % "0.4.0" % "test")
|
||||||
|
|
||||||
def defaultModuleSettings: ModuleSettings =
|
def defaultModuleSettings: ModuleSettings =
|
||||||
{
|
{
|
||||||
val in = inlineSettings
|
val in = inlineSettings
|
||||||
|
|
|
||||||
|
|
@ -177,8 +177,8 @@ abstract class BasicScalaProject extends ScalaProject with BasicDependencyProjec
|
||||||
* run*/
|
* run*/
|
||||||
def testFrameworks: Seq[TestFramework] =
|
def testFrameworks: Seq[TestFramework] =
|
||||||
{
|
{
|
||||||
import TestFrameworks.{JUnit, ScalaCheck, ScalaTest, Specs}
|
import TestFrameworks.{JUnit, ScalaCheck, ScalaTest, Specs, ScalaCheckCompat, ScalaTestCompat, SpecsCompat}
|
||||||
ScalaCheck :: Specs :: ScalaTest :: JUnit :: Nil
|
ScalaCheck :: Specs :: ScalaTest :: JUnit :: ScalaCheckCompat :: ScalaTestCompat :: SpecsCompat :: Nil
|
||||||
}
|
}
|
||||||
/** The list of listeners for testing. */
|
/** The list of listeners for testing. */
|
||||||
def testListeners: Seq[TestReportListener] = TestLogger(log) :: Nil
|
def testListeners: Seq[TestReportListener] = TestLogger(log) :: Nil
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,10 @@ object TestFrameworks
|
||||||
val ScalaTest = new TestFramework("org.scalatest.tools.ScalaTestFramework")
|
val ScalaTest = new TestFramework("org.scalatest.tools.ScalaTestFramework")
|
||||||
val Specs = new TestFramework("org.specs.runner.SpecsFramework")
|
val Specs = new TestFramework("org.specs.runner.SpecsFramework")
|
||||||
val JUnit = new TestFramework("com.novocode.junit.JUnitFramework")
|
val JUnit = new TestFramework("com.novocode.junit.JUnitFramework")
|
||||||
|
// These are compatibility frameworks included in the 'test-compat' library
|
||||||
|
val ScalaCheckCompat = new TestFramework("sbt.impl.ScalaCheckFramework")
|
||||||
|
val ScalaTestCompat = new TestFramework("sbt.impl.ScalaTestFramework")
|
||||||
|
val SpecsCompat = new TestFramework("sbt.impl.SpecsFramework")
|
||||||
}
|
}
|
||||||
|
|
||||||
class TestFramework(val implClassName: String) extends NotNull
|
class TestFramework(val implClassName: String) extends NotNull
|
||||||
|
|
|
||||||
|
|
@ -73,8 +73,7 @@ class TestLogger(val log: TLogger) extends TestsListener
|
||||||
def testEvent(event: TestEvent): Unit = event.detail.foreach(count)
|
def testEvent(event: TestEvent): Unit = event.detail.foreach(count)
|
||||||
def endGroup(name: String, t: Throwable)
|
def endGroup(name: String, t: Throwable)
|
||||||
{
|
{
|
||||||
// log.trace(t) : need to add a trace method to org.scalatools.testing.Logger
|
log.trace(t)
|
||||||
try { log.getClass.getMethod("trace", classOf[Throwable]).invoke(log, t) } catch { case e: Exception => () }
|
|
||||||
log.error("Could not run test " + name + ": " + t.toString)
|
log.error("Could not run test " + name + ": " + t.toString)
|
||||||
}
|
}
|
||||||
def endGroup(name: String, result: Result.Value) {}
|
def endGroup(name: String, result: Result.Value) {}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
project.name=ScalaTest Compatibility Test
|
||||||
|
project.version=1.0
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
import sbt._
|
||||||
|
|
||||||
|
class CompatScalaTest(info: ProjectInfo) extends DefaultProject(info)
|
||||||
|
{
|
||||||
|
val specs = "org.scala-tools.testing" % "scalacheck" % "1.6" % "test"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
import org.scalacheck._
|
||||||
|
|
||||||
|
object Failure extends Properties("String") {
|
||||||
|
property("startsWith") = Prop.forAll((a: String, b: String) => (a+b).startsWith(a))
|
||||||
|
|
||||||
|
property("endsWith") = Prop.forAll((a: String, b: String) => (a+b).endsWith(b))
|
||||||
|
|
||||||
|
// Is this really always true?
|
||||||
|
property("concat") = Prop.forAll((a: String, b: String) =>
|
||||||
|
(a+b).length > a.length && (a+b).length > b.length
|
||||||
|
)
|
||||||
|
|
||||||
|
property("substring") = Prop.forAll((a: String, b: String) =>
|
||||||
|
(a+b).substring(a.length) == b
|
||||||
|
)
|
||||||
|
|
||||||
|
property("substring") = Prop.forAll((a: String, b: String, c: String) =>
|
||||||
|
(a+b+c).substring(a.length, a.length+b.length) == b
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
import org.scalacheck._
|
||||||
|
|
||||||
|
object Success extends Properties("String") {
|
||||||
|
property("startsWith") = Prop.forAll((a: String, b: String) => (a+b).startsWith(a))
|
||||||
|
|
||||||
|
property("endsWith") = Prop.forAll((a: String, b: String) => (a+b).endsWith(b))
|
||||||
|
|
||||||
|
property("substring") = Prop.forAll((a: String, b: String) =>
|
||||||
|
(a+b).substring(a.length) == b
|
||||||
|
)
|
||||||
|
|
||||||
|
property("substring") = Prop.forAll((a: String, b: String, c: String) =>
|
||||||
|
(a+b+c).substring(a.length, a.length+b.length) == b
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
> ++2.7.2
|
||||||
|
> update
|
||||||
|
> test-only Success
|
||||||
|
-> test-only Failure
|
||||||
|
> ++2.7.3
|
||||||
|
> update
|
||||||
|
> test-only Success
|
||||||
|
-> test-only Failure
|
||||||
|
|
||||||
|
> ++2.7.4
|
||||||
|
> update
|
||||||
|
> test-only Success
|
||||||
|
-> test-only Failure
|
||||||
|
|
||||||
|
> ++2.7.5
|
||||||
|
> update
|
||||||
|
> test-only Success
|
||||||
|
-> test-only Failure
|
||||||
|
|
||||||
|
> ++2.7.6
|
||||||
|
> update
|
||||||
|
> test-only Success
|
||||||
|
-> test-only Failure
|
||||||
|
|
||||||
|
> ++2.7.7
|
||||||
|
> update
|
||||||
|
> test-only Success
|
||||||
|
-> test-only Failure
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
project.name=ScalaTest Compatibility Test
|
||||||
|
project.version=1.0
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
import sbt._
|
||||||
|
|
||||||
|
class CompatScalaTest(info: ProjectInfo) extends DefaultProject(info)
|
||||||
|
{
|
||||||
|
val specs = "org.scalatest" % "scalatest" % "1.0" % "test"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
/** The ScalaTest example on the home page, but failing.. */
|
||||||
|
|
||||||
|
import org.scalatest.FlatSpec
|
||||||
|
import org.scalatest.matchers.ShouldMatchers
|
||||||
|
import scala.collection.mutable.Stack
|
||||||
|
|
||||||
|
class Failure extends FlatSpec with ShouldMatchers {
|
||||||
|
|
||||||
|
"A Stack" should "pop values in last-in-first-out order" in {
|
||||||
|
val stack = new Stack[Int]
|
||||||
|
stack.push(1)
|
||||||
|
stack.push(2)
|
||||||
|
stack.pop() should equal (2)
|
||||||
|
stack.pop() should equal (19) // should fail
|
||||||
|
}
|
||||||
|
|
||||||
|
it should "throw NoSuchElementException if an empty stack is popped" in {
|
||||||
|
val emptyStack = new Stack[String]
|
||||||
|
evaluating { emptyStack.pop() } should produce [NoSuchElementException]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
/** The ScalaTest example on the home page. */
|
||||||
|
|
||||||
|
import org.scalatest.FlatSpec
|
||||||
|
import org.scalatest.matchers.ShouldMatchers
|
||||||
|
import scala.collection.mutable.Stack
|
||||||
|
|
||||||
|
class StackSpecSuccess extends FlatSpec with ShouldMatchers {
|
||||||
|
|
||||||
|
"A Stack" should "pop values in last-in-first-out order" in {
|
||||||
|
val stack = new Stack[Int]
|
||||||
|
stack.push(1)
|
||||||
|
stack.push(2)
|
||||||
|
stack.pop() should equal (2)
|
||||||
|
stack.pop() should equal (1)
|
||||||
|
}
|
||||||
|
|
||||||
|
it should "throw NoSuchElementException if an empty stack is popped" in {
|
||||||
|
val emptyStack = new Stack[String]
|
||||||
|
evaluating { emptyStack.pop() } should produce [NoSuchElementException]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
> ++2.7.5
|
||||||
|
> update
|
||||||
|
> test-only Success
|
||||||
|
-> test-only Failure
|
||||||
|
|
||||||
|
> ++2.7.7
|
||||||
|
> update
|
||||||
|
> test-only Success
|
||||||
|
-> test-only Failure
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
project.name=Specs Compatibility Test
|
||||||
|
project.version=1.0
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
import sbt._
|
||||||
|
|
||||||
|
class CompatSpecsTest(info: ProjectInfo) extends DefaultProject(info)
|
||||||
|
{
|
||||||
|
val specs = "org.scala-tools.testing" % "specs" % "1.6.0" % "test"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
import org.specs._
|
||||||
|
|
||||||
|
object Failure extends Specification {
|
||||||
|
"'hello world' has 11 characters" in {
|
||||||
|
"hello world".size must be equalTo(12)
|
||||||
|
}
|
||||||
|
"'hello world' matches 'h.* w.*'" in {
|
||||||
|
"hello world" must be matching("h.* w.*")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
import org.specs._
|
||||||
|
|
||||||
|
object Success extends Specification {
|
||||||
|
"'hello world' has 11 characters" in {
|
||||||
|
"hello world".size must be equalTo(11)
|
||||||
|
}
|
||||||
|
"'hello world' matches 'h.* w.*'" in {
|
||||||
|
"hello world" must be matching("h.* w.*")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
> ++2.7.5
|
||||||
|
> update
|
||||||
|
> test-only Success
|
||||||
|
-> test-only Failure
|
||||||
|
|
||||||
|
> ++2.7.7
|
||||||
|
> update
|
||||||
|
> test-only Success
|
||||||
|
-> test-only Failure
|
||||||
Loading…
Reference in New Issue