Skip to content

Commit 2035739

Browse files
authored
Merge pull request #91 from alextu/atual/uniqueid
Add support for UniqueId selectors
2 parents c960d6e + 43df8db commit 2035739

File tree

6 files changed

+103
-26
lines changed

6 files changed

+103
-26
lines changed

build.gradle.kts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,10 @@ dependencies {
5656
compileOnly("org.scalatest:scalatest_2.11:3.3.0-SNAP3")
5757

5858
testImplementation("org.junit.jupiter:junit-jupiter-api:$junitJupiterVersion")
59-
testImplementation("org.junit.platform:junit-platform-launcher:$junitPlatformVersion")
6059
testImplementation("org.junit.jupiter:junit-jupiter-engine:$junitJupiterVersion")
60+
testImplementation("org.junit.jupiter:junit-jupiter-params:$junitJupiterVersion")
61+
testImplementation("org.junit.platform:junit-platform-launcher:$junitPlatformVersion")
62+
testImplementation("org.junit.platform:junit-platform-testkit:$junitPlatformVersion")
6163
testImplementation("org.junit.platform:junit-platform-engine:1.6.0")
6264
testImplementation("org.scalatest:scalatest_$testScalaLibraryVersion:3.3.0-SNAP3")
6365
testImplementation("org.scala-lang:scala-library:$testScalaVersion")

src/main/java/co/helmethair/scalatest/ScalatestEngine.java

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,21 @@
44
import co.helmethair.scalatest.reporter.JUnitReporter;
55
import co.helmethair.scalatest.runtime.Discovery;
66
import co.helmethair.scalatest.runtime.Executor;
7-
import org.junit.platform.engine.*;
7+
import org.junit.platform.engine.ConfigurationParameters;
8+
import org.junit.platform.engine.EngineDiscoveryRequest;
9+
import org.junit.platform.engine.ExecutionRequest;
10+
import org.junit.platform.engine.TestDescriptor;
11+
import org.junit.platform.engine.TestEngine;
12+
import org.junit.platform.engine.UniqueId;
813
import org.junit.platform.engine.discovery.ClassSelector;
9-
import org.scalatest.DoNotDiscover;
10-
import org.scalatest.Suite;
14+
import org.junit.platform.engine.discovery.UniqueIdSelector;
1115

12-
import java.lang.reflect.Modifier;
1316
import java.util.List;
1417
import java.util.Optional;
1518
import java.util.stream.Collectors;
19+
import java.util.stream.Stream;
20+
21+
import static co.helmethair.scalatest.descriptor.ScalatestDescriptor.SUITE_TYPE;
1622

1723
public class ScalatestEngine implements TestEngine {
1824
public static final String ID = "scalatest";
@@ -29,9 +35,12 @@ public String getId() {
2935
public TestDescriptor discover(EngineDiscoveryRequest discoveryRequest, UniqueId uniqueId) {
3036
ScalatestEngineDescriptor engineDescriptor = new ScalatestEngineDescriptor(uniqueId, ID);
3137

32-
List<Class<? extends Suite>> classes = discoverClassSelectors(discoveryRequest);
33-
34-
return runtime.discover(engineDescriptor, classes, Thread.currentThread().getContextClassLoader());
38+
return runtime.discover(engineDescriptor,
39+
Stream.concat(
40+
discoverClassSelectors(discoveryRequest).stream(),
41+
discoverUniqueIdSelectors(discoveryRequest).stream()
42+
).collect(Collectors.toSet()),
43+
Thread.currentThread().getContextClassLoader());
3544
}
3645

3746
@Override
@@ -46,14 +55,28 @@ public void execute(ExecutionRequest executionRequest) {
4655
executor.executeTest(executionRequest.getRootTestDescriptor(), reporter);
4756
}
4857

49-
@SuppressWarnings("unchecked")
50-
private List<Class<? extends Suite>> discoverClassSelectors(EngineDiscoveryRequest dicoveryRequest) {
51-
return dicoveryRequest.getSelectorsByType(ClassSelector.class).stream().map(ClassSelector::getJavaClass)
52-
.filter(c -> !(c.getEnclosingMethod() != null //only local or anonymous classes have an enclosing method
53-
|| c.isSynthetic()
54-
|| Modifier.isAbstract(c.getModifiers())
55-
|| c.getAnnotation(DoNotDiscover.class) != null)
56-
&& Suite.class.isAssignableFrom(c)
57-
).map(c -> ((Class<? extends Suite>) c)).collect(Collectors.toList());
58+
private List<String> discoverUniqueIdSelectors(EngineDiscoveryRequest discoveryRequest) {
59+
return discoveryRequest.getSelectorsByType(UniqueIdSelector.class).stream()
60+
.map(this::getSuite)
61+
.filter(Optional::isPresent)
62+
.map(Optional::get)
63+
.collect(Collectors.toList());
64+
}
65+
66+
private Optional<String> getSuite(UniqueIdSelector u) {
67+
UniqueId uniqueId = u.getUniqueId();
68+
if (uniqueId.hasPrefix(UniqueId.forEngine(ID))) {
69+
UniqueId.Segment segment = uniqueId.getSegments().get(1);
70+
if (SUITE_TYPE.equals(segment.getType())) {
71+
return Optional.of(segment.getValue());
72+
}
73+
}
74+
return Optional.empty();
75+
}
76+
77+
private List<String> discoverClassSelectors(EngineDiscoveryRequest discoveryRequest) {
78+
return discoveryRequest.getSelectorsByType(ClassSelector.class).stream()
79+
.map(ClassSelector::getClassName)
80+
.collect(Collectors.toList());
5881
}
5982
}

src/main/java/co/helmethair/scalatest/descriptor/ScalatestDescriptor.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
public abstract class ScalatestDescriptor implements TestDescriptor {
1414
final static UniqueId ENGINE_ID = UniqueId.forEngine(ScalatestEngine.ID);
1515
static final ConcurrentHashMap<UniqueId, ScalatestDescriptor> descriptorsById = new ConcurrentHashMap<>();
16+
public static final String SUITE_TYPE = "suite";
1617
private final UniqueId id;
1718
private TestDescriptor parentDescriptor = null;
1819
private Set<TestDescriptor> childDescriptors = new HashSet<TestDescriptor>();
@@ -32,11 +33,11 @@ public static Optional<ScalatestDescriptor> findById(UniqueId uniqueId) {
3233
}
3334

3435
static UniqueId testId(String suiteId, String testName) {
35-
return ENGINE_ID.append("suite", suiteId).append("test", testName);
36+
return ENGINE_ID.append(SUITE_TYPE, suiteId).append("test", testName);
3637
}
3738

3839
static UniqueId containerId(String suiteId) {
39-
return ENGINE_ID.append("suite", suiteId);
40+
return ENGINE_ID.append(SUITE_TYPE, suiteId);
4041
}
4142

4243
static UniqueId descriptorId(String suiteId, String testName) {

src/main/java/co/helmethair/scalatest/runtime/Discovery.java

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,31 +7,56 @@
77
import co.helmethair.scalatest.scala.ScalaConversions;
88
import org.junit.platform.engine.TestDescriptor;
99
import org.junit.platform.engine.TestTag;
10+
import org.scalatest.DoNotDiscover;
1011
import org.scalatest.Suite;
1112
import org.scalatest.TagAnnotation;
1213
import scala.Option;
1314

15+
import java.lang.reflect.Modifier;
1416
import java.util.Arrays;
1517
import java.util.Collections;
16-
import java.util.List;
1718
import java.util.Set;
1819
import java.util.stream.Collectors;
1920

21+
import static java.util.Collections.*;
22+
2023
public class Discovery {
2124

22-
public ScalatestEngineDescriptor discover(ScalatestEngineDescriptor engineDescriptor, List<Class<? extends Suite>> classes, ClassLoader classLoader) {
25+
@SuppressWarnings("unchecked")
26+
public ScalatestEngineDescriptor discover(ScalatestEngineDescriptor engineDescriptor, Set<String> classes, ClassLoader classLoader) {
2327
classes.forEach(c -> {
28+
Class<?> aClass = null;
2429
try {
25-
Suite suite = ((Suite) classLoader.loadClass(c.getName()).newInstance());
26-
addSuite(suite, engineDescriptor);
30+
aClass = classLoader.loadClass(c);
31+
if (isScalaSuite(aClass)) {
32+
Suite suite = ((Suite) aClass.newInstance());
33+
addSuite(suite, engineDescriptor);
34+
}
2735
} catch (Throwable e) {
28-
addFailedInit(e, c, engineDescriptor);
36+
if (aClass != null && Suite.class.isAssignableFrom(aClass)) {
37+
addFailedInit(e, (Class<? extends Suite>) aClass, engineDescriptor);
38+
} else {
39+
addFailedInit(e, c, engineDescriptor);
40+
}
2941
}
3042
});
3143

3244
return engineDescriptor;
3345
}
3446

47+
private boolean isScalaSuite(Class<?> c) {
48+
return !(c.getEnclosingMethod() != null //only local or anonymous classes have an enclosing method
49+
|| c.isSynthetic()
50+
|| Modifier.isAbstract(c.getModifiers())
51+
|| c.getAnnotation(DoNotDiscover.class) != null)
52+
&& Suite.class.isAssignableFrom(c);
53+
}
54+
55+
private void addFailedInit(Throwable cause, String className, TestDescriptor parent) {
56+
ScalatestFailedInitDescriptor failed = new ScalatestFailedInitDescriptor(cause, className, emptySet());
57+
linkChild(parent, failed);
58+
}
59+
3560
private void addFailedInit(Throwable cause, Class<? extends Suite> clazz, TestDescriptor parent) {
3661
String className = clazz.getName();
3762
ScalatestFailedInitDescriptor failed = new ScalatestFailedInitDescriptor(cause, className, extractTags(clazz));
@@ -74,6 +99,6 @@ private Set<TestTag> getTags(Suite scalasuite, String testName) {
7499
return ScalaConversions.setAsJavaSet(tagSetOption.get()).stream()
75100
.map(TestTag::create).collect(Collectors.toSet());
76101
}
77-
return Collections.emptySet();
102+
return emptySet();
78103
}
79104
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package co.helmethair.scalatest;
2+
3+
import co.helmethair.scalatest.helper.TestHelpers;
4+
import org.junit.jupiter.params.ParameterizedTest;
5+
import org.junit.jupiter.params.provider.CsvSource;
6+
import org.junit.platform.engine.discovery.DiscoverySelectors;
7+
import org.junit.platform.testkit.engine.EngineTestKit;
8+
9+
public class UniqueIdTest implements TestHelpers {
10+
11+
@ParameterizedTest
12+
@CsvSource({"[engine:scalatest]/[suite:tests.NestedTest], 2, 0",
13+
// For now, it does not support really executing the selected test, it will execute the whole suite
14+
"[engine:scalatest]/[suite:tests.NestedTest]/[test:nested test1], 2, 0",
15+
"[engine:scalatest]/[foo:tests.NestedTest], 0, 0",
16+
"[engine:scalatest]/[suite:tests.UnknownFoo], 0, 1",
17+
})
18+
void handleUniqueId(String id, int successEvents, int failingEvents) {
19+
EngineTestKit
20+
.engine("scalatest")
21+
.selectors(DiscoverySelectors.selectUniqueId(id))
22+
.execute()
23+
.testEvents()
24+
.assertStatistics(stats -> stats.succeeded(successEvents).failed(failingEvents));
25+
}
26+
}

src/test/java/co/helmethair/scalatest/helper/TestHelpers.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public <T extends DiscoverySelector> List<T> getSelectorsByType(Class<T> selecto
5757
if (selectorType == ClassSelector.class) {
5858
return ((List<T>) Arrays.stream(classNames).map(DiscoverySelectors::selectClass).collect(Collectors.toList()));
5959
}
60-
return null;
60+
return Collections.emptyList();
6161
}
6262

6363
@Override

0 commit comments

Comments
 (0)