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.