Skip to content

Commit 8204261

Browse files
committed
Create one sbt task for each property
This makes us take advantage of sbt's parallelism on a more fine-grained level (per Prop instead of per Properties)
1 parent d974d6f commit 8204261

File tree

1 file changed

+41
-18
lines changed

1 file changed

+41
-18
lines changed

src/main/scala/org/scalacheck/ScalaCheckFramework.scala

Lines changed: 41 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
package org.scalacheck
1111

1212
import sbt.testing._
13-
import org.scalajs.testinterface.TestUtils
13+
import org.scalajs.testinterface.TestUtils.{loadModule, newInstance}
1414
import scala.language.reflectiveCalls
1515
import java.util.concurrent.atomic.AtomicInteger
1616

@@ -30,36 +30,59 @@ private abstract class ScalaCheckRunner(
3030
case None => throw new Exception(s"Invalid ScalaCheck args")
3131
}
3232

33-
def deserializeTask(task: String, deserializer: String => TaskDef) =
34-
ScalaCheckTask(deserializer(task))
33+
def deserializeTask(task: String, deserializer: String => TaskDef) = {
34+
val taskDef = deserializer(task)
35+
val countTestSelectors = taskDef.selectors.toSeq.count {
36+
case _:TestSelector => true
37+
case _ => false
38+
}
39+
if (countTestSelectors == 0) rootTask(taskDef)
40+
else checkPropTask(taskDef)
41+
}
3542

3643
def serializeTask(task: Task, serializer: TaskDef => String) =
3744
serializer(task.taskDef)
3845

39-
def tasks(taskDefs: Array[TaskDef]): Array[Task] =
40-
taskDefs.map(ScalaCheckTask)
46+
def tasks(taskDefs: Array[TaskDef]): Array[Task] = taskDefs.map(rootTask)
4147

42-
case class ScalaCheckTask(taskDef: TaskDef) extends Task {
48+
abstract class BaseTask(override val taskDef: TaskDef) extends Task {
4349
val tags: Array[String] = Array()
4450

45-
val fp = taskDef.fingerprint.asInstanceOf[SubclassFingerprint]
46-
47-
val obj =
48-
if (fp.isModule) TestUtils.loadModule(taskDef.fullyQualifiedName,loader)
49-
else TestUtils.newInstance(taskDef.fullyQualifiedName, loader)(Seq())
50-
51-
val props = obj match {
52-
case props: Properties => props.properties.toArray
53-
case prop: Prop => Array("<no name>" -> prop)
51+
val props: Map[String,Prop] = {
52+
val fp = taskDef.fingerprint.asInstanceOf[SubclassFingerprint]
53+
val obj = if (fp.isModule) loadModule(taskDef.fullyQualifiedName,loader)
54+
else newInstance(taskDef.fullyQualifiedName, loader)(Seq())
55+
obj match {
56+
case props: Properties => Map(props.properties: _*)
57+
case prop: Prop => Map("" -> prop)
58+
}
5459
}
5560

5661
def execute(handler: EventHandler, loggers: Array[Logger],
5762
continuation: Array[Task] => Unit
5863
): Unit = continuation(execute(handler,loggers))
64+
}
65+
66+
def rootTask(td: TaskDef) = new BaseTask(td) {
67+
def execute(handler: EventHandler, loggers: Array[Logger]): Array[Task] =
68+
props.toArray map { case (name,_) =>
69+
checkPropTask(new TaskDef(td.fullyQualifiedName, td.fingerprint,
70+
td.explicitlySpecified, Array(new TestSelector(name)))
71+
)
72+
}
73+
}
74+
75+
def checkPropTask(taskDef: TaskDef) = new BaseTask(taskDef) {
76+
val names = taskDef.selectors flatMap {
77+
case ts: TestSelector => Array(ts.testName)
78+
case _ => Array.empty[String]
79+
}
5980

6081
def execute(handler: EventHandler, loggers: Array[Logger]): Array[Task] =
61-
props flatMap { case (name,prop) =>
82+
names flatMap { name =>
6283
import util.Pretty.{pretty, Params}
84+
85+
val prop = props(name)
6386
val result = Test.check(params.withCustomClassLoader(Some(loader)), prop)
6487

6588
val event = new Event {
@@ -100,12 +123,12 @@ private abstract class ScalaCheckRunner(
100123
args.grouped(2).filter(twos => verbosityOpts(twos.head))
101124
.toSeq.headOption.map(_.last).map(_.toInt).getOrElse(0)
102125
val s = if (result.passed) "+" else "!"
103-
val logMsg = s"$s $name: ${pretty(result, Params(verbosity))}"
126+
val n = if (name.isEmpty) taskDef.fullyQualifiedName else name
127+
val logMsg = s"$s $n: ${pretty(result, Params(verbosity))}"
104128
loggers.foreach(l => l.info(logMsg))
105129

106130
Array.empty[Task]
107131
}
108-
109132
}
110133

111134
}

0 commit comments

Comments
 (0)