|
10 | 10 |
|
11 | 11 | package org.junit.platform.suite.engine;
|
12 | 12 |
|
| 13 | +import static java.util.function.Predicate.isEqual; |
| 14 | +import static java.util.stream.Collectors.joining; |
13 | 15 | import static org.junit.platform.commons.support.AnnotationSupport.findAnnotation;
|
| 16 | +import static org.junit.platform.commons.util.FunctionUtils.where; |
14 | 17 | import static org.junit.platform.suite.commons.SuiteLauncherDiscoveryRequestBuilder.request;
|
15 | 18 |
|
16 | 19 | import java.lang.reflect.Method;
|
17 | 20 | import java.util.List;
|
| 21 | +import java.util.function.BiFunction; |
| 22 | +import java.util.function.Predicate; |
18 | 23 |
|
19 | 24 | import org.junit.platform.commons.JUnitException;
|
20 | 25 | import org.junit.platform.commons.support.ReflectionSupport;
|
|
27 | 32 | import org.junit.platform.engine.TestDescriptor;
|
28 | 33 | import org.junit.platform.engine.TestExecutionResult;
|
29 | 34 | import org.junit.platform.engine.UniqueId;
|
| 35 | +import org.junit.platform.engine.UniqueId.Segment; |
30 | 36 | import org.junit.platform.engine.discovery.DiscoverySelectors;
|
31 | 37 | import org.junit.platform.engine.reporting.OutputDirectoryProvider;
|
32 | 38 | import org.junit.platform.engine.support.descriptor.AbstractTestDescriptor;
|
@@ -75,7 +81,7 @@ final class SuiteTestDescriptor extends AbstractTestDescriptor {
|
75 | 81 | this.failIfNoTests = getFailIfNoTests(suiteClass);
|
76 | 82 | this.suiteClass = suiteClass;
|
77 | 83 | this.lifecycleMethods = new LifecycleMethods(suiteClass, issueReporter);
|
78 |
| - this.discoveryRequestBuilder.listener(new DiscoveryIssueForwardingListener(discoveryListener)); |
| 84 | + this.discoveryRequestBuilder.listener(DiscoveryIssueForwardingListener.create(id, discoveryListener)); |
79 | 85 | }
|
80 | 86 |
|
81 | 87 | private static Boolean getFailIfNoTests(Class<?> suiteClass) {
|
@@ -216,25 +222,43 @@ private static class LifecycleMethods {
|
216 | 222 |
|
217 | 223 | private static class DiscoveryIssueForwardingListener implements LauncherDiscoveryListener {
|
218 | 224 |
|
| 225 | + private static final Predicate<Segment> SUITE_SEGMENTS = where(Segment::getType, isEqual(SEGMENT_TYPE)); |
| 226 | + |
| 227 | + static DiscoveryIssueForwardingListener create(UniqueId id, EngineDiscoveryListener discoveryListener) { |
| 228 | + boolean isNestedSuite = id.getSegments().stream().filter(SUITE_SEGMENTS).count() > 1; |
| 229 | + if (isNestedSuite) { |
| 230 | + return new DiscoveryIssueForwardingListener(discoveryListener, (__, issue) -> issue); |
| 231 | + } |
| 232 | + return new DiscoveryIssueForwardingListener(discoveryListener, |
| 233 | + (engineUniqueId, issue) -> issue.withMessage(message -> { |
| 234 | + String engineId = engineUniqueId.getLastSegment().getValue(); |
| 235 | + if (SuiteEngineDescriptor.ENGINE_ID.equals(engineId)) { |
| 236 | + return message; |
| 237 | + } |
| 238 | + String suitePath = engineUniqueId.getSegments().stream() // |
| 239 | + .filter(SUITE_SEGMENTS) // |
| 240 | + .map(Segment::getValue) // |
| 241 | + .collect(joining(" > ")); |
| 242 | + if (message.endsWith(".")) { |
| 243 | + message = message.substring(0, message.length() - 1); |
| 244 | + } |
| 245 | + return String.format("[%s] %s (via @Suite %s).", engineId, message, suitePath); |
| 246 | + })); |
| 247 | + } |
| 248 | + |
219 | 249 | private final EngineDiscoveryListener discoveryListener;
|
| 250 | + private final BiFunction<UniqueId, DiscoveryIssue, DiscoveryIssue> issueTransformer; |
220 | 251 |
|
221 |
| - DiscoveryIssueForwardingListener(EngineDiscoveryListener discoveryListener) { |
| 252 | + private DiscoveryIssueForwardingListener(EngineDiscoveryListener discoveryListener, |
| 253 | + BiFunction<UniqueId, DiscoveryIssue, DiscoveryIssue> issueTransformer) { |
222 | 254 | this.discoveryListener = discoveryListener;
|
| 255 | + this.issueTransformer = issueTransformer; |
223 | 256 | }
|
224 | 257 |
|
225 | 258 | @Override
|
226 | 259 | public void issueEncountered(UniqueId engineUniqueId, DiscoveryIssue issue) {
|
227 |
| - String engineId = engineUniqueId.getLastSegment().getValue(); |
228 |
| - if (!SuiteEngineDescriptor.ENGINE_ID.equals(engineId)) { |
229 |
| - issue = issue.withMessage(message -> { |
230 |
| - String prefix = String.format("[%s] ", engineId); |
231 |
| - if (message.startsWith(prefix)) { |
232 |
| - return message; |
233 |
| - } |
234 |
| - return prefix + message; |
235 |
| - }); |
236 |
| - } |
237 |
| - discoveryListener.issueEncountered(engineUniqueId, issue); |
| 260 | + DiscoveryIssue transformedIssue = this.issueTransformer.apply(engineUniqueId, issue); |
| 261 | + this.discoveryListener.issueEncountered(engineUniqueId, transformedIssue); |
238 | 262 | }
|
239 | 263 | }
|
240 | 264 | }
|
0 commit comments