Author: Manuel Carrasco MoƱino <manuel.carrasco.m@gmail.com>

Fixing edge cases in String.matches() broken when using choices in the regex

Change-Id: I8e178deda88b0425e10e8dc84fcd582b19c3b1c7
Review-Link: https://gwt-review.googlesource.com/#/c/1100/

Review by: skybrian@google.com

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@11365 8db76d5a-ed1c-0410-87a9-c151d255dfc7
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 032e04c..6fab967 100644
--- a/user/super/com/google/gwt/emul/java/lang/String.java
+++ b/user/super/com/google/gwt/emul/java/lang/String.java
@@ -764,10 +764,9 @@
    * TODO(jat): properly handle Java regex syntax
    */
   public native boolean matches(String regex) /*-{
-    var matchObj = new RegExp(regex).exec(this);
-    // if there is no match at all, matchObj will be null 
-    // matchObj[0] is the entire matched string
-    return (matchObj == null) ? false : (this == matchObj[0]);
+    // We surround the regex with '^' and '$' because it must match
+    // the entire string.
+    return new RegExp('^(' + regex + ')$').test(this);
   }-*/;
 
   public int offsetByCodePoints(int index, int codePointOffset) {
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 2266c08..07b4ebb 100644
--- a/user/test/com/google/gwt/emultest/java/lang/StringTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/StringTest.java
@@ -424,18 +424,27 @@
     assertEquals("", "".toLowerCase());
   }
 
-  /*
-   * TODO: needs rewriting to avoid compiler optimizations.
-   */
   public void testMatch() {
-    assertFalse("1f", "abbbbcd".matches("b*"));
-    assertFalse("2f", "abbbbcd".matches("b+"));
-    assertTrue("3t", "abbbbcd".matches("ab*bcd"));
-    assertTrue("4t", "abbbbcd".matches("ab+cd"));
-    assertTrue("5t", "abbbbcd".matches("ab+bcd"));
-    assertFalse("6f", "abbbbcd".matches(""));
-    assertTrue("7t", "abbbbcd".matches("a.*d"));
-    assertFalse("8f", "abbbbcd".matches("a.*e"));
+    assertFalse("1f", hideFromCompiler("abbbbcd").matches("b*"));
+    assertFalse("2f", hideFromCompiler("abbbbcd").matches("b+"));
+    assertTrue("3t", hideFromCompiler("abbbbcd").matches("ab*bcd"));
+    assertTrue("4t", hideFromCompiler("abbbbcd").matches("ab+cd"));
+    assertTrue("5t", hideFromCompiler("abbbbcd").matches("ab+bcd"));
+    assertFalse("6f", hideFromCompiler("abbbbcd").matches(""));
+    assertTrue("7t", hideFromCompiler("abbbbcd").matches("a.*d"));
+    assertFalse("8f", hideFromCompiler("abbbbcd").matches("a.*e"));
+    // issue #7736
+    assertTrue("9t.1", hideFromCompiler("").matches("(|none)"));
+    assertTrue("9t.2", hideFromCompiler("none").matches("(|none)"));
+    assertFalse("9f.1", hideFromCompiler("ab").matches("(|none)"));
+    assertFalse("9f.2", hideFromCompiler("anoneb").matches("(|none)"));
+    assertTrue("10t", hideFromCompiler("none").matches("^(|none)$"));
+    assertFalse("10f", hideFromCompiler("abbbbcd").matches("^b*$"));
+    assertTrue("11t.1", hideFromCompiler("").matches("|none"));
+    assertTrue("11t.2", hideFromCompiler("none").matches("|none"));
+    assertFalse("11f.1", hideFromCompiler("ab").matches("|none"));
+    assertFalse("11f.2", hideFromCompiler("anoneb").matches("|none"));
+    assertTrue("12t", hideFromCompiler("none").matches("^|none$"));
   }
 
   /*