Skip to content

Commit d011999

Browse files
committed
Merge branch 'fix-versionnumber-on-modulepath'
2 parents 1fbe090 + f711af4 commit d011999

File tree

6 files changed

+56
-9
lines changed

6 files changed

+56
-9
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1414

1515
## [Unreleased]
1616

17+
### Fixed
18+
19+
- EqualsVerifier's version number was reported as 'null' when run on the modulepath.
20+
1721
## [4.2.2] - 2025-11-09
1822

1923
### Fixed

equalsverifier-core/pom.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,16 @@
2222
</properties>
2323

2424
<build>
25+
<resources>
26+
<resource>
27+
<directory>src/main/resources</directory>
28+
<filtering>true</filtering>
29+
<includes>
30+
<include>version.properties</include>
31+
</includes>
32+
</resource>
33+
</resources>
34+
2535
<plugins>
2636
<plugin>
2737
<groupId>org.apache.maven.plugins</groupId>

equalsverifier-core/src/main/java/nl/jqno/equalsverifier/internal/util/ErrorMessage.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package nl.jqno.equalsverifier.internal.util;
22

3+
import java.io.IOException;
4+
import java.util.Properties;
5+
36
import nl.jqno.equalsverifier.internal.reflection.ModuleProbe;
47

58
public final class ErrorMessage {
@@ -14,11 +17,22 @@ public static String suffix() {
1417
.of(
1518
"%%\n(EqualsVerifier %%, JDK %% running on %%, on %%. Mockito: %%.)",
1619
WEBSITE_URL,
17-
ErrorMessage.class.getPackage().getImplementationVersion(),
20+
getVersion(),
1821
System.getProperty("java.version"),
1922
ModuleProbe.runsOnModulePath() ? "modulepath" : "classpath",
2023
System.getProperty("os.name"),
2124
ExternalLibs.isMockitoAvailable() ? "available" : "not available")
2225
.format();
2326
}
27+
28+
private static String getVersion() {
29+
var props = new Properties();
30+
try (var is = ErrorMessage.class.getResourceAsStream("/version.properties")) {
31+
props.load(is);
32+
return props.getProperty("version");
33+
}
34+
catch (IOException ignored) {
35+
return "unknown";
36+
}
37+
}
2438
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
version=${project.version}

equalsverifier-test/src/test/java/nl/jqno/equalsverifier/integration/operational/OutputTest.java

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package nl.jqno.equalsverifier.integration.operational;
22

3+
import java.util.regex.Pattern;
4+
35
import nl.jqno.equalsverifier.EqualsVerifier;
46
import nl.jqno.equalsverifier.internal.exceptions.AssertionException;
57
import nl.jqno.equalsverifier.internal.util.Formatter;
@@ -13,16 +15,18 @@ class OutputTest {
1315

1416
private static final String SEE_ALSO = "For more information, go to";
1517
private static final String WEBSITE_URL = "https://www.jqno.nl/equalsverifier/errormessages";
16-
private static final String SUFFIX = "(EqualsVerifier null, JDK";
1718
private static final String CLASSPATH = "running on classpath";
1819
private static final String MESSAGE = "a message for an exception";
20+
private static final Pattern SUFFIX =
21+
Pattern.compile("\\(EqualsVerifier .*, JDK .* running on (class|module)path, on .*. Mockito: .*\\)");
1922

2023
@Test
2124
void messageIsValidForSingleType_whenEqualsVerifierFails_givenExceptionIsGeneratedByEqualsVerifierItself() {
2225
ExpectedException
2326
.when(() -> EqualsVerifier.forClass(Point.class).verify())
2427
.assertCause(AssertionException.class)
25-
.assertMessageContains(Point.class.getSimpleName(), SEE_ALSO, WEBSITE_URL, SUFFIX, CLASSPATH);
28+
.assertMessageContains(Point.class.getSimpleName(), SEE_ALSO, WEBSITE_URL, CLASSPATH)
29+
.assertMessageMatches(SUFFIX);
2630
}
2731

2832
@Test
@@ -33,8 +37,8 @@ void messageIsValidForMultipleTypes_whenEqualsVerifierFails_givenExceptionIsGene
3337
.assertMessageContains("---")
3438
.assertMessageContainsOnce(SEE_ALSO)
3539
.assertMessageContainsOnce(WEBSITE_URL)
36-
.assertMessageContainsOnce(SUFFIX)
37-
.assertMessageContainsOnce(CLASSPATH);
40+
.assertMessageContainsOnce(CLASSPATH)
41+
.assertMessageMatches(SUFFIX);
3842
}
3943

4044
@Test
@@ -47,7 +51,8 @@ void messageIsValidAndCauseHasCause_whenEqualsVerifierFails_givenOriginalExcepti
4751
ExpectedException
4852
.when(() -> EqualsVerifier.forClass(AssertionExceptionWithCauseThrower.class).verify())
4953
.assertMessageContains(AssertionExceptionWithCauseThrower.class.getSimpleName())
50-
.assertMessageContains(SEE_ALSO, WEBSITE_URL, SUFFIX, CLASSPATH, MESSAGE)
54+
.assertMessageContains(SEE_ALSO, WEBSITE_URL, CLASSPATH, MESSAGE)
55+
.assertMessageMatches(SUFFIX)
5156
.assertMessageDoesNotContain(NullPointerException.class.getSimpleName())
5257
.assertCause(AssertionException.class)
5358
.assertCause(NullPointerException.class);
@@ -59,7 +64,8 @@ void originalMessageIsPresentInOutput_whenEqualsVerifierFails_givenOriginalExcep
5964
.when(() -> EqualsVerifier.forClass(UnsupportedOperationExceptionWithMessageThrower.class).verify())
6065
.assertMessageContains(UnsupportedOperationExceptionWithMessageThrower.class.getSimpleName())
6166
.assertMessageContains(UnsupportedOperationException.class.getSimpleName())
62-
.assertMessageContains(SEE_ALSO, WEBSITE_URL, SUFFIX, MESSAGE)
67+
.assertMessageContains(SEE_ALSO, WEBSITE_URL, MESSAGE)
68+
.assertMessageMatches(SUFFIX)
6369
.assertMessageDoesNotContainAfterRemove("EqualsVerifier null", "null")
6470
.assertCause(UnsupportedOperationException.class)
6571
.assertCauseMessageContains(MESSAGE);
@@ -70,7 +76,8 @@ void messageIsValidAndDoesNotContainStringNull_whenEqualsVerifierFails_givenOrig
7076
ExpectedException
7177
.when(() -> EqualsVerifier.forClass(IllegalStateExceptionThrower.class).verify())
7278
.assertMessageContains(IllegalStateExceptionThrower.class.getSimpleName())
73-
.assertMessageContains(SEE_ALSO, WEBSITE_URL, SUFFIX, "<no message>")
79+
.assertMessageContains(SEE_ALSO, WEBSITE_URL, "<no message>")
80+
.assertMessageMatches(SUFFIX)
7481
.assertMessageDoesNotContainAfterRemove("EqualsVerifier null", "null")
7582
.assertCause(IllegalStateException.class);
7683
}
@@ -79,7 +86,8 @@ void messageIsValidAndDoesNotContainStringNull_whenEqualsVerifierFails_givenOrig
7986
void noStackOverflowErrorIsThrown_whenClassIsARecursiveDatastructure() {
8087
ExpectedException
8188
.when(() -> EqualsVerifier.forClass(Node.class).verify())
82-
.assertMessageContains(Node.class.getSimpleName(), SEE_ALSO, WEBSITE_URL, SUFFIX)
89+
.assertMessageContains(Node.class.getSimpleName(), SEE_ALSO, WEBSITE_URL)
90+
.assertMessageMatches(SUFFIX)
8391
.assertNotCause(StackOverflowError.class);
8492
}
8593

equalsverifier-testhelpers/src/main/java/nl/jqno/equalsverifier_testhelpers/ExpectedException.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package nl.jqno.equalsverifier_testhelpers;
22

3+
import java.util.regex.Pattern;
4+
35
public final class ExpectedException {
46

57
private final Throwable e;
@@ -90,6 +92,14 @@ public ExpectedException assertMessageContains(String... fragments) {
9092
return this;
9193
}
9294

95+
public ExpectedException assertMessageMatches(Pattern regex) {
96+
String message = e.getMessage();
97+
if (!regex.matcher(message).find()) {
98+
fail("Message [" + message + "] does not match regex /" + regex + "/");
99+
}
100+
return this;
101+
}
102+
93103
public ExpectedException assertMessageContainsOnce(String fragment) {
94104
int occurrences = 0;
95105
String message = e.getMessage();

0 commit comments

Comments
 (0)