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));
}
/**