From b38593d714c4b65c3e0c767ecaeea3496d6d24b9 Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Sun, 8 Dec 2024 20:03:40 -0600 Subject: [PATCH] Fix a bug, and fix unit tests for constant folding --- .../com/google/gwt/emul/java/lang/String.java | 2 +- .../java/lang/CompilerConstantStringTest.java | 27 ++++++++++++++----- .../gwt/emultest/java/lang/StringTest.java | 14 ++++++++-- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/user/super/com/google/gwt/emul/java/lang/String.java b/user/super/com/google/gwt/emul/java/lang/String.java index ed2179f08c8..42af2f1fe5e 100644 --- a/user/super/com/google/gwt/emul/java/lang/String.java +++ b/user/super/com/google/gwt/emul/java/lang/String.java @@ -654,7 +654,7 @@ public String[] split(String regex, int maxMatch) { } else { int matchIndex = matchObj.getIndex(); - if (lastTrail == null && matchIndex == 0) { + if (lastTrail == null && matchIndex == 0 && matchObj.asArray()[0].length() == 0) { // As of Java 8, we should discard the first zero-length match if it is the beginning of // the string. Do not increment the count, and do not add to the output array. trail = trail.substring(matchIndex + matchObj.asArray()[0].length(), trail.length()); diff --git a/user/test/com/google/gwt/emultest/java/lang/CompilerConstantStringTest.java b/user/test/com/google/gwt/emultest/java/lang/CompilerConstantStringTest.java index fc58bdcbded..82aa4a8f02b 100644 --- a/user/test/com/google/gwt/emultest/java/lang/CompilerConstantStringTest.java +++ b/user/test/com/google/gwt/emultest/java/lang/CompilerConstantStringTest.java @@ -245,15 +245,30 @@ public void testSplit() { "b", "", ":and:f"}); compareList("0:", "boo:and:foo".split(":", 0), new String[] { "boo", "and", "foo"}); - } + // issue 2742 + compareList("issue2742", new String[] {}, "/".split("/", 0)); + + // Splitting an empty string should result in an array containing a single + // empty string. + String[] s = "".split(","); + assertTrue(s != null); + assertTrue(s.length == 1); + assertTrue(s[0] != null); + assertTrue(s[0].length() == 0); + + s = "abcada".split("a"); + assertTrue(s != null); + assertEquals(3, s.length); + assertEquals("", s[0]); + assertEquals("bc", s[1]); + assertEquals("d", s[2]); } public void testSplit_emptyExpr() { - // TODO(rluble): implement JDK8 string.split semantics and fix test. - // See issue 8913. - String[] expected = (TestUtils.getJdkVersion() > 7) ? - new String[] {"a", "b", "c", "x", "x", "d", "e", "x", "f", "x"} : - new String[] {"", "a", "b", "c", "x", "x", "d", "e", "x", "f", "x"}; + String[] expected = new String[] {"a", "b", "c", "x", "x", "d", "e", "x", "f", "x"}; compareList("emptyRegexSplit", expected, "abcxxdexfx".split("")); + + String[] arr = ",".split(","); + assertEquals(0, arr.length); } public void testStartsWith() { diff --git a/user/test/com/google/gwt/emultest/java/lang/StringTest.java b/user/test/com/google/gwt/emultest/java/lang/StringTest.java index 75c4053fe6f..c1c436e4b3a 100644 --- a/user/test/com/google/gwt/emultest/java/lang/StringTest.java +++ b/user/test/com/google/gwt/emultest/java/lang/StringTest.java @@ -781,20 +781,30 @@ public void testSplit() { // Splitting an empty string should result in an array containing a single // empty string. - String[] s = "".split(","); + String[] s = hideFromCompiler("").split(","); assertTrue(s != null); assertTrue(s.length == 1); assertTrue(s[0] != null); assertTrue(s[0].length() == 0); + + s = hideFromCompiler("abcada").split("a"); + assertTrue(s != null); + assertEquals(3, s.length); + assertEquals("", s[0]); + assertEquals("bc", s[1]); + assertEquals("d", s[2]); } public void testSplit_emptyExpr() { String[] expected = new String[] {"a", "b", "c", "x", "x", "d", "e", "x", "f", "x"}; compareList("emptyRegexSplit", expected, hideFromCompiler("abcxxdexfx").split("")); + + String[] arr = hideFromCompiler(",").split(","); + assertEquals(0, arr.length); } public void testStartsWith() { - String haystack = "abcdefghi"; + String haystack = hideFromCompiler("abcdefghi"); assertTrue(haystack.startsWith("abc")); assertTrue(haystack.startsWith("bc", 1)); assertTrue(haystack.startsWith(haystack));