From d064bc204f66a1fdb8d6f77e6ef637798f4c4576 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Sierszen=CC=81?= Date: Mon, 27 Jun 2022 10:11:47 +0200 Subject: [PATCH] Fixed baseline tests, downgraded Java version MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Krzysztof Sierszeń --- archunit-junit/junit5/engine/build.gradle | 2 +- .../engines/jupiter/JUnitJupiterEngine.java | 50 +++++++++++++++++-- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/archunit-junit/junit5/engine/build.gradle b/archunit-junit/junit5/engine/build.gradle index 4b5fceb5f2..69eb1d25ec 100644 --- a/archunit-junit/junit5/engine/build.gradle +++ b/archunit-junit/junit5/engine/build.gradle @@ -5,7 +5,7 @@ plugins { ext.moduleName = 'com.tngtech.archunit.junit5.engine' -ext.minimumJavaVersion = JavaVersion.VERSION_1_9 +ext.minimumJavaVersion = JavaVersion.VERSION_1_8 dependencies { api project(path: ':archunit') diff --git a/archunit-tooling-test/src/main/java/com/tngtech/archunit/tooling/engines/jupiter/JUnitJupiterEngine.java b/archunit-tooling-test/src/main/java/com/tngtech/archunit/tooling/engines/jupiter/JUnitJupiterEngine.java index db37b5127f..275fefe28f 100644 --- a/archunit-tooling-test/src/main/java/com/tngtech/archunit/tooling/engines/jupiter/JUnitJupiterEngine.java +++ b/archunit-tooling-test/src/main/java/com/tngtech/archunit/tooling/engines/jupiter/JUnitJupiterEngine.java @@ -1,9 +1,13 @@ package com.tngtech.archunit.tooling.engines.jupiter; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Arrays; import java.util.List; import java.util.Map; -import java.util.ServiceLoader; +import java.util.Optional; import java.util.stream.Collectors; +import java.util.stream.Stream; import java.util.stream.StreamSupport; import com.tngtech.archunit.junit.engine_api.FieldSource; @@ -28,7 +32,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static com.tngtech.archunit.junit.engine_api.FieldSelector.selectField; import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass; +import static org.junit.platform.engine.discovery.DiscoverySelectors.selectMethod; public enum JUnitJupiterEngine implements TestEngine { INSTANCE; @@ -59,11 +65,11 @@ private org.junit.platform.engine.TestEngine[] manuallyLoadCorrectTestEngines(Te } private LauncherDiscoveryRequest toDiscoveryRequest(TestFile testFile) { - DiscoverySelector selector = toTestClassSelector(testFile); - LOG.info("Executing request with selectors {}", selector); + List selectors = toSelectors(testFile) + .collect(Collectors.toList()); + LOG.info("Executing request with selectors {}", selectors); LauncherDiscoveryRequestBuilder builder = LauncherDiscoveryRequestBuilder.request() - .selectors() - .selectors(selector); + .selectors(selectors); if (testFile.hasTestCasesFilter()) { String testCaseFilter = toTestCaseFilter(testFile); builder = builder.configurationParameter(ARCHUNIT_INCLUDES_PARAMETER_NAME, testCaseFilter); @@ -76,10 +82,44 @@ private String toTestCaseFilter(TestFile testFile) { return testFile.getTestCases().stream().map((testFile.getFixture().getSimpleName() + ".")::concat).collect(Collectors.joining(",")); } + private Stream toSelectors(TestFile testFile) { + if (shouldApplyTestMethodNameSelector(testFile) && testFile.hasTestCasesFilter()) { + return testFile.getTestCases().stream().map(testCase -> toSelector(testFile.getFixture(), testCase)); + } + return Stream.of(toTestClassSelector(testFile)); + } + private DiscoverySelector toTestClassSelector(TestFile testFile) { return selectClass(testFile.getFixture()); } + private boolean shouldApplyTestMethodNameSelector(TestFile testFile) { + // skip for ArchUnit tests because archunit.junit.includeTestsMatching will be used instead + return testFile.getFixture().getSimpleName().contains("Regular"); + } + + private DiscoverySelector toSelector(Class fixture, String testCase) { + return getMethodByName(fixture, testCase) + .map(method -> selectMethod(fixture, method)) + .orElseGet(() -> getFieldByName(fixture, testCase) + .map(field -> selectField(fixture, field.getName())) + .orElseThrow(RuntimeException::new)); + } + + private Optional getMethodByName(Class owner, String name) { + return Arrays.stream(owner.getDeclaredMethods()) + .filter(method -> name.equals(method.getName())) + .findFirst(); + } + + private Optional getFieldByName(Class owner, String name) { + try { + return Optional.of(owner.getDeclaredField(name)); + } catch (NoSuchFieldException e) { + return Optional.empty(); + } + } + private static class TestExecutionCollector implements TestExecutionListener { private final TestReport report = new TestReport();