10
10
package org .scalacheck
11
11
12
12
import sbt .testing ._
13
- import org .scalajs .testinterface .TestUtils
13
+ import org .scalajs .testinterface .TestUtils .{ loadModule , newInstance }
14
14
import scala .language .reflectiveCalls
15
15
import java .util .concurrent .atomic .AtomicInteger
16
16
@@ -30,36 +30,59 @@ private abstract class ScalaCheckRunner(
30
30
case None => throw new Exception (s " Invalid ScalaCheck args " )
31
31
}
32
32
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
+ }
35
42
36
43
def serializeTask (task : Task , serializer : TaskDef => String ) =
37
44
serializer(task.taskDef)
38
45
39
- def tasks (taskDefs : Array [TaskDef ]): Array [Task ] =
40
- taskDefs.map(ScalaCheckTask )
46
+ def tasks (taskDefs : Array [TaskDef ]): Array [Task ] = taskDefs.map(rootTask)
41
47
42
- case class ScalaCheckTask ( taskDef : TaskDef ) extends Task {
48
+ abstract class BaseTask ( override val taskDef : TaskDef ) extends Task {
43
49
val tags : Array [String ] = Array ()
44
50
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
+ }
54
59
}
55
60
56
61
def execute (handler : EventHandler , loggers : Array [Logger ],
57
62
continuation : Array [Task ] => Unit
58
63
): 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
+ }
59
80
60
81
def execute (handler : EventHandler , loggers : Array [Logger ]): Array [Task ] =
61
- props flatMap { case ( name,prop) =>
82
+ names flatMap { name =>
62
83
import util .Pretty .{pretty , Params }
84
+
85
+ val prop = props(name)
63
86
val result = Test .check(params.withCustomClassLoader(Some (loader)), prop)
64
87
65
88
val event = new Event {
@@ -100,12 +123,12 @@ private abstract class ScalaCheckRunner(
100
123
args.grouped(2 ).filter(twos => verbosityOpts(twos.head))
101
124
.toSeq.headOption.map(_.last).map(_.toInt).getOrElse(0 )
102
125
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))}"
104
128
loggers.foreach(l => l.info(logMsg))
105
129
106
130
Array .empty[Task ]
107
131
}
108
-
109
132
}
110
133
111
134
}
0 commit comments