Fix Arrays.binarySearch semantics for float[] and double[] Change-Id: I7d4d0bc7a6d95e70a5977fabe34a198f2d234d7b
diff --git a/user/super/com/google/gwt/emul/java/util/Arrays.java b/user/super/com/google/gwt/emul/java/util/Arrays.java index 06c1ded..7af525f 100644 --- a/user/super/com/google/gwt/emul/java/util/Arrays.java +++ b/user/super/com/google/gwt/emul/java/util/Arrays.java
@@ -254,9 +254,10 @@ final int mid = low + ((high - low) >> 1); final double midVal = sortedArray[mid]; - if (midVal < key) { + int cmp = Double.compare(midVal, key); + if (cmp < 0) { low = mid + 1; - } else if (midVal > key) { + } else if (cmp > 0) { high = mid - 1; } else { // key found
diff --git a/user/test/com/google/gwt/emultest/java/util/ArraysDoubleSemanticsTest.java b/user/test/com/google/gwt/emultest/java/util/ArraysDoubleSemanticsTest.java index e1429c9..42d9b2f 100644 --- a/user/test/com/google/gwt/emultest/java/util/ArraysDoubleSemanticsTest.java +++ b/user/test/com/google/gwt/emultest/java/util/ArraysDoubleSemanticsTest.java
@@ -37,18 +37,4 @@ // Should be assertTrue(Arrays.equals(new double[] {Double.NaN}, new double[] {Double.NaN})); assertFalse(Arrays.equals(new double[] {Double.NaN}, new double[] {Double.NaN})); } - - public void testBinarySearch() throws Exception { - // Semantics don't match JVM. - if (TestUtils.isJvm()) { - return; - } - - // Should be assertEquals(-1, Arrays.binarySearch(new double[] {-0.0d}, 0.0d)); - assertEquals(0, Arrays.binarySearch(new double[] {-0.0d}, 0.0d)); - // Should be assertEquals(-1, Arrays.binarySearch(new double[] {0.0d}, Double.NaN)); - assertEquals(0, Arrays.binarySearch(new double[] {0.0d}, Double.NaN)); - // Should be assertEquals(1, Arrays.binarySearch(new double[] {0.0d, Double.NaN}, Double.NaN)); - assertEquals(0, Arrays.binarySearch(new double[] {0.0d, Double.NaN}, Double.NaN)); - } }
diff --git a/user/test/com/google/gwt/emultest/java/util/ArraysFloatSemanticsTest.java b/user/test/com/google/gwt/emultest/java/util/ArraysFloatSemanticsTest.java index 31de695..2c38e2a 100644 --- a/user/test/com/google/gwt/emultest/java/util/ArraysFloatSemanticsTest.java +++ b/user/test/com/google/gwt/emultest/java/util/ArraysFloatSemanticsTest.java
@@ -37,18 +37,4 @@ // Should be assertTrue(Arrays.equals(new float[] {Float.NaN}, new float[] {Float.NaN})); assertFalse(Arrays.equals(new float[] {Float.NaN}, new float[] {Float.NaN})); } - - public void testBinarySearch() throws Exception { - // Semantics don't match JVM. - if (TestUtils.isJvm()) { - return; - } - - // Should be assertEquals(-1, Arrays.binarySearch(new float[] {-0.0f}, 0.0f)); - assertEquals(0, Arrays.binarySearch(new float[] {-0.0f}, 0.0f)); - // Should be assertEquals(-1, Arrays.binarySearch(new float[] {0.0f}, Float.NaN)); - assertEquals(0, Arrays.binarySearch(new float[] {0.0f}, Float.NaN)); - // Should be assertEquals(1, Arrays.binarySearch(new float[] {0.0f, Float.NaN}, Float.NaN)); - assertEquals(0, Arrays.binarySearch(new float[] {0.0f, Float.NaN}, Float.NaN)); - } }
diff --git a/user/test/com/google/gwt/emultest/java/util/ArraysTest.java b/user/test/com/google/gwt/emultest/java/util/ArraysTest.java index 47d4e47..bed413c 100644 --- a/user/test/com/google/gwt/emultest/java/util/ArraysTest.java +++ b/user/test/com/google/gwt/emultest/java/util/ArraysTest.java
@@ -299,6 +299,10 @@ assertEquals(2, ret); ret = Arrays.binarySearch(a3, 1, 4, -71); assertEquals(-2, ret); + + assertEquals(-2, Arrays.binarySearch(new float[] {-0.0f}, 0.0f)); + assertEquals(-2, Arrays.binarySearch(new float[] {0.0f}, Float.NaN)); + assertEquals(1, Arrays.binarySearch(new float[] {0.0f, Float.NaN}, Float.NaN)); } /** @@ -336,6 +340,10 @@ assertEquals(2, ret); ret = Arrays.binarySearch(a3, 1, 4, -71); assertEquals(-2, ret); + + assertEquals(-2, Arrays.binarySearch(new float[] {-0.0f}, 0.0f)); + assertEquals(-2, Arrays.binarySearch(new float[] {0.0f}, Float.NaN)); + assertEquals(1, Arrays.binarySearch(new float[] {0.0f, Float.NaN}, Float.NaN)); } /**