From 2e7c0cae48bce4ff41659bc98d39e1139c910a50 Mon Sep 17 00:00:00 2001 From: Mark Harrah Date: Sat, 24 Apr 2010 22:41:55 -0400 Subject: [PATCH 1/5] update test for projects that use the compiler --- .../run-test/project/build/P.scala | 8 ++++++++ .../run-test/src/main/scala/Foo.scala | 13 ++++++++----- .../run-test/src/test/scala/Basic.scala | 15 +++++++++++++++ sbt/src/sbt-test/compiler-project/run-test/test | 7 ++++++- 4 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 sbt/src/sbt-test/compiler-project/run-test/project/build/P.scala create mode 100644 sbt/src/sbt-test/compiler-project/run-test/src/test/scala/Basic.scala diff --git a/sbt/src/sbt-test/compiler-project/run-test/project/build/P.scala b/sbt/src/sbt-test/compiler-project/run-test/project/build/P.scala new file mode 100644 index 000000000..baa8bad30 --- /dev/null +++ b/sbt/src/sbt-test/compiler-project/run-test/project/build/P.scala @@ -0,0 +1,8 @@ +import sbt._ + +class P(info: ProjectInfo) extends DefaultProject(info) +{ + val bryanjswift = "Bryan J Swift Repository" at "http://repos.bryanjswift.com/maven2/" + val junitInterface = "com.novocode" % "junit-interface" % "0.4.0" % "test" + val junit = "junit" % "junit" % "4.7" % "test" +} \ No newline at end of file diff --git a/sbt/src/sbt-test/compiler-project/run-test/src/main/scala/Foo.scala b/sbt/src/sbt-test/compiler-project/run-test/src/main/scala/Foo.scala index 875399679..217ef6304 100644 --- a/sbt/src/sbt-test/compiler-project/run-test/src/main/scala/Foo.scala +++ b/sbt/src/sbt-test/compiler-project/run-test/src/main/scala/Foo.scala @@ -1,18 +1,21 @@ package foo.bar import java.io.File +import File.{pathSeparator => / } import java.net.{URISyntaxException, URL} class Holder { var value: Any = _ } -import scala.tools.nsc.{Interpreter, Settings} +import scala.tools.nsc.{GenericRunnerSettings, Interpreter, Settings} class Foo { + val g = new GenericRunnerSettings(System.err.println) val settings = new Settings() settings.classpath.value = location(classOf[Holder]) - settings.bootclasspath.value = settings.bootclasspath.value + File.pathSeparator + location(classOf[ScalaObject]) - val inter = new Interpreter(settings) - + settings.bootclasspath.value = settings.bootclasspath.value + / + location(classOf[ScalaObject]) + / + location(classOf[Settings]) + val inter = new Interpreter(settings) { + override protected def parentClassLoader = Foo.this.getClass.getClassLoader + } def eval(code: String): Any = { val h = new Holder inter.bind("$r_", h.getClass.getName, h) @@ -32,4 +35,4 @@ object Test val foo = new Foo args.foreach { arg => foo.eval(arg) == arg.toInt } } -} +} \ No newline at end of file diff --git a/sbt/src/sbt-test/compiler-project/run-test/src/test/scala/Basic.scala b/sbt/src/sbt-test/compiler-project/run-test/src/test/scala/Basic.scala new file mode 100644 index 000000000..8f26f73a4 --- /dev/null +++ b/sbt/src/sbt-test/compiler-project/run-test/src/test/scala/Basic.scala @@ -0,0 +1,15 @@ +package foo.bar + +import org.junit._ +import org.junit.Assert._ + +class Basic +{ + val foo = new Foo + @Test + def checkBind(): Unit = + { + try { assertTrue( foo.eval("3") == 3) } + catch { case e => e.printStackTrace; throw e} + } +} diff --git a/sbt/src/sbt-test/compiler-project/run-test/test b/sbt/src/sbt-test/compiler-project/run-test/test index 15139f18e..8d3b08058 100644 --- a/sbt/src/sbt-test/compiler-project/run-test/test +++ b/sbt/src/sbt-test/compiler-project/run-test/test @@ -1,8 +1,13 @@ +> set build.scala.versions 2.7.7 2.8.0.RC1 +> reload +> +update > +run 1 +> +test > +clean > +run 2 +> +test > +clean > +run -1 -> +clean \ No newline at end of file +> +test \ No newline at end of file From 3b71e6e8fb2b4280f2a8b369862cd624e48199b4 Mon Sep 17 00:00:00 2001 From: Mark Harrah Date: Sat, 24 Apr 2010 22:42:30 -0400 Subject: [PATCH 2/5] Precompile for 2.8.0.RC1 --- project/build/XSbt.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/build/XSbt.scala b/project/build/XSbt.scala index 8c5c78370..676e847d0 100644 --- a/project/build/XSbt.scala +++ b/project/build/XSbt.scala @@ -193,7 +193,7 @@ class XSbt(info: ProjectInfo) extends ParentProject(info) with NoCrossPaths // sub projects for each version of Scala to precompile against other than the one sbt is built against // each sub project here will add ~100k to the download - lazy val precompiled28 = precompiledSub("2.8.0.Beta1") + lazy val precompiled28 = precompiledSub("2.8.0.RC1") def precompiledSub(v: String) = project(info.projectPath, "Precompiled " + v, new Precompiled(v)(_), cip.info.dependencies.toSeq : _* /*doesn't include subprojects of cip*/ ) From 5ee757520685f620f7ac166936dc04d3076586f8 Mon Sep 17 00:00:00 2001 From: Mark Harrah Date: Sat, 24 Apr 2010 22:44:14 -0400 Subject: [PATCH 3/5] Update compiler class filter for 2.8.0.RC1. --- sbt/src/main/scala/sbt/TestFramework.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sbt/src/main/scala/sbt/TestFramework.scala b/sbt/src/main/scala/sbt/TestFramework.scala index fee9882d7..28b40b6fd 100644 --- a/sbt/src/main/scala/sbt/TestFramework.scala +++ b/sbt/src/main/scala/sbt/TestFramework.scala @@ -100,7 +100,7 @@ object TestFramework case _ => error("Could not call 'tests' on framework " + framework) } - private val ScalaCompilerJarPackages = "scala.tools.nsc." :: "jline." :: "ch.epfl.lamp." :: Nil + private val ScalaCompilerJarPackages = "scala.tools." :: "jline." :: "ch.epfl.lamp." :: Nil private val TestStartName = "test-start" private val TestFinishName = "test-finish" From fdd0e14e71d91b8dc9f2ca74e94420d6d31b2eb2 Mon Sep 17 00:00:00 2001 From: Mark Harrah Date: Sat, 24 Apr 2010 22:48:57 -0400 Subject: [PATCH 4/5] Defer checking test names until they are needed (after test-compile). Not as immediate feedback, but it is more accurate. --- sbt/src/main/scala/sbt/DefaultProject.scala | 2 +- sbt/src/main/scala/sbt/ScalaProject.scala | 29 +++++++++++++-------- sbt/src/main/scala/sbt/TaskManager.scala | 1 + 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/sbt/src/main/scala/sbt/DefaultProject.scala b/sbt/src/main/scala/sbt/DefaultProject.scala index b379496e2..e92548a80 100644 --- a/sbt/src/main/scala/sbt/DefaultProject.scala +++ b/sbt/src/main/scala/sbt/DefaultProject.scala @@ -299,7 +299,7 @@ abstract class BasicScalaProject extends ScalaProject with BasicDependencyProjec protected def packageProjectAction = zipTask(packageProjectPaths, packageProjectZip) describedAs ProjectPackageDescription protected def docAllAction = (doc && docTest) describedAs DocAllDescription - protected def packageAllAction = task { None } dependsOn(`package`, packageTest, packageSrc, packageTestSrc, packageDocs) describedAs PackageAllDescription + protected def packageAllAction = Empty dependsOn(`package`, packageTest, packageSrc, packageTestSrc, packageDocs) describedAs PackageAllDescription protected def graphSourcesAction = graphSourcesTask(graphSourcesPath, mainSourceRoots, mainCompileConditional.analysis).dependsOn(compile) protected def graphPackagesAction = graphPackagesTask(graphPackagesPath, mainSourceRoots, mainCompileConditional.analysis).dependsOn(compile) protected def incrementVersionAction = task { incrementVersionNumber(); None } describedAs IncrementVersionDescription diff --git a/sbt/src/main/scala/sbt/ScalaProject.scala b/sbt/src/main/scala/sbt/ScalaProject.scala index c2d5a2b06..1db8741d7 100644 --- a/sbt/src/main/scala/sbt/ScalaProject.scala +++ b/sbt/src/main/scala/sbt/ScalaProject.scala @@ -173,8 +173,8 @@ trait ScalaProject extends SimpleScalaProject with FileTasks with MultiTaskProje val beginTasks = begin.map(toTask).toSeq // test setup tasks val workTasks = work.map(w => toTask(w) dependsOn(beginTasks : _*)) // the actual tests val endTasks = end.map(toTask).toSeq // tasks that perform test cleanup and are run regardless of success of tests - val endTask = task { None } named("test-cleanup") dependsOn(endTasks : _*) - val rootTask = task { None } named("test-complete") dependsOn(workTasks.toSeq : _*) // the task that depends on all test subtasks + val endTask = Empty named("test-cleanup") dependsOn(endTasks : _*) + val rootTask = Empty named("test-complete") dependsOn(workTasks.toSeq : _*) // the task that depends on all test subtasks SubWork[Project#Task](rootTask, endTask) } new CompoundTask(work) @@ -392,17 +392,24 @@ trait MultiTaskProject extends Project def filterInclude = { - val (exactFilters, testFilters) = testNames.toList.map(GlobFilter.apply).partition(_.isInstanceOf[ExactFilter]) - val includeTests = exactFilters.map(_.asInstanceOf[ExactFilter].matchName) - val toCheck = scala.collection.mutable.HashSet(includeTests: _*) - toCheck --= allTests - - if(!toCheck.isEmpty && log.atLevel(Level.Warn)) + lazy val (exactFilters, testFilters) = testNames.toList.map(GlobFilter.apply).partition(_.isInstanceOf[ExactFilter]) + lazy val includeTests = exactFilters.map(_.asInstanceOf[ExactFilter].matchName) + def checkExistence() = { - log.warn("Test(s) not found:") - toCheck.foreach(test => log.warn("\t" + test)) + val toCheck = Set() ++ includeTests -- allTests + + if(!toCheck.isEmpty && log.atLevel(Level.Warn)) + { + log.warn("Test(s) not found:") + toCheck.foreach(test => log.warn("\t" + test)) + } + toCheck + } + lazy val includeTestsSet = + { + checkExistence() + Set(includeTests: _*) } - val includeTestsSet = Set(includeTests: _*) (test: String) => includeTestsSet.contains(test) || testFilters.exists(_.accept(test)) } diff --git a/sbt/src/main/scala/sbt/TaskManager.scala b/sbt/src/main/scala/sbt/TaskManager.scala index 8977c728f..040b46c01 100644 --- a/sbt/src/main/scala/sbt/TaskManager.scala +++ b/sbt/src/main/scala/sbt/TaskManager.scala @@ -98,6 +98,7 @@ trait TaskManager{ val interactiveDependencyIndex = dependencyList.findIndexOf(_.interactive) require(interactiveDependencyIndex < 0, "Dependency (at index " + interactiveDependencyIndex + ") is interactive. Interactive tasks cannot be dependencies.") } + lazy val Empty = task { None} } object TaskManager { From 88787d8569ac039e6455ac66d1ab99717d310e39 Mon Sep 17 00:00:00 2001 From: Mark Harrah Date: Sat, 24 Apr 2010 23:20:43 -0400 Subject: [PATCH 5/5] Fail test action when explicit test names are invalid --- sbt/src/main/scala/sbt/ScalaProject.scala | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/sbt/src/main/scala/sbt/ScalaProject.scala b/sbt/src/main/scala/sbt/ScalaProject.scala index 1db8741d7..8f7238b4b 100644 --- a/sbt/src/main/scala/sbt/ScalaProject.scala +++ b/sbt/src/main/scala/sbt/ScalaProject.scala @@ -167,7 +167,7 @@ trait ScalaProject extends SimpleScalaProject with FileTasks with MultiTaskProje testTask(frameworks, classpath, analysis, options) def testTask(frameworks: Seq[TestFramework], classpath: PathFinder, analysis: CompileAnalysis, options: => Seq[TestOption]): Task = { - def work = + def rawWork = { val (begin, work, end) = testTasks(frameworks, classpath, analysis, options) val beginTasks = begin.map(toTask).toSeq // test setup tasks @@ -177,6 +177,10 @@ trait ScalaProject extends SimpleScalaProject with FileTasks with MultiTaskProje val rootTask = Empty named("test-complete") dependsOn(workTasks.toSeq : _*) // the task that depends on all test subtasks SubWork[Project#Task](rootTask, endTask) } + def errorTask(e: TestSetupException) = task { Some(e.getMessage) } named("test-setup") + def work = + try { rawWork } + catch { case e: TestSetupException => SubWork[Project#Task](errorTask(e)) } new CompoundTask(work) } private def toTask(testTask: NamedTestTask) = task(testTask.run()) named(testTask.name) @@ -381,6 +385,7 @@ object ScalaProject def optionsAsString(options: Seq[ScalaProject#CompileOption]) = options.map(_.asString).filter(!_.isEmpty) def javaOptionsAsString(options: Seq[ScalaProject#JavaCompileOption]) = options.map(_.asString) } +final class TestSetupException(msg: String) extends RuntimeException(msg) trait MultiTaskProject extends Project { def multiTask(allTests: => List[String])(run: (Seq[String], String => Boolean) => Task): MethodTask = { @@ -398,12 +403,12 @@ trait MultiTaskProject extends Project { val toCheck = Set() ++ includeTests -- allTests - if(!toCheck.isEmpty && log.atLevel(Level.Warn)) + if(!toCheck.isEmpty) { - log.warn("Test(s) not found:") - toCheck.foreach(test => log.warn("\t" + test)) + log.error("Test(s) not found:") + toCheck.foreach(test => log.error("\t" + test)) + throw new TestSetupException("Invalid test name(s): " + toCheck.mkString(", ")) } - toCheck } lazy val includeTestsSet = {