diff options
Diffstat (limited to 'luni/src')
3 files changed, 82 insertions, 53 deletions
diff --git a/luni/src/main/java/org/apache/harmony/luni/util/FloatingPointParser.java b/luni/src/main/java/org/apache/harmony/luni/util/FloatingPointParser.java index f4774fd..038c1d3 100644 --- a/luni/src/main/java/org/apache/harmony/luni/util/FloatingPointParser.java +++ b/luni/src/main/java/org/apache/harmony/luni/util/FloatingPointParser.java @@ -196,66 +196,29 @@ public final class FloatingPointParser { return new StringExponentPair(s, e, negative); } - /* - * Assumes the string is trimmed. - */ - private static double parseDblName(String namedDouble, int length) { - // Valid strings are only +Nan, NaN, -Nan, +Infinity, Infinity, - // -Infinity. - if ((length != 3) && (length != 4) && (length != 8) && (length != 9)) { - throw invalidReal(namedDouble, true); - } - + // Parses "+Nan", "NaN", "-Nan", "+Infinity", "Infinity", and "-Infinity", case-insensitively. + private static float parseName(String name, boolean isDouble) { + // Explicit sign? boolean negative = false; int i = 0; - char firstChar = namedDouble.charAt(i); - if (firstChar == '-') { - negative = true; - ++i; - } else if (firstChar == '+') { - ++i; - } - - if (namedDouble.regionMatches(false, i, "Infinity", 0, 8)) { - return negative ? Double.NEGATIVE_INFINITY : Float.POSITIVE_INFINITY; - } - - if (namedDouble.regionMatches(false, i, "NaN", 0, 3)) { - return Double.NaN; - } - - throw invalidReal(namedDouble, true); - } - - /* - * Assumes the string is trimmed. - */ - private static float parseFltName(String namedFloat, int length) { - // Valid strings are only +Nan, NaN, -Nan, +Infinity, Infinity, - // -Infinity. - if ((length != 3) && (length != 4) && (length != 8) && (length != 9)) { - throw invalidReal(namedFloat, false); - } - - boolean negative = false; - int i = 0; - char firstChar = namedFloat.charAt(i); + int length = name.length(); + char firstChar = name.charAt(i); if (firstChar == '-') { negative = true; ++i; + --length; } else if (firstChar == '+') { ++i; + --length; } - if (namedFloat.regionMatches(false, i, "Infinity", 0, 8)) { + if (length == 8 && name.regionMatches(false, i, "Infinity", 0, 8)) { return negative ? Float.NEGATIVE_INFINITY : Float.POSITIVE_INFINITY; } - - if (namedFloat.regionMatches(false, i, "NaN", 0, 3)) { + if (length == 3 && name.regionMatches(false, i, "NaN", 0, 3)) { return Float.NaN; } - - throw invalidReal(namedFloat, false); + throw invalidReal(name, isDouble); } /** @@ -278,8 +241,8 @@ public final class FloatingPointParser { // See if this could be a named double char last = s.charAt(length - 1); - if ((last == 'y') || (last == 'N')) { - return parseDblName(s, length); + if (last == 'y' || last == 'N') { + return parseName(s, true); } // See if it could be a hexadecimal representation. @@ -320,8 +283,8 @@ public final class FloatingPointParser { // See if this could be a named float char last = s.charAt(length - 1); - if ((last == 'y') || (last == 'N')) { - return parseFltName(s, length); + if (last == 'y' || last == 'N') { + return parseName(s, false); } // See if it could be a hexadecimal representation diff --git a/luni/src/test/java/libcore/java/lang/DoubleTest.java b/luni/src/test/java/libcore/java/lang/DoubleTest.java index f92ae33..988174b 100644 --- a/luni/src/test/java/libcore/java/lang/DoubleTest.java +++ b/luni/src/test/java/libcore/java/lang/DoubleTest.java @@ -19,9 +19,44 @@ package libcore.java.lang; import junit.framework.TestCase; public class DoubleTest extends TestCase { - // http://b/3238333 - public void test3238333() throws Exception { + public void testDoubleToStringUnsignedDivide() throws Exception { + // http://b/3238333 assertEquals("0.008", Double.toString(0.008)); assertEquals("0.008366", Double.toString(0.008366)); + // http://code.google.com/p/android/issues/detail?id=14033 + assertEquals("0.009", Double.toString(0.009)); + // http://code.google.com/p/android/issues/detail?id=14302 + assertEquals("0.008567856012638986", Double.toString(0.008567856012638986)); + assertEquals("0.010206713752229896", Double.toString(0.010206713752229896)); + } + + public void testNamedDoubles() throws Exception { + assertEquals(Double.NaN, Double.parseDouble("NaN")); + assertEquals(Double.NaN, Double.parseDouble("-NaN")); + assertEquals(Double.NaN, Double.parseDouble("+NaN")); + try { + Double.parseDouble("NNaN"); + fail(); + } catch (NumberFormatException expected) { + } + try { + Double.parseDouble("NaNN"); + fail(); + } catch (NumberFormatException expected) { + } + + assertEquals(Double.POSITIVE_INFINITY, Double.parseDouble("+Infinity")); + assertEquals(Double.POSITIVE_INFINITY, Double.parseDouble("Infinity")); + assertEquals(Double.NEGATIVE_INFINITY, Double.parseDouble("-Infinity")); + try { + Double.parseDouble("IInfinity"); + fail(); + } catch (NumberFormatException expected) { + } + try { + Double.parseDouble("Infinityy"); + fail(); + } catch (NumberFormatException expected) { + } } } diff --git a/luni/src/test/java/libcore/java/lang/FloatTest.java b/luni/src/test/java/libcore/java/lang/FloatTest.java index 3708d87..de20ce7 100644 --- a/luni/src/test/java/libcore/java/lang/FloatTest.java +++ b/luni/src/test/java/libcore/java/lang/FloatTest.java @@ -22,9 +22,40 @@ public class FloatTest extends junit.framework.TestCase { // http://code.google.com/p/android/issues/detail?id=4185 assertEquals(2358.166016f, Float.valueOf("2358.166016")); } + public void test_valueOf_String2() throws Exception { // This threw OutOfMemoryException. // http://code.google.com/p/android/issues/detail?id=3156 assertEquals(-2.14748365E9f, Float.valueOf(String.valueOf(Integer.MIN_VALUE))); } + + public void testNamedFloats() throws Exception { + assertEquals(Float.NaN, Float.parseFloat("NaN")); + assertEquals(Float.NaN, Float.parseFloat("-NaN")); + assertEquals(Float.NaN, Float.parseFloat("+NaN")); + try { + Float.parseFloat("NNaN"); + fail(); + } catch (NumberFormatException expected) { + } + try { + Float.parseFloat("NaNN"); + fail(); + } catch (NumberFormatException expected) { + } + + assertEquals(Float.POSITIVE_INFINITY, Float.parseFloat("+Infinity")); + assertEquals(Float.POSITIVE_INFINITY, Float.parseFloat("Infinity")); + assertEquals(Float.NEGATIVE_INFINITY, Float.parseFloat("-Infinity")); + try { + Float.parseFloat("IInfinity"); + fail(); + } catch (NumberFormatException expected) { + } + try { + Float.parseFloat("Infinityy"); + fail(); + } catch (NumberFormatException expected) { + } + } } |