Fix BigDecimal equals

Bug: #8622
Bug-Link: http://github.com/gwtproject/gwt/issues/8622
Change-Id: I0e90487d53843f0ff1bdcc11b3aee798b62a9ac4
diff --git a/user/super/com/google/gwt/emul/java/math/BigDecimal.java b/user/super/com/google/gwt/emul/java/math/BigDecimal.java
index 40098f3..4f734d2 100644
--- a/user/super/com/google/gwt/emul/java/math/BigDecimal.java
+++ b/user/super/com/google/gwt/emul/java/math/BigDecimal.java
@@ -1566,9 +1566,7 @@
     }
     if (x instanceof BigDecimal) {
       BigDecimal x1 = (BigDecimal) x;
-      return x1.scale == scale
-          && (bitLength < SMALL_VALUE_BITS ? (x1.smallValue == smallValue)
-              : intVal.equals(x1.intVal));
+      return (this.scale == x1.scale && this.compareTo(x1) == 0);
     }
     return false;
   }
diff --git a/user/test/com/google/gwt/emultest/java/math/BigDecimalCompareTest.java b/user/test/com/google/gwt/emultest/java/math/BigDecimalCompareTest.java
index 9d2b7fc..2747a58 100644
--- a/user/test/com/google/gwt/emultest/java/math/BigDecimalCompareTest.java
+++ b/user/test/com/google/gwt/emultest/java/math/BigDecimalCompareTest.java
@@ -248,6 +248,76 @@
   }
 
   /**
+   * Equals() for unequal BigDecimals.
+   */
+  public void testEqualsUnequal4() {
+    String a = "0";
+    int aScale = 0;
+    String b = "92948782094488478231212478987482988429808779810457634781384756794987";
+    int bScale = 0;
+    BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
+    BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
+    assertFalse(aNumber.equals(bNumber));
+  }
+
+  /**
+   * Equals() for unequal BigDecimals.
+   */
+  public void testEqualsUnequal5() {
+    String a = "92948782094488478231212478987482988429808779810457634781384756794987";
+    int aScale = 0;
+    String b = "0";
+    int bScale = 0;
+    BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
+    BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
+    assertFalse(aNumber.equals(bNumber));
+  }
+
+  /**
+   * Equals() for unequal BigDecimals.
+   */
+  public void testEqualsUnequal6() {
+    double a = 0;
+    double b = 1;
+    BigDecimal aNumber = new BigDecimal(a);
+    BigDecimal bNumber = new BigDecimal(b);
+    assertFalse(aNumber.equals(bNumber));
+  }
+
+  /**
+   * Equals() for unequal BigDecimals.
+   */
+  public void testEqualsUnequal7() {
+    double a = 0.0;
+    double b = 1;
+    BigDecimal aNumber = new BigDecimal(a);
+    BigDecimal bNumber = new BigDecimal(b);
+    assertFalse(aNumber.equals(bNumber));
+  }
+
+  /**
+   * Equals() for unequal BigDecimals.
+   */
+  public void testEqualsUnequal8() {
+    double a = 0;
+    double b = 1.0;
+    BigDecimal aNumber = new BigDecimal(a);
+    BigDecimal bNumber = new BigDecimal(b);
+    assertFalse(aNumber.equals(bNumber));
+  }
+
+  /**
+   * Equals() for unequal BigDecimals.
+   */
+  public void testEqualsUnequal9() {
+    double a = 0.0;
+    double b = 1.0;
+    BigDecimal aNumber = new BigDecimal(a);
+    BigDecimal bNumber = new BigDecimal(b);
+    assertFalse(aNumber.equals(bNumber));
+  }
+
+  /**
    * Test identical fraction values with different scales.
    * http://code.google.com/p/google-web-toolkit/issues/detail?id=7834
    */