From e4e5bb847c31e1327fb56a5073e0cc27acfa84da Mon Sep 17 00:00:00 2001 From: hengyunabc Date: Wed, 13 Nov 2024 16:45:46 +0800 Subject: [PATCH] =?UTF-8?q?Revert=20"Improve=20token=20parsing=20and=20bet?= =?UTF-8?q?ter=20support=20control=20operators=20such=20as=20pi=E2=80=A6"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit eede2aacf64154bf89eacac31a8a5f0cc1e4d968. --- .../core/shell/cli/impl/CliTokenImpl.java | 73 ++- .../core/shell/cli/impl/CliTokenImplTest.java | 420 ++---------------- 2 files changed, 58 insertions(+), 435 deletions(-) diff --git a/core/src/main/java/com/taobao/arthas/core/shell/cli/impl/CliTokenImpl.java b/core/src/main/java/com/taobao/arthas/core/shell/cli/impl/CliTokenImpl.java index 175f4cd824e..ca956e5566c 100644 --- a/core/src/main/java/com/taobao/arthas/core/shell/cli/impl/CliTokenImpl.java +++ b/core/src/main/java/com/taobao/arthas/core/shell/cli/impl/CliTokenImpl.java @@ -11,9 +11,6 @@ * @author Julien Viet */ public class CliTokenImpl implements CliToken { - private static final String PIPE = "|"; - private static final String REDIRECT = ">"; - private static final String REDIRECT_APPEND = ">>"; final boolean text; final String raw; @@ -74,7 +71,7 @@ public static List tokenize(String s) { tokenize(s, 0, tokens); - tokens = adjustTokensForSpecialSymbols(tokens); + tokens = correctPipeChar(tokens); return tokens; } @@ -90,53 +87,35 @@ public static List tokenize(String s) { * unsupported: * 3) thread|grep xxx * 4) trace -E classA|classB methodA|methodB|grep classA - * - * Also handles redirection of '>' and '>>' in the similar way - * - * @param tokens original tokens - * @return adjusted tokens + * @param tokens + * @return */ - private static List adjustTokensForSpecialSymbols(List tokens) { - return separateLeadingAndTailingSymbol(tokens, PIPE, REDIRECT_APPEND, REDIRECT); - } - - private static List separateLeadingAndTailingSymbol(List tokens, String... symbols) { - List adjustedTokens = new ArrayList<>(); + private static List correctPipeChar(List tokens) { + List newTokens = new ArrayList(tokens.size()+4); for (CliToken token : tokens) { - String value = token.value(); - String raw = token.raw(); - boolean handled = false; - for (String symbol : symbols) { - if (value.equals(symbol)) { - break; - } else if (value.endsWith(symbol)) { - handled = true; - int lastIndexOfSymbol = raw.lastIndexOf(symbol); - adjustedTokens.add(new CliTokenImpl( - token.isText(), - raw.substring(0, lastIndexOfSymbol), - value.substring(0, value.length() - symbol.length()) - )); - adjustedTokens.add(new CliTokenImpl(true, raw.substring(lastIndexOfSymbol), symbol)); - break; - } else if (value.startsWith(symbol)) { - handled = true; - int firstIndexOfSymbol = raw.indexOf(symbol); - adjustedTokens.add(new CliTokenImpl(true, - raw.substring(0, firstIndexOfSymbol + symbol.length()), symbol)); - adjustedTokens.add(new CliTokenImpl( - token.isText(), - raw.substring(firstIndexOfSymbol + symbol.length()), - value.substring(symbol.length()) - )); - break; - } - } - if (!handled) { - adjustedTokens.add(token); + String tokenValue = token.value(); + if (tokenValue.length()>1 && tokenValue.endsWith("|")) { + //split last char '|' + tokenValue = tokenValue.substring(0, tokenValue.length()-1); + String rawValue = token.raw(); + rawValue = rawValue.substring(0, rawValue.length()-1); + newTokens.add(new CliTokenImpl(token.isText(), rawValue, tokenValue)); + //add '|' char + newTokens.add(new CliTokenImpl(true, "|", "|")); + + } else if (tokenValue.length()>1 && tokenValue.startsWith("|")) { + //add '|' char + newTokens.add(new CliTokenImpl(true, "|", "|")); + //remove first char '|' + tokenValue = tokenValue.substring(1); + String rawValue = token.raw(); + rawValue = rawValue.substring(1); + newTokens.add(new CliTokenImpl(token.isText(), rawValue, tokenValue)); + } else { + newTokens.add(token); } } - return adjustedTokens; + return newTokens; } private static void tokenize(String s, int index, List builder) { diff --git a/core/src/test/java/com/taobao/arthas/core/shell/cli/impl/CliTokenImplTest.java b/core/src/test/java/com/taobao/arthas/core/shell/cli/impl/CliTokenImplTest.java index 8e347d3adf5..fbaeb1b230c 100644 --- a/core/src/test/java/com/taobao/arthas/core/shell/cli/impl/CliTokenImplTest.java +++ b/core/src/test/java/com/taobao/arthas/core/shell/cli/impl/CliTokenImplTest.java @@ -4,7 +4,7 @@ import org.junit.Assert; import org.junit.Test; -import java.util.ArrayList; +import java.util.Iterator; import java.util.List; public class CliTokenImplTest { @@ -25,86 +25,14 @@ public class CliTokenImplTest { @Test public void testSupportedPipeCharWithoutRegex() { String[] expectedTextTokenValue = new String[]{"thread", "|", "grep", "xxx"}; - String cmd = "thread| grep xxx"; - List actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "thread | grep xxx"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "thread |grep xxx"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "thread'|' grep xxx"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "thread '|' grep xxx"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "thread '|'grep xxx"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "thread\"|\" grep xxx"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "thread \"|\" grep xxx"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "thread \"|\"grep xxx"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - expectedTextTokenValue = new String[]{"thread| grep", "xxx"}; - cmd = "thread'| 'grep xxx"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "thread\"| \"grep xxx"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - expectedTextTokenValue = new String[]{"thread |grep", "xxx"}; - cmd = "thread' |'grep xxx"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "thread\" |\"grep xxx"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - expectedTextTokenValue = new String[]{"thread \"|\"grep", "xxx"}; - cmd = "thread' \"|\"'grep xxx"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - expectedTextTokenValue = new String[]{"thread '|'grep", "xxx"}; - cmd = "thread\" '|'\"grep xxx"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); + List actualTokens = CliTokenImpl.tokenize("thread| grep xxx"); + assertEquals(expectedTextTokenValue, actualTokens); + actualTokens = CliTokenImpl.tokenize("thread | grep xxx"); + assertEquals(expectedTextTokenValue, actualTokens); + actualTokens = CliTokenImpl.tokenize("thread |grep xxx"); + assertEquals(expectedTextTokenValue, actualTokens); } /** @@ -123,85 +51,14 @@ public void testSupportedPipeCharWithoutRegex() { @Test public void testSupportedPipeCharWithRegex() { String[] expectedTextTokenValue = new String[]{"trace", "-E", "classA|classB", "methodA|methodB", "|", "grep", "classA"}; - String cmd = "trace -E classA|classB methodA|methodB| grep classA"; - List actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "trace -E classA|classB methodA|methodB | grep classA"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "trace -E classA|classB methodA|methodB |grep classA"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "trace -E classA|classB methodA|methodB'|' grep classA"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "trace -E classA|classB methodA|methodB '|' grep classA"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "trace -E classA|classB methodA|methodB '|'grep classA"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - + List actualTokens = CliTokenImpl.tokenize("trace -E classA|classB methodA|methodB| grep classA"); + assertEquals(expectedTextTokenValue, actualTokens); - cmd = "trace -E classA|classB methodA|methodB\"|\" grep classA"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); + actualTokens = CliTokenImpl.tokenize("trace -E classA|classB methodA|methodB | grep classA"); + assertEquals(expectedTextTokenValue, actualTokens); - cmd = "trace -E classA|classB methodA|methodB \"|\" grep classA"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "trace -E classA|classB methodA|methodB \"|\"grep classA"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - expectedTextTokenValue = new String[]{"trace", "-E", "classA|classB", "methodA|methodB| grep", "classA"}; - cmd = "trace -E classA|classB methodA|methodB'| 'grep classA"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "trace -E classA|classB methodA|methodB\"| \"grep classA"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - expectedTextTokenValue = new String[]{"trace", "-E", "classA|classB", "methodA|methodB |grep", "classA"}; - cmd = "trace -E classA|classB methodA|methodB' |'grep classA"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "trace -E classA|classB methodA|methodB\" |\"grep classA"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - expectedTextTokenValue = new String[]{"trace", "-E", "classA|classB", "methodA|methodB '|'grep", "classA"}; - cmd = "trace -E classA|classB methodA|methodB\" '|'\"grep classA"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - expectedTextTokenValue = new String[]{"trace", "-E", "classA|classB", "methodA|methodB \"|\"grep", "classA"}; - cmd = "trace -E classA|classB methodA|methodB' \"|\"'grep classA"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); + actualTokens = CliTokenImpl.tokenize("trace -E classA|classB methodA|methodB |grep classA"); + assertEquals(expectedTextTokenValue, actualTokens); } /** @@ -220,247 +77,34 @@ public void testSupportedPipeCharWithRegex() { @Test public void testUnSupportedPipeChar() { String[] expectedTextTokenValue = new String[]{"thread|grep", "xxx"}; - String cmd = "thread|grep xxx"; - List actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); + List actualTokens = CliTokenImpl.tokenize("thread|grep xxx"); + assertEquals(expectedTextTokenValue, actualTokens); expectedTextTokenValue = new String[]{"trace", "-E", "classA|classB", "methodA|methodB|grep", "classA"}; - cmd = "trace -E classA|classB methodA|methodB|grep classA"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); + actualTokens = CliTokenImpl.tokenize("trace -E classA|classB methodA|methodB|grep classA"); + assertEquals(expectedTextTokenValue, actualTokens); expectedTextTokenValue = new String[]{"trace", "-E", "classA|classB", "|", "methodA|methodB", "|", "grep", "classA"}; - cmd = "trace -E classA|classB| methodA|methodB | grep classA"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); + actualTokens = CliTokenImpl.tokenize("trace -E classA|classB| methodA|methodB | grep classA"); + assertEquals(expectedTextTokenValue, actualTokens); } - @Test - public void testSeparateRedirect() { - String[] expectedTextTokenValue = new String[]{"jad", "aaa", ">", "bbb"}; - String cmd = "jad aaa> bbb"; - List actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "jad aaa > bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "jad aaa >bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "jad aaa'>' bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "jad aaa '>' bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "jad aaa '>'bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "jad aaa\">\" bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - - cmd = "jad aaa \">\" bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "jad aaa \">\"bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - expectedTextTokenValue = new String[]{"jad", "aaa >bbb"}; - - cmd = "jad aaa' >'bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "jad aaa\" >\"bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - expectedTextTokenValue = new String[]{"jad", "aaa> bbb"}; - - cmd = "jad aaa\"> \"bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "jad aaa'> 'bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - expectedTextTokenValue = new String[]{"jad", "aaa\\r", ">", "bbb"}; - - cmd = "jad aaa'\\r>' bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "jad aaa\"\\r>\" bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - expectedTextTokenValue = new String[]{"jad", "aaa'", ">", "bbb"}; - cmd = "jad aaa\"'>\" bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - expectedTextTokenValue = new String[]{"jad", "aaa'>'", "bbb"}; - cmd = "jad aaa\"'>'\" bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - expectedTextTokenValue = new String[]{"jad", "aaa\">\"", "bbb"}; - cmd = "jad aaa'\">\"' bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - } - - @Test - public void testSeparateRedirectAppend() { - String[] expectedTextTokenValue = new String[]{"jad", "aaa", ">>", "bbb"}; - String cmd = "jad aaa>> bbb"; - List actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "jad aaa >> bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "jad aaa >>bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "jad aaa'>>' bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "jad aaa '>>' bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "jad aaa '>>'bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "jad aaa\">>\" bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - - cmd = "jad aaa \">>\" bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "jad aaa \">>\"bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - expectedTextTokenValue = new String[]{"jad", "aaa >>bbb"}; - - cmd = "jad aaa' >>'bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "jad aaa\" >>\"bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - expectedTextTokenValue = new String[]{"jad", "aaa>> bbb"}; - - cmd = "jad aaa\">> \"bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "jad aaa'>> 'bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - expectedTextTokenValue = new String[]{"jad", "aaa\\r", ">>", "bbb"}; - - cmd = "jad aaa'\\r>>' bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - cmd = "jad aaa\"\\r>>\" bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - expectedTextTokenValue = new String[]{"jad", "aaa'", ">>", "bbb"}; - cmd = "jad aaa\"'>>\" bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - expectedTextTokenValue = new String[]{"jad", "aaa'>>'", "bbb"}; - cmd = "jad aaa\"'>>'\" bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - - expectedTextTokenValue = new String[]{"jad", "aaa\">>\"", "bbb"}; - cmd = "jad aaa'\">>\"' bbb"; - actualTokens = CliTokenImpl.tokenize(cmd); - assertEqualsIgnoreBlank(expectedTextTokenValue, actualTokens); - Assert.assertEquals(cmd, concatRaw(actualTokens)); - } - - private void assertEqualsIgnoreBlank(String[] expectedTextTokenValue, List actualTokens) { - Assert.assertArrayEquals(expectedTextTokenValue, removeBlankToken(actualTokens)); - } - - private static String[] removeBlankToken(List cliTokens) { - List copy = new ArrayList<>(cliTokens); - return copy.stream() - .filter(token -> !token.isBlank()) - .map(CliToken::value) - .toArray(String[]::new); + private void assertEquals(String[] expectedTextTokenValue, List actualTokens) { + removeBlankToken(actualTokens); + for (int i = 0; i < expectedTextTokenValue.length; i++) { + Assert.assertEquals(expectedTextTokenValue[i], actualTokens.get(i).value()); + } } - private static String concatRaw(List tokens) { - StringBuilder builder = new StringBuilder(); - for (CliToken token : tokens) { - builder.append(token.raw()); + private void removeBlankToken(List cliTokens) { + CliToken blankToken = new CliTokenImpl(false, " "); + Iterator it = cliTokens.iterator(); + while (it.hasNext()) { + CliToken token = it.next(); + if (blankToken.equals(token)) { + it.remove(); + } } - return builder.toString(); } }