Skip to content

Commit

Permalink
Merge branch 'main' into junit_5_11_0
Browse files Browse the repository at this point in the history
  • Loading branch information
eed3si9n authored Aug 16, 2024
2 parents a472175 + d9537f9 commit c87ad86
Show file tree
Hide file tree
Showing 11 changed files with 91 additions and 56 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,7 @@
import com.github.sbt.junit.jupiter.internal.listeners.TreePrintingTestListener;
import com.github.sbt.junit.jupiter.internal.options.Options;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import org.junit.platform.engine.TestSource;
Expand Down Expand Up @@ -327,7 +323,9 @@ private List<TestIdentifier> getPath(TestPlan testPlan, TestIdentifier identifie
List<TestIdentifier> result = new ArrayList<>();

do {
result.add(identifier);
if (identifier.getSource().isPresent()) {
result.add(identifier);
}
identifier = testPlan.getParent(identifier).orElse(null);
} while (null != identifier);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,7 @@
import org.junit.platform.engine.TestDescriptor;
import org.junit.platform.engine.TestExecutionResult;
import org.junit.platform.launcher.TestIdentifier;
import sbt.testing.Event;
import sbt.testing.EventHandler;
import sbt.testing.Fingerprint;
import sbt.testing.OptionalThrowable;
import sbt.testing.Selector;
import sbt.testing.Status;
import sbt.testing.SuiteSelector;
import sbt.testing.TestSelector;
import sbt.testing.*;

/**
* Dispatches test events to SBT.
Expand Down Expand Up @@ -170,17 +163,13 @@ static Selector toSelector(TaskName name) {
if (null != name.nestedSuiteId()) {
if (null != name.testName()) {

// FIXME: as soon as JUnitXmlTestsListener supports this
// return new NestedTestSelector(name.nestedSuiteId(), name.testName());
return new TestSelector(name.nestedSuiteId() + "#" + testName);
return new NestedTestSelector(name.nestedSuiteId(), name.testName());
}

// FIXME: as soon as JUnitXmlTestsListener supports this
// return new NestedSuiteSelector(name.nestedSuiteId());
return new TestSelector(name.nestedSuiteId());
return new NestedSuiteSelector(name.nestedSuiteId());
}

if (null != name.testName()) {
if (null != testName) {

return new TestSelector(testName);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ static TaskName of(String testSuite, String testName) {
* @return A task name representing the given identifier.
*/
static TaskName of(String testSuite, TestIdentifier identifier) {
final String removedJunit5SuiteName = removeJunit5SuiteName(testSuite, identifier);

TaskName result = new TaskName();
result.fullyQualifiedName = testSuite;
Expand All @@ -94,7 +95,7 @@ static TaskName of(String testSuite, TestIdentifier identifier) {
if (testSource instanceof ClassSource) {

ClassSource classSource = (ClassSource) testSource;
result.nestedSuiteId = nestedSuiteId(testSuite, classSource.getClassName());
result.nestedSuiteId = nestedSuiteId(removedJunit5SuiteName, classSource.getClassName());
}

if (testSource instanceof MethodSource) {
Expand All @@ -109,6 +110,31 @@ static TaskName of(String testSuite, TestIdentifier identifier) {
return result;
}

/**
* Removes a leading JUnit 5 suite name from the test suite name, if present.
*
* @param testSuite The name of the enclosing test suite.
* @param identifier The test identifier.
* @return The suite identifier.
*/
private static String removeJunit5SuiteName(String testSuite, TestIdentifier identifier) {
final List<UniqueId.Segment> suiteSegments =
identifier.getUniqueIdObject().getSegments().stream()
.filter(segment -> segment.getType().equals("suite"))
.collect(Collectors.toList());

if (suiteSegments.isEmpty()) {
return testSuite;
}

final String suiteIdentifier = suiteSegments.get(0).getValue();
if (!testSuite.startsWith(suiteIdentifier)) {
throw new RuntimeException(
"Test: " + testSuite + " does not start with JUnit 5 suite: " + suiteIdentifier);
}
return testSuite.substring(suiteIdentifier.length());
}

/**
* Extracts a nested test suite identifier if available.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@
import junit.TestRunner;
import org.hamcrest.FeatureMatcher;
import org.hamcrest.Matcher;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import sbt.testing.Event;
Expand Down Expand Up @@ -135,7 +134,6 @@ public void shouldReportDynamicTests() {
}

@Test
@Ignore("Does not work with JUnitXmlTestsListener currently")
public void shouldReportNestedTestsCorrectly() {

testRunner.withArgs("-v");
Expand All @@ -152,26 +150,6 @@ public void shouldReportNestedTestsCorrectly() {
assertThat(result, hasItem(selector(testName(equalTo(testName)))));
}

/*
* Hack until NestedTestSelector is reported correctly by JUnitXmlTestsListener
*/
@Test
public void shouldReportNestedTestsHackForJUnitXmlTestsListener() {

testRunner.withArgs("-v");
testRunner.execute(NestedTests.class);

List<Event> result = testRunner.eventHandler().byStatus(Status.Success);

String suiteName = ".event.DispatcherSampleTests$NestedTests";
String testName = "$First#testOfFirstNestedClass()";

assertThat(result, hasSize(1));
assertThat(result, hasItem(fullyQualifiedName(endsWith(suiteName))));
assertThat(result, hasItem(selector(instanceOf(TestSelector.class))));
assertThat(result, hasItem(selector(testName(equalTo(testName)))));
}

private FeatureMatcher<Event, String> fullyQualifiedName(Matcher<String> matcher) {
return new FeatureMatcher<Event, String>(matcher, "fullyQualifiedName", "fullyQualifiedName") {
@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,22 +29,18 @@ public static Object[][] samples() {
// @formatter:off

return new Object[][] {
{"jupiter.samples.NestedTests", "testOfFirstNestedClass", "{0}$First#{1}()"},
{"jupiter.samples.RepeatedTests", "repeatedTest", "{0}#{1}():#1"},
{"jupiter.samples.NestedTests", "testOfFirstNestedClass", "$First#{1}()"},
{"jupiter.samples.RepeatedTests", "repeatedTest", "#{1}():#1"},
{
"jupiter.samples.RepeatedTests",
"repeatedTestWithRepetitionInfo",
"{0}#{1}(org.junit.jupiter.api.RepetitionInfo):#1"
"#{1}(org.junit.jupiter.api.RepetitionInfo):#1"
},
{"jupiter.samples.SimpleTests", "firstTestMethod", "{0}#{1}()"},
{
"jupiter.samples.SimpleTests",
"testWithParameter",
"{0}#{1}(org.junit.jupiter.api.TestInfo)"
},
{"jupiter.samples.VintageTests", "vintageTestMethod", "{0}#{1}"},
{"jupiter.samples.VintageEnclosedTests", "testMethod", "{0}$NestedTest#{1}"},
{"jupiter.samples.VintageParameterizedTests", "testParameters", "{0}#{1}[A-65]"}
{"jupiter.samples.SimpleTests", "firstTestMethod", "#{1}()"},
{"jupiter.samples.SimpleTests", "testWithParameter", "#{1}(org.junit.jupiter.api.TestInfo)"},
{"jupiter.samples.VintageTests", "vintageTestMethod", "#{1}"},
{"jupiter.samples.VintageEnclosedTests", "testMethod", "$NestedTest#{1}"},
{"jupiter.samples.VintageParameterizedTests", "testParameters", "#{1}[A-65]"}
};

// @formatter:on
Expand Down
13 changes: 13 additions & 0 deletions src/plugin/src/sbt-test/basic/suite-demo/build.sbt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
val junit = Def.setting { "org.junit.jupiter" % "junit-jupiter-api" % JupiterKeys.junitJupiterVersion.value }
val junitEngine = Def.setting { "org.junit.jupiter" % "junit-jupiter-engine" % JupiterKeys.junitJupiterVersion.value }
val junitRunner = Def.setting { "org.junit.platform" % "junit-platform-runner" % JupiterKeys.junitPlatformVersion.value }
val junitSuiteEngine = Def.setting { "org.junit.platform" % "junit-platform-suite-engine" % JupiterKeys.junitPlatformVersion.value }

name := "test-project"
libraryDependencies ++= Seq(
junit.value % Test,
junitEngine.value % Test,
junitRunner.value % Test,
junitSuiteEngine.value % Test,
"com.github.sbt.junit" % "jupiter-interface" % JupiterKeys.jupiterVersion.value % Test,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
addSbtPlugin("com.github.sbt.junit" % "sbt-jupiter-interface" % sys.props("project.version"))
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package example.foo;

public class A {
public static String get() {
return "Test";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package example;

import org.junit.platform.suite.api.IncludeClassNamePatterns;
import org.junit.platform.suite.api.SelectPackages;
import org.junit.platform.suite.api.Suite;

@Suite
@SelectPackages("example.foo")
@IncludeClassNamePatterns({".*Test"})
public class TestSuite {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package example.foo;

import static org.junit.jupiter.api.Assertions.assertEquals;

import org.junit.jupiter.api.Test;

class ATest {

@Test
void testGet() {
assertEquals("Test", A.get());
}

}
1 change: 1 addition & 0 deletions src/plugin/src/sbt-test/basic/suite-demo/test
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
> test

0 comments on commit c87ad86

Please sign in to comment.