Fix external issue 1581: Double.parseDouble treats whitespace differently in hosted mode

Allow whitespace in Float.parseFloat and Double.parseDouble.  Also, allow both 'e' and
'E' for the exponent delimiter.  Add some unit tests.

Review by: fabbott (desk review)



git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@7344 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/super/com/google/gwt/emul/java/lang/Number.java b/user/super/com/google/gwt/emul/java/lang/Number.java
index 2628318..b96270b 100644
--- a/user/super/com/google/gwt/emul/java/lang/Number.java
+++ b/user/super/com/google/gwt/emul/java/lang/Number.java
@@ -164,7 +164,7 @@
   private static native double __parseDouble(String str) /*-{
     var floatRegex = @java.lang.Number::floatRegex;
     if (!floatRegex) {
-      floatRegex = @java.lang.Number::floatRegex = /^[+-]?\d*\.?\d*(e[+-]?\d+)?$/i;
+      floatRegex = @java.lang.Number::floatRegex = /^\s*[+-]?\d*\.?\d*([eE][+-]?\d+)?\s*$/i;
     }
     if (floatRegex.test(str)) {
       return parseFloat(str);
diff --git a/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java b/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java
index 283763b..4440997 100644
--- a/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java
@@ -78,5 +78,20 @@
     assertTrue(
         "Can't parse MAX_VALUE",
         Double.MAX_VALUE == Double.parseDouble(String.valueOf(Double.MAX_VALUE)));
+    
+    // Test that leading and trailing whitespace is ignored
+    // Test that both 'e' and 'E' may be used as the exponent delimiter
+    assertTrue(2.56789e1 == Double.parseDouble("2.56789e1"));
+    assertTrue(2.56789e1 == Double.parseDouble("  2.56789E+1"));
+    assertTrue(2.56789e1 == Double.parseDouble("2.56789e1   "));
+    assertTrue(2.56789e1 == Double.parseDouble("   2.56789E01   "));
+    assertTrue(2.56789e1 == Double.parseDouble("+2.56789e1"));
+    assertTrue(2.56789e1 == Double.parseDouble("  +2.56789E+01"));
+    assertTrue(2.56789e1 == Double.parseDouble("+2.56789e1   "));
+    assertTrue(2.56789e1 == Double.parseDouble("   +2.56789E1   "));
+    assertTrue(-2.56789e1 == Double.parseDouble("-2.56789e+1"));
+    assertTrue(-2.56789e1 == Double.parseDouble("  -2.56789E1"));
+    assertTrue(-2.56789e1 == Double.parseDouble("-2.56789e+01   "));
+    assertTrue(-2.56789e1 == Double.parseDouble("   -2.56789E1   "));
   }
 }
diff --git a/user/test/com/google/gwt/emultest/java/lang/IntegerTest.java b/user/test/com/google/gwt/emultest/java/lang/IntegerTest.java
index 711e087..f008436 100644
--- a/user/test/com/google/gwt/emultest/java/lang/IntegerTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/IntegerTest.java
@@ -76,6 +76,27 @@
     } catch (NumberFormatException e) {
       // Expected behavior
     }
+
+    try {
+      Integer.parseInt("-");
+      fail("parseInt should reject \"-\"");
+    } catch (NumberFormatException e) {
+      // Expected behavior
+    }
+
+    try {
+      Integer.parseInt(" -12345");
+      fail("parseInt should reject leading whitespace");
+    } catch (NumberFormatException e) {
+      // Expected behavior
+    }
+
+    try {
+      Integer.parseInt("-12345 ");
+      fail("parseInt should reject trailing whitespace");
+    } catch (NumberFormatException e) {
+      // Expected behavior
+    }
   }
 
   public void testBinaryString() {