File tree 9 files changed +120
-30
lines changed
javalib/testing/1-test-suite
kotlinlib/testing/1-test-suite
scalalib/testing/1-test-suite
scalalib/test/resources/testrunner/doneMessageFailure/src
testrunner/src/mill/testrunner
9 files changed +120
-30
lines changed Original file line number Diff line number Diff line change @@ -27,3 +27,5 @@ object bar extends JavaModule {
27
27
)
28
28
}
29
29
}
30
+
31
+ //// SNIPPET:RUNSINGLE
Original file line number Diff line number Diff line change
1
+ package foo ;
2
+
3
+ import static org .junit .Assert .assertTrue ;
4
+ import static org .mockito .Mockito .*;
5
+
6
+ import org .junit .Test ;
7
+
8
+ public class FooMoreTests {
9
+
10
+ @ Test
11
+ public void hello () {
12
+ String result = new Foo ().hello ();
13
+ assertTrue (result .startsWith ("Hello" ));
14
+ }
15
+
16
+ @ Test
17
+ public void world () {
18
+ String result = new Foo ().hello ();
19
+ assertTrue (result .endsWith ("World" ));
20
+ }
21
+
22
+ @ Test
23
+ public void testMockito () {
24
+ Foo mockFoo = mock (Foo .class );
25
+
26
+ when (mockFoo .hello ()).thenReturn ("Hello Mockito World" );
27
+
28
+ String result = mockFoo .hello ();
29
+
30
+ assertTrue (result .equals ("Hello Mockito World" ));
31
+ verify (mockFoo ).hello ();
32
+ }
33
+ }
Original file line number Diff line number Diff line change @@ -43,3 +43,5 @@ object bar extends KotlinModule {
43
43
def kotlincOptions = super.kotlincOptions() ++ Seq("-jvm-target", "11")
44
44
}
45
45
}
46
+
47
+ //// SNIPPET:RUNSINGLE
Original file line number Diff line number Diff line change
1
+ package foo
2
+
3
+ import io.kotest.core.spec.style.FunSpec
4
+ import io.kotest.matchers.shouldBe
5
+ import io.kotest.matchers.string.shouldEndWith
6
+ import io.kotest.matchers.string.shouldStartWith
7
+ import org.mockito.kotlin.doReturn
8
+ import org.mockito.kotlin.mock
9
+ import org.mockito.kotlin.verify
10
+ import org.mockito.kotlin.whenever
11
+
12
+ class FooMoreTests :
13
+ FunSpec ({
14
+
15
+ test(" hello" ) {
16
+ val result = Foo ().hello()
17
+ result shouldStartWith " Hello"
18
+ }
19
+
20
+ test(" world" ) {
21
+ val result = Foo ().hello()
22
+ result shouldEndWith " World"
23
+ }
24
+
25
+ test(" mockito" ) {
26
+ val mockFoo = mock<Foo >()
27
+
28
+ whenever(mockFoo.hello()) doReturn " Hello Mockito World"
29
+
30
+ val result = mockFoo.hello()
31
+
32
+ result shouldBe " Hello Mockito World"
33
+ verify(mockFoo).hello()
34
+ }
35
+ })
Original file line number Diff line number Diff line change @@ -134,6 +134,7 @@ object `package` extends RootModule with Module {
134
134
"kotest_filter_tests='hello' kotest_filter_specs='bar.BarTests' ./mill bar.test"
135
135
)
136
136
.replace("compiling 1 ... source...", "Compiling 1 ... source...")
137
+ .replace("compiling 2 ... source...", "Compiling 2 ... source...")
137
138
case _ => line
138
139
}
139
140
}
Original file line number Diff line number Diff line change @@ -28,11 +28,13 @@ object foo extends ScalaModule {
28
28
compiling 1 ... source...
29
29
30
30
> mill foo.test.compile
31
- compiling 1 ... source...
31
+ compiling 2 ... source...
32
32
33
33
> mill foo.test.testForked
34
34
...foo.FooTests...hello ...
35
35
...foo.FooTests...world ...
36
+ ...foo.FooMoreTests...hello ...
37
+ ...foo.FooMoreTests...world ...
36
38
37
39
> mill foo.test # same as above, `.test` is the default task for the `test` module
38
40
...foo.FooTests...hello ...
@@ -131,6 +133,16 @@ object bar extends ScalaModule {
131
133
// `foo.test` in the command line. e.g. {utest-github-url}[uTest]
132
134
// lets you pass in a selector to decide which test to run, which in Mill would be:
133
135
136
+ //// SNIPPET:RUNSINGLE
137
+ /** Usage
138
+
139
+ > mill foo.test foo.FooMoreTests
140
+ ...foo.FooMoreTests...hello ...
141
+
142
+ */
143
+
144
+ //// SNIPPET:END
145
+
134
146
/** Usage
135
147
136
148
> mill bar.test bar.BarTests.hello
Original file line number Diff line number Diff line change
1
+ package foo
2
+ import utest ._
3
+ object FooMoreTests extends TestSuite {
4
+ def tests = Tests {
5
+ test(" hello" ) {
6
+ val result = Foo .hello()
7
+ assert(result.startsWith(" Hello" ))
8
+ result
9
+ }
10
+ test(" world" ) {
11
+ val result = Foo .hello()
12
+ assert(result.endsWith(" World" ))
13
+ result
14
+ }
15
+ }
16
+ }
Original file line number Diff line number Diff line change @@ -14,25 +14,18 @@ class DoneMessageFailureFramework extends Framework {
14
14
def done () = " test failure done message"
15
15
def remoteArgs () = Array .empty
16
16
def tasks (taskDefs : Array [TaskDef ]) = Array (new Task {
17
- def taskDef (): TaskDef = taskDefs.head
17
+ def taskDef (): TaskDef = taskDefs.headOption.getOrElse( null )
18
18
def execute (
19
19
eventHandler : EventHandler ,
20
20
loggers : Array [Logger ]
21
21
): Array [Task ] = {
22
22
eventHandler.handle(new Event {
23
-
24
23
override def fullyQualifiedName (): String = " foo.bar"
25
-
26
24
override def fingerprint (): Fingerprint = new Fingerprint {}
27
-
28
25
override def selector (): Selector = new TestSelector (" foo.bar" )
29
-
30
26
override def status (): Status = Status .Failure
31
-
32
27
override def throwable (): OptionalThrowable = new OptionalThrowable ()
33
-
34
28
override def duration (): Long = 0L
35
-
36
29
})
37
30
Array .empty
38
31
}
Original file line number Diff line number Diff line change @@ -120,28 +120,24 @@ import java.util.concurrent.atomic.AtomicBoolean
120
120
val runner = framework.runner(args.toArray, Array [String ](), cl)
121
121
val testClasses = discoverTests(cl, framework, testClassfilePath)
122
122
123
- val filteredTestClasses = testClasses.iterator.filter { case (cls, _) =>
124
- classFilter(cls)
125
- }.toArray
126
-
127
- val tasksArr = // each test class can have multiple test tasks ==> array of test classes will have this signature
128
- if (filteredTestClasses.isEmpty) {
129
- // We still need to run runner's tasks on empty array
130
- Array (runner.tasks(Array .empty))
131
- } else {
132
- filteredTestClasses.map { case (cls, fingerprint) =>
133
- runner.tasks(
134
- Array (new TaskDef (
135
- cls.getName.stripSuffix(" $" ),
136
- fingerprint,
137
- false ,
138
- Array (new SuiteSelector )
139
- ))
140
- )
141
- }
142
- }
123
+ val tasks = runner.tasks(
124
+ for ((cls, fingerprint) <- testClasses.iterator.toArray if classFilter(cls))
125
+ yield new TaskDef (
126
+ cls.getName.stripSuffix(" $" ),
127
+ fingerprint,
128
+ false ,
129
+ Array (new SuiteSelector )
130
+ )
131
+ )
132
+
133
+ def nameOpt (t : Task ) = Option (t.taskDef()).map(_.fullyQualifiedName())
134
+ val groupedTasks = tasks
135
+ .groupBy(nameOpt)
136
+ .values
137
+ .toArray
138
+ .sortBy(_.headOption.map(nameOpt))
143
139
144
- (runner, tasksArr )
140
+ (runner, groupedTasks )
145
141
}
146
142
147
143
private def executeTasks (
You can’t perform that action at this time.
0 commit comments