@@ -12,31 +12,47 @@ import scala.tools.nsc.Properties.{ versionMsg, propOrFalse, setProp }
12
12
import scala .collection .{ mutable , immutable }
13
13
import TestKinds ._
14
14
import scala .reflect .internal .util .Collections .distinctBy
15
- import scala .tools .cmd .{ CommandLine , CommandLineParser , Instance }
16
15
17
- abstract class AbstractRunner (argstr : String ) extends {
18
- val parsed = RunnerSpec .creator(CommandLineParser tokenize argstr)
19
- } with RunnerSpec with Instance {
16
+ abstract class AbstractRunner {
17
+
18
+ val config : RunnerSpec .Config
19
+
20
+ lazy val nestUI : NestUI = new NestUI (
21
+ verbose = config.optVerbose,
22
+ debug = config.optDebug || propOrFalse(" partest.debug" ),
23
+ terse = config.optTerse,
24
+ diffOnFail = config.optShowDiff,
25
+ logOnFail = config.optShowLog,
26
+ colorEnabled = colorEnabled
27
+ )
20
28
21
29
val suiteRunner : SuiteRunner
22
30
23
- import suiteRunner ._
24
- import NestUI ._
25
- import NestUI .color ._
31
+ protected val printSummary = true
32
+ protected val partestCmd = " test/partest"
33
+ protected val colorEnabled = sys.props contains " partest.colors"
34
+
35
+ private [this ] var totalTests = 0
36
+ private [this ] val passedTests = mutable.ListBuffer [TestState ]()
37
+ private [this ] val failedTests = mutable.ListBuffer [TestState ]()
38
+
39
+ private [this ] var summarizing = false
40
+ private [this ] var elapsedMillis = 0L
41
+ private [this ] var expectedFailures = 0
26
42
27
- private var totalTests = 0
28
- private val passedTests = mutable.ListBuffer [TestState ]()
29
- private val failedTests = mutable.ListBuffer [TestState ]()
43
+ import nestUI ._
44
+ import nestUI .color ._
30
45
31
- def comment (s : String ) = echo(magenta(" # " + s))
32
- def levyJudgment () = {
46
+ private [this ] def comment (s : String ) = echo(magenta(" # " + s))
47
+
48
+ private [this ] def levyJudgment () = {
33
49
if (totalTests == 0 ) echoMixed(" No tests to run." )
34
50
else if (elapsedMillis == 0 ) echoMixed(" Test Run ABORTED" )
35
51
else if (isSuccess) echoPassed(" Test Run PASSED" )
36
52
else echoFailed(" Test Run FAILED" )
37
53
}
38
54
39
- def passFailString (passed : Int , failed : Int , skipped : Int ): String = {
55
+ private [ this ] def passFailString (passed : Int , failed : Int , skipped : Int ): String = {
40
56
val total = passed + failed + skipped
41
57
val isSuccess = failed == 0
42
58
def p0 = s " $passed/ $total"
@@ -47,12 +63,7 @@ abstract class AbstractRunner(argstr: String) extends {
47
63
oempty(p, f, s) mkString " , "
48
64
}
49
65
50
- protected var partestCmd = " test/partest"
51
- protected var summarizing = false
52
- protected var printSummary = true
53
- private var elapsedMillis = 0L
54
- private var expectedFailures = 0
55
- protected def isSuccess = failedTests.size == expectedFailures
66
+ private [this ] def isSuccess = failedTests.size == expectedFailures
56
67
57
68
def issueSummaryReport () {
58
69
// Don't run twice
@@ -69,7 +80,7 @@ abstract class AbstractRunner(argstr: String) extends {
69
80
val message = passFail + elapsed
70
81
71
82
if (failed0.nonEmpty) {
72
- if (isPartestVerbose ) {
83
+ if (nestUI.verbose ) {
73
84
echo(bold(cyan(" ##### Transcripts from failed tests #####\n " )))
74
85
failed0 foreach { state =>
75
86
comment(partestCmd + " " + state.testFile)
@@ -89,97 +100,93 @@ abstract class AbstractRunner(argstr: String) extends {
89
100
}
90
101
}
91
102
92
- def run (): Unit = {
93
- if (optDebug || propOrFalse(" partest.debug" )) NestUI .setDebug()
94
- if (optVerbose) NestUI .setVerbose()
95
- if (optTerse) NestUI .setTerse()
96
- if (optShowDiff) NestUI .setDiffOnFail()
97
- if (optShowLog) NestUI .setLogOnFail()
98
-
99
- // Early return on no args, version, or invalid args
100
- if (optVersion) return echo(versionMsg)
101
- if (optHelp) return NestUI .usage()
102
-
103
- val (individualTests, invalid) = parsed.residualArgs map (p => Path (p)) partition denotesTestPath
104
- if (invalid.nonEmpty) {
105
- if (isPartestVerbose)
106
- invalid foreach (p => echoWarning(s " Discarding invalid test path " + p))
107
- else if (! isPartestTerse)
108
- echoWarning(s " Discarding ${invalid.size} invalid test paths " )
109
- }
103
+ /** Run the tests and return the success status */
104
+ def run (): Boolean = {
105
+ if (config.optVersion) echo(versionMsg)
106
+ else if (config.optHelp) nestUI.usage()
107
+ else {
108
+ val (individualTests, invalid) = config.parsed.residualArgs map (p => Path (p)) partition denotesTestPath
109
+ if (invalid.nonEmpty) {
110
+ if (nestUI.verbose)
111
+ invalid foreach (p => echoWarning(s " Discarding invalid test path " + p))
112
+ else if (! nestUI.terse)
113
+ echoWarning(s " Discarding ${invalid.size} invalid test paths " )
114
+ }
110
115
111
- optTimeout foreach (x => setProp(" partest.timeout" , x))
116
+ config. optTimeout foreach (x => setProp(" partest.timeout" , x))
112
117
113
- if (! isPartestTerse )
114
- NestUI echo banner
118
+ if (! nestUI.terse )
119
+ nestUI.echo(suiteRunner. banner)
115
120
116
- val partestTests = (
117
- if (optSelfTest) TestKinds .testsForPartest
118
- else Nil
119
- )
121
+ val partestTests = (
122
+ if (config. optSelfTest) TestKinds .testsForPartest
123
+ else Nil
124
+ )
120
125
121
- val grepExpr = optGrep getOrElse " "
126
+ val grepExpr = config. optGrep getOrElse " "
122
127
123
- // If --grep is given we suck in every file it matches.
124
- // TODO: intersect results of grep with specified kinds, if any
125
- val greppedTests = if (grepExpr == " " ) Nil else {
126
- val paths = grepFor(grepExpr)
127
- if (paths.isEmpty)
128
- echoWarning(s " grep string ' $grepExpr' matched no tests. \n " )
128
+ // If --grep is given we suck in every file it matches.
129
+ // TODO: intersect results of grep with specified kinds, if any
130
+ val greppedTests = if (grepExpr == " " ) Nil else {
131
+ val paths = grepFor(grepExpr)
132
+ if (paths.isEmpty)
133
+ echoWarning(s " grep string ' $grepExpr' matched no tests. \n " )
129
134
130
- paths.sortBy(_.toString)
131
- }
135
+ paths.sortBy(_.toString)
136
+ }
132
137
133
- val isRerun = optFailed
134
- val rerunTests = if (isRerun) TestKinds .failedTests else Nil
135
- def miscTests = partestTests ++ individualTests ++ greppedTests ++ rerunTests
136
-
137
- val givenKinds = standardKinds filter parsed.isSet
138
- val kinds = (
139
- if (givenKinds.nonEmpty) givenKinds
140
- else if (miscTests.isEmpty) standardKinds // If no kinds, --grep, or individual tests were given, assume --all
141
- else Nil
142
- )
143
- val kindsTests = kinds flatMap testsFor
144
-
145
- def testContributors = {
146
- List (
147
- if (partestTests.isEmpty) " " else " partest self-tests" ,
148
- if (rerunTests.isEmpty) " " else " previously failed tests" ,
149
- if (kindsTests.isEmpty) " " else s " ${kinds.size} named test categories " ,
150
- if (greppedTests.isEmpty) " " else s " ${greppedTests.size} tests matching ' $grepExpr' " ,
151
- if (individualTests.isEmpty) " " else " specified tests"
152
- ) filterNot (_ == " " ) mkString " , "
153
- }
138
+ val isRerun = config. optFailed
139
+ val rerunTests = if (isRerun) TestKinds .failedTests else Nil
140
+ def miscTests = partestTests ++ individualTests ++ greppedTests ++ rerunTests
141
+
142
+ val givenKinds = standardKinds filter config. parsed.isSet
143
+ val kinds = (
144
+ if (givenKinds.nonEmpty) givenKinds
145
+ else if (miscTests.isEmpty) standardKinds // If no kinds, --grep, or individual tests were given, assume --all
146
+ else Nil
147
+ )
148
+ val kindsTests = kinds flatMap testsFor
149
+
150
+ def testContributors = {
151
+ List (
152
+ if (partestTests.isEmpty) " " else " partest self-tests" ,
153
+ if (rerunTests.isEmpty) " " else " previously failed tests" ,
154
+ if (kindsTests.isEmpty) " " else s " ${kinds.size} named test categories " ,
155
+ if (greppedTests.isEmpty) " " else s " ${greppedTests.size} tests matching ' $grepExpr' " ,
156
+ if (individualTests.isEmpty) " " else " specified tests"
157
+ ) filterNot (_ == " " ) mkString " , "
158
+ }
154
159
155
- val allTests : Array [Path ] = distinctBy(miscTests ++ kindsTests)(_.toCanonical) sortBy (_.toString) toArray
156
- val grouped = (allTests groupBy kindOf).toArray sortBy (x => standardKinds indexOf x._1)
160
+ val allTests : Array [Path ] = distinctBy(miscTests ++ kindsTests)(_.toCanonical) sortBy (_.toString) toArray
161
+ val grouped = (allTests groupBy kindOf).toArray sortBy (x => standardKinds indexOf x._1)
157
162
158
- totalTests = allTests.size
159
- expectedFailures = propOrNone(" partest.errors" ) match {
160
- case Some (num) => num.toInt
161
- case _ => 0
162
- }
163
- val expectedFailureMessage = if (expectedFailures == 0 ) " " else s " (expecting $expectedFailures to fail) "
164
- echo(s " Selected $totalTests tests drawn from $testContributors$expectedFailureMessage\n " )
165
-
166
- val (_, millis) = timed {
167
- for ((kind, paths) <- grouped) {
168
- val num = paths.size
169
- val ss = if (num == 1 ) " " else " s"
170
- comment(s " starting $num test $ss in $kind" )
171
- val results = runTestsForFiles(paths map (_.jfile.getAbsoluteFile), kind)
172
- val (passed, failed) = results partition (_.isOk)
173
-
174
- passedTests ++= passed
175
- failedTests ++= failed
176
- if (failed.nonEmpty) {
177
- comment(passFailString(passed.size, failed.size, 0 ) + " in " + kind)
163
+ totalTests = allTests.size
164
+ expectedFailures = propOrNone(" partest.errors" ) match {
165
+ case Some (num) => num.toInt
166
+ case _ => 0
167
+ }
168
+ val expectedFailureMessage = if (expectedFailures == 0 ) " " else s " (expecting $expectedFailures to fail) "
169
+ echo(s " Selected $totalTests tests drawn from $testContributors$expectedFailureMessage\n " )
170
+
171
+ val (_, millis) = timed {
172
+ for ((kind, paths) <- grouped) {
173
+ val num = paths.size
174
+ val ss = if (num == 1 ) " " else " s"
175
+ comment(s " starting $num test $ss in $kind" )
176
+ val results = suiteRunner.runTestsForFiles(paths map (_.jfile.getAbsoluteFile), kind)
177
+ val (passed, failed) = results partition (_.isOk)
178
+
179
+ passedTests ++= passed
180
+ failedTests ++= failed
181
+ if (failed.nonEmpty) {
182
+ comment(passFailString(passed.size, failed.size, 0 ) + " in " + kind)
183
+ }
184
+ echo(" " )
178
185
}
179
- echo(" " )
180
186
}
187
+ this .elapsedMillis = millis
188
+ issueSummaryReport()
181
189
}
182
- this .elapsedMillis = millis
183
- issueSummaryReport()
190
+ isSuccess
184
191
}
185
192
}
0 commit comments