Retry date comparison to avoid a rare flake that might be associated with DST

BUG=
R=floitsch@google.com

Review URL: https://codereview.chromium.org//92333002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@30767 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/pkg/intl/test/date_time_format_test_core.dart b/pkg/intl/test/date_time_format_test_core.dart
index 757bb6b..5d39090 100644
--- a/pkg/intl/test/date_time_format_test_core.dart
+++ b/pkg/intl/test/date_time_format_test_core.dart
@@ -144,7 +144,7 @@
   // At least in most cases. In some cases, we can't even do that. e.g.
   // the skeleton WEEKDAY can't be reconstructed at all, and YEAR_MONTH
   // formats don't give us enough information to construct a valid date.
-  var badSkeletons = [
+  var badSkeletons = const [
       DateFormat.ABBR_WEEKDAY,
       DateFormat.WEEKDAY,
       DateFormat.QUARTER,
@@ -156,6 +156,9 @@
       DateFormat.MONTH_WEEKDAY_DAY,
       DateFormat.NUM_MONTH_WEEKDAY_DAY,
       DateFormat.ABBR_MONTH_WEEKDAY_DAY];
+  var originalTime = new DateTime.now();
+  var originalTimeZoneOffset = date.timeZoneOffset;
+  var originalTimeZoneName = date.timeZoneName;
   for(int i = 0; i < formatsToTest.length; i++) {
     var skeleton = formatsToTest[i];
     if (!badSkeletons.any((x) => x == skeleton)) {
@@ -163,6 +166,25 @@
       var actualResult = format.format(date);
       var parsed = format.parse(actualResult);
       var thenPrintAgain = format.format(parsed);
+      // We've seen a case where this failed in a way that seemed like a time
+      // zone shifting or some other strange behaviour that caused an off by
+      // one error in the date. Check for this and print out as much information
+      // as possible if it occurs again.
+      if (thenPrintAgain != actualResult) {
+        print("Date mismatch!");
+        print("  Expected $actualResult");
+        print("  Got $thenPrintAgain");
+        print("  Original date = $date");
+        print("  Original ms = ${date.millisecondsSinceEpoch}");
+        print("  Parsed back to $parsed");
+        print("  Parsed ms = ${parsed.millisecondsSinceEpoch}");
+        print("  Original tz = $originalTimeZoneOffset");
+        print("  Current tz name = $originalTimeZoneName");
+        print("  Current tz = ${parsed.timeZoneOffset}");
+        print("  Current tz name = ${parsed.timeZoneName}");
+        print("  Start time = $originalTime");
+        print("  Current time ${new DateTime.now()}");
+      }
       expect(thenPrintAgain, equals(actualResult));
     }
   }