Skip to content

Commit 400779c

Browse files
authored
Emit warning when @SuiteDisplayName is used with a blank string
Resolves #4810.
1 parent cf03222 commit 400779c

File tree

4 files changed

+101
-5
lines changed

4 files changed

+101
-5
lines changed

junit-platform-suite-engine/src/main/java/org/junit/platform/suite/engine/SuiteTestDescriptor.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ final class SuiteTestDescriptor extends AbstractTestDescriptor {
8080
SuiteTestDescriptor(UniqueId id, Class<?> suiteClass, ConfigurationParameters configurationParameters,
8181
OutputDirectoryProvider outputDirectoryProvider, EngineDiscoveryListener discoveryListener,
8282
DiscoveryIssueReporter issueReporter) {
83-
super(id, getSuiteDisplayName(suiteClass), ClassSource.from(suiteClass));
83+
super(id, getSuiteDisplayName(suiteClass, issueReporter), ClassSource.from(suiteClass));
8484
this.configurationParameters = configurationParameters;
8585
this.outputDirectoryProvider = outputDirectoryProvider;
8686
this.failIfNoTests = getFailIfNoTests(suiteClass);
@@ -140,12 +140,20 @@ public Type getType() {
140140
return Type.CONTAINER;
141141
}
142142

143-
private static String getSuiteDisplayName(Class<?> testClass) {
143+
private static String getSuiteDisplayName(Class<?> suiteClass, DiscoveryIssueReporter issueReporter) {
144144
// @formatter:off
145-
return findAnnotation(testClass, SuiteDisplayName.class)
145+
var nonBlank = issueReporter.createReportingCondition(StringUtils::isNotBlank, __ -> {
146+
String message = "@SuiteDisplayName on %s must be declared with a non-blank value.".formatted(
147+
suiteClass.getName());
148+
return DiscoveryIssue.builder(DiscoveryIssue.Severity.WARNING, message)
149+
.source(ClassSource.from(suiteClass))
150+
.build();
151+
}).toPredicate();
152+
153+
return findAnnotation(suiteClass, SuiteDisplayName.class)
146154
.map(SuiteDisplayName::value)
147-
.filter(StringUtils::isNotBlank)
148-
.orElse(testClass.getSimpleName());
155+
.filter(nonBlank)
156+
.orElse(suiteClass.getSimpleName());
149157
// @formatter:on
150158
}
151159

platform-tests/src/test/java/org/junit/platform/suite/engine/SuiteEngineTests.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
import org.junit.platform.suite.engine.testcases.SingleTestTestCase;
6969
import org.junit.platform.suite.engine.testcases.TaggedTestTestCase;
7070
import org.junit.platform.suite.engine.testsuites.AbstractSuite;
71+
import org.junit.platform.suite.engine.testsuites.BlankSuiteDisplayNameSuite;
7172
import org.junit.platform.suite.engine.testsuites.ConfigurationSuite;
7273
import org.junit.platform.suite.engine.testsuites.CyclicSuite;
7374
import org.junit.platform.suite.engine.testsuites.DynamicSuite;
@@ -88,6 +89,7 @@
8889
import org.junit.platform.suite.engine.testsuites.SuiteSuite;
8990
import org.junit.platform.suite.engine.testsuites.SuiteWithErroneousTestSuite;
9091
import org.junit.platform.suite.engine.testsuites.ThreePartCyclicSuite;
92+
import org.junit.platform.suite.engine.testsuites.WhitespaceSuiteDisplayNameSuite;
9193
import org.junit.platform.testkit.engine.EngineTestKit;
9294

9395
/**
@@ -705,6 +707,38 @@ void reportsChildrenOfEnginesInSuiteAsSkippedWhenCancelledDuringExecution() {
705707
}
706708
}
707709

710+
@Test
711+
void blankSuiteDisplayNameGeneratesWarning() {
712+
var expectedMessage = "@SuiteDisplayName on %s must be declared with a non-blank value.".formatted(
713+
BlankSuiteDisplayNameSuite.class.getName());
714+
var expectedIssue = DiscoveryIssue.builder(Severity.WARNING, expectedMessage).source(
715+
ClassSource.from(BlankSuiteDisplayNameSuite.class)).build();
716+
717+
var testKit = EngineTestKit.engine(ENGINE_ID).selectors(selectClass(BlankSuiteDisplayNameSuite.class));
718+
719+
assertThat(testKit.discover().getDiscoveryIssues()).contains(expectedIssue);
720+
}
721+
722+
@Test
723+
void whitespaceSuiteDisplayNameGeneratesWarning() {
724+
var expectedMessage = "@SuiteDisplayName on %s must be declared with a non-blank value.".formatted(
725+
WhitespaceSuiteDisplayNameSuite.class.getName());
726+
var expectedIssue = DiscoveryIssue.builder(Severity.WARNING, expectedMessage).source(
727+
ClassSource.from(WhitespaceSuiteDisplayNameSuite.class)).build();
728+
729+
var testKit = EngineTestKit.engine(ENGINE_ID).selectors(selectClass(WhitespaceSuiteDisplayNameSuite.class));
730+
731+
assertThat(testKit.discover().getDiscoveryIssues()).contains(expectedIssue);
732+
}
733+
734+
@Test
735+
void validSuiteDisplayNameGeneratesNoWarning() {
736+
var testKit = EngineTestKit.engine(ENGINE_ID).selectors(selectClass(SuiteDisplayNameSuite.class));
737+
738+
assertThat(testKit.discover().getDiscoveryIssues()) //
739+
.noneMatch(issue -> issue.message().contains("@SuiteDisplayName"));
740+
}
741+
708742
// -----------------------------------------------------------------------------------------------------------------
709743

710744
static class CancellingSuite extends SelectClassesSuite {
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* Copyright 2015-2025 the original author or authors.
3+
*
4+
* All rights reserved. This program and the accompanying materials are
5+
* made available under the terms of the Eclipse Public License v2.0 which
6+
* accompanies this distribution and is available at
7+
*
8+
* https://www.eclipse.org/legal/epl-v20.html
9+
*/
10+
11+
package org.junit.platform.suite.engine.testsuites;
12+
13+
import org.junit.platform.suite.api.SelectClasses;
14+
import org.junit.platform.suite.api.Suite;
15+
import org.junit.platform.suite.api.SuiteDisplayName;
16+
import org.junit.platform.suite.engine.testcases.SingleTestTestCase;
17+
18+
/**
19+
* Test suite with blank @SuiteDisplayName to verify validation.
20+
*
21+
* @since 6.0
22+
*/
23+
@Suite
24+
@SelectClasses(SingleTestTestCase.class)
25+
@SuiteDisplayName("")
26+
public class BlankSuiteDisplayNameSuite {
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* Copyright 2015-2025 the original author or authors.
3+
*
4+
* All rights reserved. This program and the accompanying materials are
5+
* made available under the terms of the Eclipse Public License v2.0 which
6+
* accompanies this distribution and is available at
7+
*
8+
* https://www.eclipse.org/legal/epl-v20.html
9+
*/
10+
11+
package org.junit.platform.suite.engine.testsuites;
12+
13+
import org.junit.platform.suite.api.SelectClasses;
14+
import org.junit.platform.suite.api.Suite;
15+
import org.junit.platform.suite.api.SuiteDisplayName;
16+
import org.junit.platform.suite.engine.testcases.SingleTestTestCase;
17+
18+
/**
19+
* Test suite with whitespace-only @SuiteDisplayName to verify validation.
20+
*
21+
* @since 6.0
22+
*/
23+
@Suite
24+
@SelectClasses(SingleTestTestCase.class)
25+
@SuiteDisplayName(" ")
26+
public class WhitespaceSuiteDisplayNameSuite {
27+
}

0 commit comments

Comments
 (0)