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