From ef73b765de8536f1bd126c9a1b7d711ba85fd72b Mon Sep 17 00:00:00 2001 From: BlitzOffline <52609756+BlitzOffline@users.noreply.github.com> Date: Fri, 24 Mar 2023 21:22:53 +0200 Subject: [PATCH 1/2] Make setPlaceholders behavior consistent with setRelationalPlaceholders Relational placeholders require an underscore after the identifier to be considered valid. For example: `%rel_chatchat_%` is valid but `%rel_chatchat%` is not. Normal placeholders did not require this and `%chatchat%` worked the same as `%chatchat_%`. --- .../java/me/clip/placeholderapi/replacer/CharsReplacer.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/me/clip/placeholderapi/replacer/CharsReplacer.java b/src/main/java/me/clip/placeholderapi/replacer/CharsReplacer.java index afa910c..8848648 100644 --- a/src/main/java/me/clip/placeholderapi/replacer/CharsReplacer.java +++ b/src/main/java/me/clip/placeholderapi/replacer/CharsReplacer.java @@ -67,10 +67,14 @@ public final class CharsReplacer implements Replacer { hadSpace = true; break; } - if (p == closure.tail) { + if (p == closure.tail && identified) { invalid = false; break; } + if (p == closure.tail) { + identifier.append(p); + break; + } if (p == '_' && !identified) { identified = true; From 26934df8e542aec749bea084f69c62bb1e057edc Mon Sep 17 00:00:00 2001 From: BlitzOffline <52609756+BlitzOffline@users.noreply.github.com> Date: Sat, 25 Mar 2023 03:25:09 +0200 Subject: [PATCH 2/2] Added unit tests for the new functionality --- src/test/java/me/clip/placeholderapi/Values.java | 5 +++++ .../placeholderapi/replacer/ReplacerUnitTester.java | 13 +++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/test/java/me/clip/placeholderapi/Values.java b/src/test/java/me/clip/placeholderapi/Values.java index 91c91f6..f985ad9 100644 --- a/src/test/java/me/clip/placeholderapi/Values.java +++ b/src/test/java/me/clip/placeholderapi/Values.java @@ -30,6 +30,8 @@ import org.jetbrains.annotations.Nullable; public interface Values { + String NO_ARGUMENTS_PLACEHOLDER = "%player%"; + String EMPTY_ARGUMENT_PLACEHOLDER = "%player_%"; String SMALL_TEXT = "My name is %player_name%"; String LARGE_TEXT = "My name is %player_name% and my location is (%player_x%, %player_y%, %player_z%), this placeholder is invalid %server_name%"; @@ -43,6 +45,7 @@ public interface Values { final class MockPlayerPlaceholderExpansion extends PlaceholderExpansion { + public static final String EMPTY_ARGUMENT = "Empty Argument"; public static final String PLAYER_X = "10"; public static final String PLAYER_Y = "20"; public static final String PLAYER_Z = "30"; @@ -83,6 +86,8 @@ public interface Values { return PLAYER_Y; case "z": return PLAYER_Z; + case "": + return EMPTY_ARGUMENT; } return null; diff --git a/src/test/java/me/clip/placeholderapi/replacer/ReplacerUnitTester.java b/src/test/java/me/clip/placeholderapi/replacer/ReplacerUnitTester.java index 4924a7e..5f1148e 100644 --- a/src/test/java/me/clip/placeholderapi/replacer/ReplacerUnitTester.java +++ b/src/test/java/me/clip/placeholderapi/replacer/ReplacerUnitTester.java @@ -24,6 +24,7 @@ import static me.clip.placeholderapi.Values.MockPlayerPlaceholderExpansion.PLAYE import static me.clip.placeholderapi.Values.MockPlayerPlaceholderExpansion.PLAYER_X; import static me.clip.placeholderapi.Values.MockPlayerPlaceholderExpansion.PLAYER_Y; import static me.clip.placeholderapi.Values.MockPlayerPlaceholderExpansion.PLAYER_Z; +import static me.clip.placeholderapi.Values.MockPlayerPlaceholderExpansion.EMPTY_ARGUMENT; import static org.junit.jupiter.api.Assertions.assertEquals; import me.clip.placeholderapi.Values; @@ -37,6 +38,18 @@ public final class ReplacerUnitTester { Values.CHARS_REPLACER.apply("%player_name%", null, Values.PLACEHOLDERS::get)); } + @Test + void charsReplacersDoesNotParsePlaceholdersWithNoArguments() { + assertEquals(Values.NO_ARGUMENTS_PLACEHOLDER, + Values.CHARS_REPLACER.apply(Values.NO_ARGUMENTS_PLACEHOLDER, null, Values.PLACEHOLDERS::get)); + } + + @Test + void charsReplacersParsesPlaceholdersWithOneArgumentThatIsEmpty() { + assertEquals(EMPTY_ARGUMENT, + Values.CHARS_REPLACER.apply(Values.EMPTY_ARGUMENT_PLACEHOLDER, null, Values.PLACEHOLDERS::get)); + } + @Test void testCharsReplacerProducesExpectedSentence() { assertEquals(String.format(