From 550e85c456ff2a2ac92c47af4235ad3aa46beecb Mon Sep 17 00:00:00 2001 From: slprime <31038811+slprime@users.noreply.github.com> Date: Sat, 10 Oct 2026 14:58:17 +0300 Subject: [PATCH] Fix -@mod and !@mod search syntax in Extended mode (#1071) --- .../codechicken/nei/SearchTokenParser.java | 2 +- .../nei/SearchTokenParserTest.java | 35 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/main/java/codechicken/nei/SearchTokenParser.java b/src/main/java/codechicken/nei/SearchTokenParser.java index e55cd9d5..96031dc4 100644 --- a/src/main/java/codechicken/nei/SearchTokenParser.java +++ b/src/main/java/codechicken/nei/SearchTokenParser.java @@ -445,7 +445,7 @@ public class SearchTokenParser { final char ch = input.charAt(index); if (!insideQuotes && delimiters.indexOf(ch) >= 0 - && (!space || index == 0 || input.charAt(index - 1) == ' ')) { + && (!space || index == 0 || input.charAt(index - 1) == ' ' || lastEnd == index)) { if (lastEnd == index) { token += String.valueOf(ch); diff --git a/src/test/java/codechicken/nei/SearchTokenParserTest.java b/src/test/java/codechicken/nei/SearchTokenParserTest.java index 6fa79f19..f93431bb 100644 --- a/src/test/java/codechicken/nei/SearchTokenParserTest.java +++ b/src/test/java/codechicken/nei/SearchTokenParserTest.java @@ -64,6 +64,7 @@ public class SearchTokenParserTest { new ModeValue(1, "Extended mode"), new ModeValue(2, "Regex mode"), new ModeValue(3, "Extended+ mode") }; private static final ModeValue[] extendedPlusPatternMode = { patternModes[3] }; private static final ModeValue[] extendedPatternModes = { patternModes[1], patternModes[3] }; + private static final ModeValue[] nonGrammarPatternModes = { patternModes[0], patternModes[1], patternModes[2] }; private static final SearchParserProvider defaultParserProvider = parserProvider( '\0', @@ -119,6 +120,10 @@ public class SearchTokenParserTest { private static final List allModesTestProvider = combinationsProvider(spaceModes, patternModes); + private static final List nonGrammarAllSpaceModesTestProvider = combinationsProvider( + spaceModes, + nonGrammarPatternModes); + private static final List extendedPlusAllSpaceModesTestProvider = combinationsProvider( spaceModes, extendedPlusPatternMode); @@ -236,6 +241,36 @@ public class SearchTokenParserTest { assertTrue(matchedItems.contains(itemA)); } + @DisplayName("Negated prefix (dash)") + @ParameterizedTest(name = "{argumentsWithNames}") + @FieldSource("allModesTestProvider") + public void testNegatedPrefixDash(int spaceMode, int patternMode) { + SearchTokenParser searchParser = new SearchTokenParser(); + searchParser.addProvider(defaultParserProvider); + searchParser + .addProvider(parserProvider('?', "custom", SearchTokenParser.SearchMode.PREFIX, customCreateFilter)); + + Set matchedItems = testFilterAgainstAllItems(spaceMode, patternMode, searchParser, "-?A"); + + assertEquals(5, matchedItems.size()); + assertFalse(matchedItems.contains(itemA)); + } + + @DisplayName("Negated prefix (bang)") + @ParameterizedTest(name = "{argumentsWithNames}") + @FieldSource("nonGrammarAllSpaceModesTestProvider") + public void testNegatedPrefixBang(int spaceMode, int patternMode) { + SearchTokenParser searchParser = new SearchTokenParser(); + searchParser.addProvider(defaultParserProvider); + searchParser + .addProvider(parserProvider('?', "custom", SearchTokenParser.SearchMode.PREFIX, customCreateFilter)); + + Set matchedItems = testFilterAgainstAllItems(spaceMode, patternMode, searchParser, "!?A"); + + assertEquals(5, matchedItems.size()); + assertFalse(matchedItems.contains(itemA)); + } + @DisplayName("Space mode") @ParameterizedTest(name = "{argumentsWithNames}") @FieldSource("spaceIsSpaceAllModesTestProvider")