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
*/