diff --git a/documentation/src/docs/asciidoc/release-notes/release-notes-5.10.0-M1.adoc b/documentation/src/docs/asciidoc/release-notes/release-notes-5.10.0-M1.adoc index 1308b0e792a..809bdfc65fa 100644 --- a/documentation/src/docs/asciidoc/release-notes/release-notes-5.10.0-M1.adoc +++ b/documentation/src/docs/asciidoc/release-notes/release-notes-5.10.0-M1.adoc @@ -52,9 +52,12 @@ repository on GitHub. ==== Bug Fixes -* The `{displayName}` placeholder of `@ParameterizedTest` is no longer parsed during the - evaluation of the `MessageFormat`, now `@DisplayName` and Kotlin method names can contain - single apostrophes and `MessageFormat` elements, such as `{data}`. +* The `{displayName}` placeholder for `@ParameterizedTest` invocation names is no longer + parsed using `java.text.MessageFormat`. Consequently, any text in the display name of + the `@ParameterizedTest` method will be included unmodified in the invocation display + name. For example, Kotlin method names and custom display names configured via + `@DisplayName` can now contain apostrophes (`'`) as well as text resembling + `MessageFormat` elements such as `{0}` or `{data}`. ==== Deprecations and Breaking Changes diff --git a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestNameFormatter.java b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestNameFormatter.java index 800f146b70b..a505bd81f91 100644 --- a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestNameFormatter.java +++ b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestNameFormatter.java @@ -31,7 +31,7 @@ class ParameterizedTestNameFormatter { private static final char ELLIPSIS = '\u2026'; - private static final String DISPLAY_NAME_TEMPORARY_PLACEHOLDER = "__DISPLAY_NAME__"; + private static final String TEMPORARY_DISPLAY_NAME_PLACEHOLDER = "~~~JUNIT_DISPLAY_NAME~~~"; private final String pattern; private final String displayName; @@ -63,7 +63,7 @@ private String formatSafely(int invocationIndex, Object[] arguments) { MessageFormat format = new MessageFormat(pattern); Object[] humanReadableArguments = makeReadable(format, namedArguments); String formatted = format.format(humanReadableArguments); - return formatted.replace(DISPLAY_NAME_TEMPORARY_PLACEHOLDER, this.displayName); + return formatted.replace(TEMPORARY_DISPLAY_NAME_PLACEHOLDER, this.displayName); } private Object[] extractNamedArguments(Object[] arguments) { @@ -74,7 +74,7 @@ private Object[] extractNamedArguments(Object[] arguments) { private String prepareMessageFormatPattern(int invocationIndex, Object[] arguments) { String result = pattern// - .replace(DISPLAY_NAME_PLACEHOLDER, DISPLAY_NAME_TEMPORARY_PLACEHOLDER)// + .replace(DISPLAY_NAME_PLACEHOLDER, TEMPORARY_DISPLAY_NAME_PLACEHOLDER)// .replace(INDEX_PLACEHOLDER, String.valueOf(invocationIndex)); if (result.contains(ARGUMENTS_WITH_NAMES_PLACEHOLDER)) { diff --git a/junit-jupiter-params/src/test/java/org/junit/jupiter/params/ParameterizedTestNameFormatterTests.java b/junit-jupiter-params/src/test/java/org/junit/jupiter/params/ParameterizedTestNameFormatterTests.java index ad63dbdede4..1cbabc82799 100644 --- a/junit-jupiter-params/src/test/java/org/junit/jupiter/params/ParameterizedTestNameFormatterTests.java +++ b/junit-jupiter-params/src/test/java/org/junit/jupiter/params/ParameterizedTestNameFormatterTests.java @@ -61,7 +61,7 @@ void formatsDisplayName() { } @Test - void formatsDisplayNameWithApostrophe() { + void formatsDisplayNameContainingApostrophe() { String displayName = "display'Zero"; var formatter = formatter(DISPLAY_NAME_PLACEHOLDER, "display'Zero"); diff --git a/junit-jupiter-params/src/test/kotlin/ParameterizedTestNameFormatterIntegrationTests.kt b/junit-jupiter-params/src/test/kotlin/ParameterizedTestNameFormatterIntegrationTests.kt index afcfb4bde7a..829f98aefab 100644 --- a/junit-jupiter-params/src/test/kotlin/ParameterizedTestNameFormatterIntegrationTests.kt +++ b/junit-jupiter-params/src/test/kotlin/ParameterizedTestNameFormatterIntegrationTests.kt @@ -16,7 +16,7 @@ class ParameterizedTestNameFormatterIntegrationTests { @ValueSource(strings = ["foo", "bar"]) @ParameterizedTest - fun `implicit'Name`(param: String, info: TestInfo) { + fun defaultDisplayName(param: String, info: TestInfo) { if (param.equals("foo")) { assertEquals("[1] foo", info.displayName) } else { @@ -26,7 +26,7 @@ class ParameterizedTestNameFormatterIntegrationTests { @ValueSource(strings = ["foo", "bar"]) @ParameterizedTest(name = "{0}") - fun `zero'Only`(param: String, info: TestInfo) { + fun `1st argument`(param: String, info: TestInfo) { if (param.equals("foo")) { assertEquals("foo", info.displayName) } else { @@ -36,27 +36,27 @@ class ParameterizedTestNameFormatterIntegrationTests { @ValueSource(strings = ["foo", "bar"]) @ParameterizedTest(name = "{displayName}") - fun `displayName'Only`(param: String, info: TestInfo) { - assertEquals("displayName'Only(String, TestInfo)", info.displayName) + fun `it's an {enigma} '{0}'`(@Suppress("UNUSED_PARAMETER") param: String, info: TestInfo) { + assertEquals("it's an {enigma} '{0}'(String, TestInfo)", info.displayName) } @ValueSource(strings = ["foo", "bar"]) @ParameterizedTest(name = "{displayName} - {0}") - fun `displayName'Zero`(param: String, info: TestInfo) { + fun `displayName and 1st 'argument'`(param: String, info: TestInfo) { if (param.equals("foo")) { - assertEquals("displayName'Zero(String, TestInfo) - foo", info.displayName) + assertEquals("displayName and 1st 'argument'(String, TestInfo) - foo", info.displayName) } else { - assertEquals("displayName'Zero(String, TestInfo) - bar", info.displayName) + assertEquals("displayName and 1st 'argument'(String, TestInfo) - bar", info.displayName) } } @ValueSource(strings = ["foo", "bar"]) @ParameterizedTest(name = "{0} - {displayName}") - fun `zero'DisplayName`(param: String, info: TestInfo) { + fun `1st 'argument' and displayName`(param: String, info: TestInfo) { if (param.equals("foo")) { - assertEquals("foo - zero'DisplayName(String, TestInfo)", info.displayName) + assertEquals("foo - 1st 'argument' and displayName(String, TestInfo)", info.displayName) } else { - assertEquals("bar - zero'DisplayName(String, TestInfo)", info.displayName) + assertEquals("bar - 1st 'argument' and displayName(String, TestInfo)", info.displayName) } } }