From ad18b4f3aecce5dacc9a7c8a3b53300ee43cca09 Mon Sep 17 00:00:00 2001 From: cheeseng Date: Thu, 4 Apr 2013 10:48:15 +0800 Subject: [PATCH] Added code to tag test task using Array[String] returned from Task.tags method. --- main/actions/src/main/scala/sbt/Tests.scala | 9 ++++--- .../src/main/scala/sbt/TestFramework.scala | 25 +++++++++++-------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/main/actions/src/main/scala/sbt/Tests.scala b/main/actions/src/main/scala/sbt/Tests.scala index 987e39126..6c8542e85 100644 --- a/main/actions/src/main/scala/sbt/Tests.scala +++ b/main/actions/src/main/scala/sbt/Tests.scala @@ -11,7 +11,7 @@ package sbt import xsbti.api.Definition import ConcurrentRestrictions.Tag - import testing.{AnnotatedFingerprint, Fingerprint, Framework, SubclassFingerprint, Runner} + import testing.{AnnotatedFingerprint, Fingerprint, Framework, SubclassFingerprint, Runner, Task => TestTask} import java.io.File @@ -120,11 +120,12 @@ object Tests cleanupTasks map { _ => results } } } - type TestRunnable = (String, () => SuiteResult) + type TestRunnable = (String, TestFunction) def makeParallel(runnables: Iterable[TestRunnable], setupTasks: Task[Unit], tags: Seq[(Tag,Int)]) = - runnables map { case (name, test) => task { (name, test()) } tagw(tags : _*) dependsOn setupTasks named name } + runnables map { case (name, test) => task { (name, test.apply()) } tagw(tags : _*) tag(test.tags map (ConcurrentRestrictions.Tag(_)) : _*) dependsOn setupTasks named name } + def makeSerial(runnables: Seq[TestRunnable], setupTasks: Task[Unit], tags: Seq[(Tag,Int)]) = - task { runnables map { case (name, test) => (name, test()) } } dependsOn(setupTasks) + task { runnables map { case (name, test) => (name, test.apply()) } } dependsOn(setupTasks) def processResults(results: Iterable[(String, SuiteResult)]): Output = Output(overall(results.map(_._2.result)), results.toMap, Iterable.empty) diff --git a/testing/src/main/scala/sbt/TestFramework.scala b/testing/src/main/scala/sbt/TestFramework.scala index f70ab09c9..59bec069a 100644 --- a/testing/src/main/scala/sbt/TestFramework.scala +++ b/testing/src/main/scala/sbt/TestFramework.scala @@ -5,7 +5,7 @@ package sbt import java.io.File import java.net.URLClassLoader - import testing.{Logger=>TLogger, _} + import testing.{Logger=>TLogger, Task => TestTask, _} import org.scalatools.testing.{Framework => OldFramework} import classpath.{ClasspathUtilities, DualLoader, FilteredLoader} import scala.annotation.tailrec @@ -65,7 +65,10 @@ final class TestDefinition(val name: String, val fingerprint: Fingerprint) final class TestRunner(delegate: Runner, listeners: Seq[TestReportListener], log: Logger) { - final def run(testDefinition: TestDefinition): SuiteResult = + final def task(testDefinition: TestDefinition): TestTask = + delegate.task(testDefinition.name, testDefinition.fingerprint, false, Array(new SuiteSelector)) // TODO: To pass in correct explicitlySpecified and selectors + + final def run(testDefinition: TestDefinition, testTask: TestTask): SuiteResult = { log.debug("Running " + testDefinition) val name = testDefinition.name @@ -75,10 +78,7 @@ final class TestRunner(delegate: Runner, listeners: Seq[TestReportListener], log val results = new scala.collection.mutable.ListBuffer[Event] val handler = new EventHandler { def handle(e:Event){ results += e } } val loggers = listeners.flatMap(_.contentLogger(testDefinition)) - try { - // TODO: To pass in correct explicitlySpecified and selectors - delegate.task(testDefinition.name, testDefinition.fingerprint, false, Array(new SuiteSelector)).execute(handler, loggers.map(_.log).toArray) - } + try testTask.execute(handler, loggers.map(_.log).toArray) finally loggers.foreach( _.flush() ) val event = TestEvent(results) safeListenersCall(_.testEvent( event )) @@ -148,7 +148,7 @@ object TestFramework log: Logger, listeners: Seq[TestReportListener], testArgsByFramework: Map[Framework, Seq[String]]): - (() => Unit, Seq[(String, () => SuiteResult)], TestResult.Value => () => Unit) = + (() => Unit, Seq[(String, TestFunction)], TestResult.Value => () => Unit) = { val arguments = testArgsByFramework withDefaultValue Nil val mappedTests = testMap(frameworks.values.toSeq, tests, arguments) @@ -158,7 +158,7 @@ object TestFramework createTestTasks(testLoader, runners.map { case (tf, r) => (frameworks(tf), new TestRunner(r, listeners, log))}, mappedTests, tests, log, listeners) } - private[this] def order(mapped: Map[String, () => SuiteResult], inputs: Seq[TestDefinition]): Seq[(String, () => SuiteResult)] = + private[this] def order(mapped: Map[String, TestFunction], inputs: Seq[TestDefinition]): Seq[(String, TestFunction)] = for( d <- inputs; act <- mapped.get(d.name) ) yield (d.name, act) private[this] def testMap(frameworks: Seq[Framework], tests: Seq[TestDefinition], args: Map[Framework, Seq[String]]): @@ -204,8 +204,9 @@ object TestFramework val runner = runners(framework) for(testDefinition <- testDefinitions) yield { - val runTest = () => withContextLoader(loader) { runner.run(testDefinition) } - (testDefinition.name, runTest) + val task = withContextLoader(loader) { runner.task(testDefinition) } + val testFunction = new TestFunction(() => withContextLoader(loader) { runner.run(testDefinition, task) }) { def tags = task.tags } + (testDefinition.name, testFunction) } } @@ -228,3 +229,7 @@ object TestFramework ClasspathUtilities.filterByClasspath(interfaceJar +: classpath, main) } } + +abstract class TestFunction(val apply: () => SuiteResult) { + def tags: Array[String] +}