Fix a bug in Timestamp.compareTo where the result could be wrong if
the timestamps differed by more than 2^31 milliseconds.
Patch by: jat
Review by: jimbrooks
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9506 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/super/com/google/gwt/emul/java/sql/Timestamp.java b/user/super/com/google/gwt/emul/java/sql/Timestamp.java
index 8e2c62a..cfa4fa4 100644
--- a/user/super/com/google/gwt/emul/java/sql/Timestamp.java
+++ b/user/super/com/google/gwt/emul/java/sql/Timestamp.java
@@ -116,8 +116,8 @@
}
public int compareTo(Timestamp o) {
- int delta = (int) (getTime() - o.getTime());
- return delta == 0 ? getNanos() - o.getNanos() : delta;
+ int sign = Long.signum(getTime() - o.getTime());
+ return sign == 0 ? getNanos() - o.getNanos() : sign;
}
@Override
diff --git a/user/super/com/google/gwt/emul/java/util/Date.java b/user/super/com/google/gwt/emul/java/util/Date.java
index dafbe17..08190bc 100644
--- a/user/super/com/google/gwt/emul/java/util/Date.java
+++ b/user/super/com/google/gwt/emul/java/util/Date.java
@@ -125,15 +125,7 @@
}
public int compareTo(Date other) {
- long thisTime = getTime();
- long otherTime = other.getTime();
- if (thisTime < otherTime) {
- return -1;
- } else if (thisTime > otherTime) {
- return 1;
- } else {
- return 0;
- }
+ return Long.signum(getTime() - other.getTime());
}
@Override
diff --git a/user/test/com/google/gwt/emultest/java/sql/SqlTimestampTest.java b/user/test/com/google/gwt/emultest/java/sql/SqlTimestampTest.java
index 052ec45..a6598c0 100644
--- a/user/test/com/google/gwt/emultest/java/sql/SqlTimestampTest.java
+++ b/user/test/com/google/gwt/emultest/java/sql/SqlTimestampTest.java
@@ -36,6 +36,14 @@
return "com.google.gwt.emultest.EmulSuite";
}
+ public void testCompareTo() {
+ Timestamp now = Timestamp.valueOf("2011-01-05 12:45:18.000000000");
+ // add 1.5 << 31 so coercing the ms difference to int results in a
+ // sign change
+ Timestamp later = new Timestamp(now.getTime() + (3L << 30));
+ assertTrue("later <= now", later.compareTo(now) > 0);
+ }
+
/**
* Timestamps have some non-obvious comparison semantics when compared to
* dates.