// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import "package:expect/expect.dart";

// Dart test program for DateTime.

// Identical to _maxMillisecondsSinceEpoch in date_time.dart
const int _MAX_MILLISECONDS = 8640000000000000;

// Tests if the time moves eventually forward.
void testNow() {
  var t1 = new DateTime.now();
  bool timeMovedForward = false;
  const int N = 1000000;
  outer:
  while (true) {
    for (int i = N; i > 0; i--) {
      var t2 = new DateTime.now();
      if (t1.millisecondsSinceEpoch < t2.millisecondsSinceEpoch) {
        break outer;
      }
    }
    print("testNow: No Date.now() progress in $N loops. Time: $t1");
  }
  Expect.isFalse(t1.isUtc);
}

void testTimestamp() {
  // Assume `DateTime.now` works.
  const int N = 1000000;
  var nowBefore = DateTime.now();
  var timestamp = DateTime.timestamp();
  var iterations = 0;
  while (true) {
    // Test that `timestamp` is using the same "current time" as `now`.
    Expect.isTrue(timestamp.isUtc, "Is UTC");
    Expect.isTrue(
        nowBefore.microsecondsSinceEpoch <= timestamp.microsecondsSinceEpoch,
        "After an earlier now");

    var laterNow = DateTime.now();
    Expect.isTrue(
        timestamp.microsecondsSinceEpoch <= laterNow.microsecondsSinceEpoch,
        "Before a later now");

    var newTimestamp = DateTime.timestamp();

    // Succeed if time has also progressed.
    if (timestamp.microsecondsSinceEpoch <
        newTimestamp.microsecondsSinceEpoch) {
      break;
    }
    // Otherwise emit diagnostics occasionally, until the test times out
    // or succeeds. Which should be in at most a few milliseconds if all
    // is well.
    if (++iterations >= N) {
      print("testTimestamp: No DateTime.timestamp() progress in $N loops."
          "Time: $timestamp");
      iterations = 0;
    }

    nowBefore = laterNow;
    timestamp = newTimestamp;
  }
}

void testMillisecondsSinceEpoch() {
  var dt1 = new DateTime.now();
  var millisecondsSinceEpoch = dt1.millisecondsSinceEpoch;
  var dt2 = new DateTime.fromMillisecondsSinceEpoch(millisecondsSinceEpoch);
  Expect.equals(millisecondsSinceEpoch, dt2.millisecondsSinceEpoch);
}

void testMicrosecondsSinceEpoch() {
  var dt1 = new DateTime.fromMillisecondsSinceEpoch(1);
  var microsecondsSinceEpoch = dt1.microsecondsSinceEpoch;
  var dt2 = new DateTime.fromMicrosecondsSinceEpoch(microsecondsSinceEpoch);
  Expect.equals(microsecondsSinceEpoch, dt2.microsecondsSinceEpoch);

  dt1 = new DateTime.now();
  microsecondsSinceEpoch = dt1.microsecondsSinceEpoch;
  dt2 = new DateTime.fromMicrosecondsSinceEpoch(microsecondsSinceEpoch);
  Expect.equals(microsecondsSinceEpoch, dt2.microsecondsSinceEpoch);
}

void testEquivalentYears() {
  // All hardcoded values come from V8. This means that the values are not
  // necessarily correct (see limitations of DateTime object in
  // EcmaScript 15.9.1 and in particular 15.9.1.8/9).
  DateTime dt =
      new DateTime.fromMillisecondsSinceEpoch(-31485600000, isUtc: true);
  Expect.equals(1969, dt.year);
  Expect.equals(1, dt.month);
  Expect.equals(1, dt.day);
  Expect.equals(14, dt.hour);
  Expect.equals(0, dt.minute);
  Expect.equals(0, dt.second);
  Expect.equals(0, dt.millisecond);
  Expect.equals(0, dt.microsecond);
  dt = new DateTime.fromMillisecondsSinceEpoch(-63108000000, isUtc: true);
  Expect.equals(1968, dt.year);
  Expect.equals(1, dt.month);
  Expect.equals(1, dt.day);
  Expect.equals(14, dt.hour);
  Expect.equals(0, dt.minute);
  Expect.equals(0, dt.second);
  Expect.equals(0, dt.millisecond);
  Expect.equals(0, dt.microsecond);
  dt = new DateTime.fromMillisecondsSinceEpoch(-94644000000, isUtc: true);
  Expect.equals(1967, dt.year);
  Expect.equals(1, dt.month);
  Expect.equals(1, dt.day);
  Expect.equals(14, dt.hour);
  Expect.equals(0, dt.minute);
  Expect.equals(0, dt.second);
  Expect.equals(0, dt.millisecond);
  Expect.equals(0, dt.microsecond);
  dt = new DateTime.fromMillisecondsSinceEpoch(-126180000000, isUtc: true);
  Expect.equals(1966, dt.year);
  Expect.equals(1, dt.month);
  Expect.equals(1, dt.day);
  Expect.equals(14, dt.hour);
  Expect.equals(0, dt.minute);
  Expect.equals(0, dt.second);
  Expect.equals(0, dt.millisecond);
  Expect.equals(0, dt.microsecond);
  dt = new DateTime.fromMillisecondsSinceEpoch(-157716000000, isUtc: true);
  Expect.equals(1965, dt.year);
  Expect.equals(1, dt.month);
  Expect.equals(1, dt.day);
  Expect.equals(14, dt.hour);
  Expect.equals(0, dt.minute);
  Expect.equals(0, dt.second);
  Expect.equals(0, dt.millisecond);
  Expect.equals(0, dt.microsecond);
  dt = new DateTime.fromMillisecondsSinceEpoch(-2177402400000, isUtc: true);
  Expect.equals(1901, dt.year);
  Expect.equals(1, dt.month);
  Expect.equals(1, dt.day);
  Expect.equals(14, dt.hour);
  Expect.equals(0, dt.minute);
  Expect.equals(0, dt.second);
  Expect.equals(0, dt.millisecond);
  Expect.equals(0, dt.microsecond);
  dt = new DateTime.fromMillisecondsSinceEpoch(-5333076000000, isUtc: true);
  Expect.equals(1801, dt.year);
  Expect.equals(1, dt.month);
  Expect.equals(1, dt.day);
  Expect.equals(14, dt.hour);
  Expect.equals(0, dt.minute);
  Expect.equals(0, dt.second);
  Expect.equals(0, dt.millisecond);
  Expect.equals(0, dt.microsecond);
  dt = new DateTime.fromMillisecondsSinceEpoch(-8520285600000, isUtc: true);
  Expect.equals(1700, dt.year);
  Expect.equals(1, dt.month);
  Expect.equals(1, dt.day);
  Expect.equals(14, dt.hour);
  Expect.equals(0, dt.minute);
  Expect.equals(0, dt.second);
  Expect.equals(0, dt.millisecond);
  Expect.equals(0, dt.microsecond);
  dt = new DateTime.fromMillisecondsSinceEpoch(-14831719200000, isUtc: true);
  Expect.equals(1500, dt.year);
  Expect.equals(1, dt.month);
  Expect.equals(1, dt.day);
  Expect.equals(14, dt.hour);
  Expect.equals(0, dt.minute);
  Expect.equals(0, dt.second);
  Expect.equals(0, dt.millisecond);
  Expect.equals(0, dt.microsecond);
  dt = new DateTime.fromMillisecondsSinceEpoch(-59011408800000, isUtc: true);
  Expect.equals(100, dt.year);
  Expect.equals(1, dt.month);
  Expect.equals(1, dt.day);
  Expect.equals(14, dt.hour);
  Expect.equals(0, dt.minute);
  Expect.equals(0, dt.second);
  Expect.equals(0, dt.millisecond);
  Expect.equals(0, dt.microsecond);
  dt = new DateTime.fromMillisecondsSinceEpoch(-62011408800000, isUtc: true);
  Expect.equals(4, dt.year);
  Expect.equals(12, dt.month);
  Expect.equals(8, dt.day);
  Expect.equals(8, dt.hour);
  Expect.equals(40, dt.minute);
  Expect.equals(0, dt.second);
  Expect.equals(0, dt.millisecond);
  Expect.equals(0, dt.microsecond);
  dt = new DateTime.fromMillisecondsSinceEpoch(-64011408800000, isUtc: true);
  Expect.equals(-59, dt.year);
  Expect.equals(7, dt.month);
  Expect.equals(24, dt.day);
  Expect.equals(5, dt.hour);
  Expect.equals(6, dt.minute);
  Expect.equals(40, dt.second);
  Expect.equals(0, dt.millisecond);
  Expect.equals(0, dt.microsecond);
  final int SECONDS_YEAR_2035 = 2051222400;
  dt = new DateTime.fromMillisecondsSinceEpoch(SECONDS_YEAR_2035 * 1000 + 1,
      isUtc: true);
  Expect.equals(2035, dt.year);
  Expect.equals(1, dt.month);
  Expect.equals(1, dt.day);
  Expect.equals(0, dt.hour);
  Expect.equals(0, dt.minute);
  Expect.equals(0, dt.second);
  Expect.equals(1, dt.millisecond);
  Expect.equals(0, dt.microsecond);
  dt = new DateTime.fromMillisecondsSinceEpoch(SECONDS_YEAR_2035 * 1000 - 1,
      isUtc: true);
  Expect.equals(2034, dt.year);
  Expect.equals(12, dt.month);
  Expect.equals(31, dt.day);
  Expect.equals(23, dt.hour);
  Expect.equals(59, dt.minute);
  Expect.equals(59, dt.second);
  Expect.equals(999, dt.millisecond);
  Expect.equals(0, dt.microsecond);

  dt = new DateTime.utc(2035, 1, 1, 0, 0, 0, 1);
  Expect.equals(SECONDS_YEAR_2035 * 1000 + 1, dt.millisecondsSinceEpoch);
  dt = new DateTime.utc(2034, 12, 31, 23, 59, 59, 999);
  Expect.equals(SECONDS_YEAR_2035 * 1000 - 1, dt.millisecondsSinceEpoch);
  dt = new DateTime.fromMillisecondsSinceEpoch(SECONDS_YEAR_2035 * 1000 + 1);
  Expect.equals(
      true,
      (2035 == dt.year && 1 == dt.month && 1 == dt.day) ||
          (2034 == dt.year && 12 == dt.month && 31 == dt.day));
  Expect.equals(0, dt.second);
  Expect.equals(1, dt.millisecond);
  DateTime dt2 = new DateTime(
      dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.millisecond);
  Expect.equals(dt.millisecondsSinceEpoch, dt2.millisecondsSinceEpoch);
  dt = new DateTime.fromMillisecondsSinceEpoch(SECONDS_YEAR_2035 * 1000 - 1);
  Expect.equals(
      true,
      (2035 == dt.year && 1 == dt.month && 1 == dt.day) ||
          (2034 == dt.year && 12 == dt.month && 31 == dt.day));
  Expect.equals(59, dt.second);
  Expect.equals(999, dt.millisecond);
  Expect.equals(0, dt.microsecond);

  dt2 = new DateTime(
      dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.millisecond);
  Expect.equals(dt.millisecondsSinceEpoch, dt2.millisecondsSinceEpoch);
  dt = new DateTime.fromMillisecondsSinceEpoch(2100000000 * 1000, isUtc: true);
  Expect.equals(2036, dt.year);
  Expect.equals(7, dt.month);
  Expect.equals(18, dt.day);
  Expect.equals(13, dt.hour);
  Expect.equals(20, dt.minute);
  Expect.equals(0, dt.second);
  Expect.equals(0, dt.millisecond);
  Expect.equals(0, dt.microsecond);

  // Internally this will use the maximum value for the native calls.
  dt = new DateTime(2036, 7, 18, 13, 20);
  Expect.equals(2036, dt.year);
  Expect.equals(7, dt.month);
  Expect.equals(18, dt.day);
  Expect.equals(13, dt.hour);
  Expect.equals(20, dt.minute);
  Expect.equals(0, dt.second);
  Expect.equals(0, dt.millisecond);
  Expect.equals(0, dt.microsecond);
  Expect.equals("2036-07-18 13:20:00.000", dt.toString());

  dt = new DateTime.utc(2035, 1, 1, 0, 0, 0, 0, 1);
  Expect.equals(SECONDS_YEAR_2035 * 1000000 + 1, dt.microsecondsSinceEpoch);
  dt = new DateTime.utc(2034, 12, 31, 23, 59, 59, 999, 999);
  Expect.equals(SECONDS_YEAR_2035 * 1000000 - 1, dt.microsecondsSinceEpoch);
  dt = new DateTime.fromMicrosecondsSinceEpoch(SECONDS_YEAR_2035 * 1000000 + 1);
  Expect.equals(
      true,
      (2035 == dt.year && 1 == dt.month && 1 == dt.day) ||
          (2034 == dt.year && 12 == dt.month && 31 == dt.day));
  Expect.equals(0, dt.second);
  Expect.equals(0, dt.millisecond);
  Expect.equals(1, dt.microsecond);
  dt2 = new DateTime(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second,
      dt.millisecond, dt.microsecond);
  Expect.equals(dt.microsecondsSinceEpoch, dt2.microsecondsSinceEpoch);
  dt = new DateTime.fromMicrosecondsSinceEpoch(SECONDS_YEAR_2035 * 1000000 - 1);
  Expect.equals(
      true,
      (2035 == dt.year && 1 == dt.month && 1 == dt.day) ||
          (2034 == dt.year && 12 == dt.month && 31 == dt.day));
  Expect.equals(59, dt.second);
  Expect.equals(999, dt.millisecond);
  Expect.equals(999, dt.microsecond);

  dt2 = new DateTime(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second,
      dt.millisecond, dt.microsecond);
  Expect.equals(dt.millisecondsSinceEpoch, dt2.millisecondsSinceEpoch);
  dt = new DateTime.fromMicrosecondsSinceEpoch(2100000000 * 1000000,
      isUtc: true);
  Expect.equals(2036, dt.year);
  Expect.equals(7, dt.month);
  Expect.equals(18, dt.day);
  Expect.equals(13, dt.hour);
  Expect.equals(20, dt.minute);
  Expect.equals(0, dt.second);
  Expect.equals(0, dt.millisecond);
  Expect.equals(0, dt.microsecond);
}

void testUTCGetters() {
  var dt = new DateTime.fromMillisecondsSinceEpoch(1305140315000, isUtc: true);
  Expect.equals(2011, dt.year);
  Expect.equals(5, dt.month);
  Expect.equals(11, dt.day);
  Expect.equals(18, dt.hour);
  Expect.equals(58, dt.minute);
  Expect.equals(35, dt.second);
  Expect.equals(0, dt.millisecond);
  Expect.equals(0, dt.microsecond);
  Expect.equals(true, dt.isUtc);
  Expect.equals(1305140315000, dt.millisecondsSinceEpoch);
  dt = new DateTime.fromMillisecondsSinceEpoch(-9999999, isUtc: true);
  Expect.equals(1969, dt.year);
  Expect.equals(12, dt.month);
  Expect.equals(31, dt.day);
  Expect.equals(21, dt.hour);
  Expect.equals(13, dt.minute);
  Expect.equals(20, dt.second);
  Expect.equals(1, dt.millisecond);
  Expect.equals(0, dt.microsecond);

  dt = new DateTime.fromMicrosecondsSinceEpoch(-9999999999, isUtc: true);
  Expect.equals(1969, dt.year);
  Expect.equals(12, dt.month);
  Expect.equals(31, dt.day);
  Expect.equals(21, dt.hour);
  Expect.equals(13, dt.minute);
  Expect.equals(20, dt.second);
  Expect.equals(0, dt.millisecond);
  Expect.equals(1, dt.microsecond);
}

void testLocalGetters() {
  var dt1 = new DateTime.fromMillisecondsSinceEpoch(1305140315000);
  var dt2 = new DateTime.utc(dt1.year, dt1.month, dt1.day, dt1.hour, dt1.minute,
      dt1.second, dt1.millisecond, dt1.microsecond);
  Duration zoneOffset = dt1.difference(dt2);
  Expect.equals(true, zoneOffset.inDays == 0);
  Expect.equals(true, zoneOffset.inHours.abs() <= 12);
  Expect.equals(dt1.year, dt2.year);
  Expect.equals(dt1.month, dt2.month);
  Expect.equals(true, (dt1.day - dt2.day).abs() <= 1);
  Expect.equals(true, dt1.hour < 24);
  // There are timezones with 0.5 or 0.25 hour offsets.
  Expect.equals(
      true,
      (dt1.minute == dt2.minute) ||
          ((dt1.minute - dt2.minute).abs() == 30) ||
          ((dt1.minute - dt2.minute).abs() == 15));
  Expect.equals(dt1.second, dt2.second);
  Expect.equals(dt1.millisecond, dt2.millisecond);
  Expect.equals(dt1.microsecond, dt2.microsecond);
}

void testConstructors() {
  var dt0 = new DateTime.utc(2011, 5, 11, 18, 58, 35, 0, 0);
  var dt0b = new DateTime.utc(2011, 5, 11, 18, 58, 35, 0, 0).toLocal();
  Expect.equals(1305140315000, dt0.millisecondsSinceEpoch);
  var dt1 = new DateTime.fromMillisecondsSinceEpoch(1305140315000);
  Expect.equals(dt1.millisecondsSinceEpoch, dt0.millisecondsSinceEpoch);
  Expect.equals(dt1.microsecondsSinceEpoch, dt0.microsecondsSinceEpoch);
  Expect.equals(false, dt1 == dt0);
  Expect.equals(true, dt1 == dt0b);
  var dt3 = new DateTime(dt1.year, dt1.month, dt1.day, dt1.hour, dt1.minute,
      dt1.second, dt1.millisecond, dt1.microsecond);
  Expect.equals(dt1.millisecondsSinceEpoch, dt3.millisecondsSinceEpoch);
  Expect.equals(dt1.microsecondsSinceEpoch, dt3.microsecondsSinceEpoch);
  Expect.equals(false, dt3 == dt0);
  Expect.equals(true, dt1 == dt3);
  dt3 = new DateTime(dt1.year, dt1.month, dt1.day, dt1.hour, dt1.minute,
      dt1.second, dt1.millisecond, dt1.microsecond);
  Expect.equals(dt1.millisecondsSinceEpoch, dt3.millisecondsSinceEpoch);
  Expect.equals(dt1.microsecondsSinceEpoch, dt3.microsecondsSinceEpoch);
  Expect.equals(true, dt1 == dt3);
  var dt2 = dt1.toLocal();
  dt3 = new DateTime(2011, 5, dt1.day, dt1.hour, dt1.minute, 35, 0, 0);
  Expect.equals(dt2.millisecondsSinceEpoch, dt3.millisecondsSinceEpoch);
  Expect.equals(dt2.microsecondsSinceEpoch, dt3.microsecondsSinceEpoch);
  Expect.equals(true, dt2 == dt3);
  dt1 = new DateTime.fromMillisecondsSinceEpoch(-9999999, isUtc: true);
  dt3 = new DateTime.utc(dt1.year, dt1.month, dt1.day, dt1.hour, dt1.minute,
      dt1.second, dt1.millisecond);
  Expect.equals(dt1.millisecondsSinceEpoch, dt3.millisecondsSinceEpoch);
  Expect.equals(dt1.microsecondsSinceEpoch, dt3.microsecondsSinceEpoch);
  dt3 = new DateTime.utc(99, 1, 2, 10, 11, 12, 0);
  Expect.equals(99, dt3.year);
  Expect.equals(1, dt3.month);
  Expect.equals(2, dt3.day);
  Expect.equals(10, dt3.hour);
  Expect.equals(11, dt3.minute);
  Expect.equals(12, dt3.second);
  Expect.equals(0, dt3.millisecond);
  Expect.equals(0, dt3.microsecond);
  Expect.equals(true, dt3.isUtc);
  var dt4 = new DateTime(99, 1, 2);
  Expect.equals(99, dt4.year);
  Expect.equals(1, dt4.month);
  Expect.equals(2, dt4.day);
  Expect.equals(0, dt4.hour);
  Expect.equals(0, dt4.minute);
  Expect.equals(0, dt4.second);
  Expect.equals(0, dt4.millisecond);
  Expect.equals(0, dt4.microsecond);
  Expect.isFalse(dt4.isUtc);
  var dt5 = new DateTime.utc(99, 1, 2);
  Expect.equals(99, dt5.year);
  Expect.equals(1, dt5.month);
  Expect.equals(2, dt5.day);
  Expect.equals(0, dt5.hour);
  Expect.equals(0, dt5.minute);
  Expect.equals(0, dt5.second);
  Expect.equals(0, dt5.millisecond);
  Expect.equals(0, dt5.microsecond);
  Expect.isTrue(dt5.isUtc);
  var dt6 = new DateTime(2012, 2, 27, 13, 27, 0);
  Expect.equals(2012, dt6.year);
  Expect.equals(2, dt6.month);
  Expect.equals(27, dt6.day);
  Expect.equals(13, dt6.hour);
  Expect.equals(27, dt6.minute);
  Expect.equals(0, dt6.second);
  Expect.equals(0, dt6.millisecond);
  Expect.equals(0, dt6.microsecond);
  Expect.isFalse(dt6.isUtc);
  var dt7 = new DateTime.utc(2012, 2, 27, 13, 27, 0);
  Expect.equals(2012, dt7.year);
  Expect.equals(2, dt7.month);
  Expect.equals(27, dt7.day);
  Expect.equals(13, dt7.hour);
  Expect.equals(27, dt7.minute);
  Expect.equals(0, dt7.second);
  Expect.equals(0, dt7.millisecond);
  Expect.equals(0, dt7.microsecond);
  Expect.isTrue(dt7.isUtc);
}

void testChangeTimeZone() {
  var dt1 = new DateTime.fromMillisecondsSinceEpoch(1305140315000);
  var dt2 = dt1.toUtc();
  Expect.equals(dt1.millisecondsSinceEpoch, dt2.millisecondsSinceEpoch);
  var dt3 = new DateTime.fromMillisecondsSinceEpoch(1305140315000, isUtc: true);
  Expect.equals(dt1.millisecondsSinceEpoch, dt3.millisecondsSinceEpoch);
  Expect.equals(dt2.year, dt3.year);
  Expect.equals(dt2.month, dt3.month);
  Expect.equals(dt2.day, dt3.day);
  Expect.equals(dt2.hour, dt3.hour);
  Expect.equals(dt2.minute, dt3.minute);
  Expect.equals(dt2.second, dt3.second);
  Expect.equals(dt2.millisecond, dt3.millisecond);
  Expect.equals(dt2.microsecond, dt3.microsecond);
  var dt4 = dt3.toLocal();
  Expect.equals(dt1.year, dt4.year);
  Expect.equals(dt1.month, dt4.month);
  Expect.equals(dt1.day, dt4.day);
  Expect.equals(dt1.hour, dt4.hour);
  Expect.equals(dt1.minute, dt4.minute);
  Expect.equals(dt1.second, dt4.second);
  Expect.equals(dt1.millisecond, dt4.millisecond);
  Expect.equals(dt1.microsecond, dt4.microsecond);
}

void testSubAdd() {
  var dt1 = new DateTime.fromMillisecondsSinceEpoch(1305140315000, isUtc: true);
  var dt2 = dt1
      .add(new Duration(milliseconds: 3 * Duration.millisecondsPerSecond + 5));
  Expect.equals(dt1.year, dt2.year);
  Expect.equals(dt1.month, dt2.month);
  Expect.equals(dt1.day, dt2.day);
  Expect.equals(dt1.hour, dt2.hour);
  Expect.equals(dt1.minute, dt2.minute);
  Expect.equals(dt1.second + 3, dt2.second);
  Expect.equals(dt1.millisecond + 5, dt2.millisecond);
  Expect.equals(dt1.microsecond, dt2.microsecond);
  var dt3 = dt2.subtract(
      new Duration(milliseconds: 3 * Duration.millisecondsPerSecond + 5));
  Expect.equals(true, dt1 == dt3);
  Expect.equals(false, dt1 == dt2);

  dt1 = new DateTime.fromMillisecondsSinceEpoch(1305140315000, isUtc: true);
  dt2 = dt1
      .add(new Duration(microseconds: 3 * Duration.microsecondsPerSecond + 5));
  Expect.equals(dt1.year, dt2.year);
  Expect.equals(dt1.month, dt2.month);
  Expect.equals(dt1.day, dt2.day);
  Expect.equals(dt1.hour, dt2.hour);
  Expect.equals(dt1.minute, dt2.minute);
  Expect.equals(dt1.second + 3, dt2.second);
  Expect.equals(dt1.millisecond, dt2.millisecond);
  Expect.equals(dt1.microsecond + 5, dt2.microsecond);
  dt3 = dt2.subtract(
      new Duration(microseconds: 3 * Duration.microsecondsPerSecond + 5));
  Expect.equals(true, dt1 == dt3);
  Expect.equals(false, dt1 == dt2);
}

void testUnderflowAndOverflow() {
  final dtBase = new DateTime(2012, 6, 20, 12, 30, 30, 500, 499);

  // Millisecond
  print("  >>> Millisecond+");
  var dt = new DateTime(dtBase.year, dtBase.month, dtBase.day, dtBase.hour,
      dtBase.minute, dtBase.second, 1000, dtBase.microsecond);
  Expect.equals(dtBase.year, dt.year);
  Expect.equals(dtBase.month, dt.month);
  Expect.equals(dtBase.day, dt.day);
  Expect.equals(dtBase.hour, dt.hour);
  Expect.equals(dtBase.minute, dt.minute);
  Expect.equals(dtBase.second + 1, dt.second);
  Expect.equals(0, dt.millisecond);
  Expect.equals(dtBase.microsecond, dt.microsecond);

  print("  >>> Millisecond-");
  dt = new DateTime(dtBase.year, dtBase.month, dtBase.day, dtBase.hour,
      dtBase.minute, dtBase.second, -1000, dtBase.microsecond);
  Expect.equals(dtBase.year, dt.year);
  Expect.equals(dtBase.month, dt.month);
  Expect.equals(dtBase.day, dt.day);
  Expect.equals(dtBase.hour, dt.hour);
  Expect.equals(dtBase.minute, dt.minute);
  Expect.equals(dtBase.second - 1, dt.second);
  Expect.equals(0, dt.millisecond);
  Expect.equals(dtBase.microsecond, dt.microsecond);

  // Second
  print("  >>> Second+");
  dt = new DateTime(dtBase.year, dtBase.month, dtBase.day, dtBase.hour,
      dtBase.minute, 60, dtBase.millisecond, dtBase.microsecond);
  Expect.equals(dtBase.year, dt.year);
  Expect.equals(dtBase.month, dt.month);
  Expect.equals(dtBase.day, dt.day);
  Expect.equals(dtBase.hour, dt.hour);
  Expect.equals(dtBase.minute + 1, dt.minute);
  Expect.equals(0, dt.second);
  Expect.equals(dtBase.millisecond, dt.millisecond);
  Expect.equals(dtBase.microsecond, dt.microsecond);

  print("  >>> Second-");
  dt = new DateTime(dtBase.year, dtBase.month, dtBase.day, dtBase.hour,
      dtBase.minute, -60, dtBase.millisecond, dtBase.microsecond);
  Expect.equals(dtBase.year, dt.year);
  Expect.equals(dtBase.month, dt.month);
  Expect.equals(dtBase.day, dt.day);
  Expect.equals(dtBase.hour, dt.hour);
  Expect.equals(dtBase.minute - 1, dt.minute);
  Expect.equals(0, dt.second);
  Expect.equals(dtBase.millisecond, dt.millisecond);
  Expect.equals(dtBase.microsecond, dt.microsecond);

  // Minute
  print("  >>> Minute+");
  dt = new DateTime(dtBase.year, dtBase.month, dtBase.day, dtBase.hour, 60,
      dtBase.second, dtBase.millisecond, dtBase.microsecond);
  Expect.equals(dtBase.year, dt.year);
  Expect.equals(dtBase.month, dt.month);
  Expect.equals(dtBase.day, dt.day);
  Expect.equals(dtBase.hour + 1, dt.hour);
  Expect.equals(0, dt.minute);
  Expect.equals(dtBase.second, dt.second);
  Expect.equals(dtBase.millisecond, dt.millisecond);
  Expect.equals(dtBase.microsecond, dt.microsecond);

  print("  >>> Minute-");
  dt = new DateTime(dtBase.year, dtBase.month, dtBase.day, dtBase.hour, -60,
      dtBase.second, dtBase.millisecond, dtBase.microsecond);
  Expect.equals(dtBase.year, dt.year);
  Expect.equals(dtBase.month, dt.month);
  Expect.equals(dtBase.day, dt.day);
  Expect.equals(dtBase.hour - 1, dt.hour);
  Expect.equals(0, dt.minute);
  Expect.equals(dtBase.second, dt.second);
  Expect.equals(dtBase.millisecond, dt.millisecond);
  Expect.equals(dtBase.microsecond, dt.microsecond);

  // Hour
  print("  >>> Hour+");
  dt = new DateTime(dtBase.year, dtBase.month, dtBase.day, 24, dtBase.minute,
      dtBase.second, dtBase.millisecond, dtBase.microsecond);
  Expect.equals(dtBase.year, dt.year);
  Expect.equals(dtBase.month, dt.month);
  Expect.equals(dtBase.day + 1, dt.day);
  Expect.equals(0, dt.hour);
  Expect.equals(dtBase.minute, dt.minute);
  Expect.equals(dtBase.second, dt.second);
  Expect.equals(dtBase.millisecond, dt.millisecond);
  Expect.equals(dtBase.microsecond, dt.microsecond);

  print("  >>> Hour-");
  dt = new DateTime(dtBase.year, dtBase.month, dtBase.day, -24, dtBase.minute,
      dtBase.second, dtBase.millisecond, dtBase.microsecond);
  Expect.equals(dtBase.year, dt.year);
  Expect.equals(dtBase.month, dt.month);
  Expect.equals(dtBase.day - 1, dt.day);
  Expect.equals(0, dt.hour);
  Expect.equals(dtBase.minute, dt.minute);
  Expect.equals(dtBase.second, dt.second);
  Expect.equals(dtBase.millisecond, dt.millisecond);
  Expect.equals(dtBase.microsecond, dt.microsecond);

  // Day
  print("  >>> Day+");
  dt = new DateTime(dtBase.year, dtBase.month, 31, dtBase.hour, dtBase.minute,
      dtBase.second, dtBase.millisecond, dtBase.microsecond);
  Expect.equals(dtBase.year, dt.year);
  Expect.equals(dtBase.month + 1, dt.month);
  Expect.equals(1, dt.day);
  Expect.equals(dtBase.hour, dt.hour);
  Expect.equals(dtBase.minute, dt.minute);
  Expect.equals(dtBase.second, dt.second);
  Expect.equals(dtBase.millisecond, dt.millisecond);
  Expect.equals(dtBase.microsecond, dt.microsecond);

  print("  >>> Day-");
  dt = new DateTime(dtBase.year, dtBase.month, -30, dtBase.hour, dtBase.minute,
      dtBase.second, dtBase.millisecond, dtBase.microsecond);
  Expect.equals(dtBase.year, dt.year);
  Expect.equals(dtBase.month - 1, dt.month);
  Expect.equals(1, dt.day);
  Expect.equals(dtBase.hour, dt.hour);
  Expect.equals(dtBase.minute, dt.minute);
  Expect.equals(dtBase.second, dt.second);
  Expect.equals(dtBase.millisecond, dt.millisecond);
  Expect.equals(dtBase.microsecond, dt.microsecond);

  // Month
  print("  >>> Month+");
  dt = new DateTime(dtBase.year, 13, dtBase.day, dtBase.hour, dtBase.minute,
      dtBase.second, dtBase.millisecond, dtBase.microsecond);
  Expect.equals(dtBase.year + 1, dt.year);
  Expect.equals(1, dt.month);
  Expect.equals(dtBase.day, dt.day);
  Expect.equals(dtBase.hour, dt.hour);
  Expect.equals(dtBase.minute, dt.minute);
  Expect.equals(dtBase.second, dt.second);
  Expect.equals(dtBase.millisecond, dt.millisecond);
  Expect.equals(dtBase.microsecond, dt.microsecond);

  print("  >>> Month-");
  dt = new DateTime(dtBase.year, -11, dtBase.day, dtBase.hour, dtBase.minute,
      dtBase.second, dtBase.millisecond, dtBase.microsecond);
  Expect.equals(dtBase.year - 1, dt.year);
  Expect.equals(1, dt.month);
  Expect.equals(dtBase.day, dt.day);
  Expect.equals(dtBase.hour, dt.hour);
  Expect.equals(dtBase.minute, dt.minute);
  Expect.equals(dtBase.second, dt.second);
  Expect.equals(dtBase.millisecond, dt.millisecond);
  Expect.equals(dtBase.microsecond, dt.microsecond);

  // Flowing all the way up the chain.
  print("  >>> Flow+");
  var dtBase1 = new DateTime(2012, 12, 31, 23, 59, 59, 999, 000);
  var dtTick = new DateTime(
      dtBase1.year,
      dtBase1.month,
      dtBase1.day,
      dtBase1.hour,
      dtBase1.minute,
      dtBase1.second,
      dtBase1.millisecond + 1,
      dtBase1.microsecond);
  Expect.equals(dtBase1.year + 1, dtTick.year);
  Expect.equals(1, dtTick.month);
  Expect.equals(1, dtTick.day);
  Expect.equals(0, dtTick.hour);
  Expect.equals(0, dtTick.minute);
  Expect.equals(0, dtTick.second);
  Expect.equals(0, dtTick.millisecond);
  Expect.equals(0, dtTick.microsecond);

  print("  >>> Flow-");
  dtBase1 = new DateTime(2012, 1, 1, 0, 0, 0, 0);
  dtTick = new DateTime(
      dtBase1.year,
      dtBase1.month,
      dtBase1.day,
      dtBase1.hour,
      dtBase1.minute,
      dtBase1.second,
      dtBase1.millisecond - 1,
      dtBase1.microsecond);
  Expect.equals(dtBase1.year - 1, dtTick.year);
  Expect.equals(12, dtTick.month);
  Expect.equals(31, dtTick.day);
  Expect.equals(23, dtTick.hour);
  Expect.equals(59, dtTick.minute);
  Expect.equals(59, dtTick.second);
  Expect.equals(999, dtTick.millisecond);
  Expect.equals(0, dtTick.microsecond);

  print("  >>> extra underflow");
  dtTick = new DateTime(dtBase1.year, dtBase1.month, dtBase1.day, -17520,
      dtBase1.minute, dtBase1.second, dtBase1.millisecond, dtBase1.microsecond);
  Expect.equals(dtBase1.year - 2, dtTick.year);
  Expect.equals(dtBase1.month, dtTick.month);
  Expect.equals(dtBase1.day, dtTick.day);
  Expect.equals(dtBase1.hour, dtTick.hour);
  Expect.equals(dtBase1.minute, dtTick.minute);
  Expect.equals(dtBase1.second, dtTick.second);
  Expect.equals(dtBase1.millisecond, dtTick.millisecond);
  Expect.equals(dtBase1.microsecond, dtTick.microsecond);

  // Microsecond
  print("  >>> Microsecond+");
  dt = new DateTime(dtBase.year, dtBase.month, dtBase.day, dtBase.hour,
      dtBase.minute, dtBase.second, dtBase.millisecond, 1000);
  Expect.equals(dtBase.year, dt.year);
  Expect.equals(dtBase.month, dt.month);
  Expect.equals(dtBase.day, dt.day);
  Expect.equals(dtBase.hour, dt.hour);
  Expect.equals(dtBase.minute, dt.minute);
  Expect.equals(dtBase.second, dt.second);
  Expect.equals(dtBase.millisecond + 1, dt.millisecond);
  Expect.equals(0, dt.microsecond);

  print("  >>> Microsecond-");
  dt = new DateTime(dtBase.year, dtBase.month, dtBase.day, dtBase.hour,
      dtBase.minute, dtBase.second, dtBase.millisecond, -1000);
  Expect.equals(dtBase.year, dt.year);
  Expect.equals(dtBase.month, dt.month);
  Expect.equals(dtBase.day, dt.day);
  Expect.equals(dtBase.hour, dt.hour);
  Expect.equals(dtBase.minute, dt.minute);
  Expect.equals(dtBase.second, dt.second);
  Expect.equals(dtBase.millisecond - 1, dt.millisecond);
  Expect.equals(0, dt.microsecond);

  // Flowing all the way up the chain.
  print("  >>> Flow+ 2");
  dtBase1 = new DateTime(2012, 12, 31, 23, 59, 59, 999, 999);
  dtTick = new DateTime(
      dtBase1.year,
      dtBase1.month,
      dtBase1.day,
      dtBase1.hour,
      dtBase1.minute,
      dtBase1.second,
      dtBase1.millisecond,
      dtBase1.microsecond + 1);
  Expect.equals(dtBase1.year + 1, dtTick.year);
  Expect.equals(1, dtTick.month);
  Expect.equals(1, dtTick.day);
  Expect.equals(0, dtTick.hour);
  Expect.equals(0, dtTick.minute);
  Expect.equals(0, dtTick.second);
  Expect.equals(0, dtTick.millisecond);
  Expect.equals(0, dtTick.microsecond);

  print("  >>> Flow- 2");
  dtBase1 = new DateTime(2012, 1, 1, 0, 0, 0, 0, 0);
  dtTick = new DateTime(
      dtBase1.year,
      dtBase1.month,
      dtBase1.day,
      dtBase1.hour,
      dtBase1.minute,
      dtBase1.second,
      dtBase1.millisecond,
      dtBase1.microsecond - 1);
  Expect.equals(dtBase1.year - 1, dtTick.year);
  Expect.equals(12, dtTick.month);
  Expect.equals(31, dtTick.day);
  Expect.equals(23, dtTick.hour);
  Expect.equals(59, dtTick.minute);
  Expect.equals(59, dtTick.second);
  Expect.equals(999, dtTick.millisecond);
  Expect.equals(999, dtTick.microsecond);
}

void testDateStrings() {
  // TODO(floitsch): Clean up the DateTime API that deals with strings.
  var dt1 = DateTime.parse("2011-05-11 18:58:35Z");
  Expect.equals(1305140315000, dt1.millisecondsSinceEpoch);
  Expect.isTrue(dt1.isUtc);
  dt1 = DateTime.parse("20110511 18:58:35z");
  Expect.equals(1305140315000, dt1.millisecondsSinceEpoch);
  Expect.isTrue(dt1.isUtc);
  dt1 = DateTime.parse("+20110511 18:58:35z");
  Expect.equals(1305140315000, dt1.millisecondsSinceEpoch);
  Expect.isTrue(dt1.isUtc);
  var str = dt1.toString();
  var dt2 = DateTime.parse(str);
  Expect.equals(true, dt1 == dt2);
  var dt3 = dt1.toUtc();
  str = dt3.toString();
  Expect.equals("2011-05-11 18:58:35.000Z", str);
  var dt4 = DateTime.parse("-1234-01-01 00:00:00Z");
  Expect.equals(-1234, dt4.year);
  Expect.equals(1, dt4.month);
  Expect.equals(1, dt4.day);
  Expect.equals(0, dt4.hour);
  Expect.equals(0, dt4.minute);
  Expect.equals(0, dt4.second);
  Expect.equals(0, dt4.millisecond);
  Expect.equals(0, dt4.microsecond);
  Expect.isTrue(dt4.isUtc);
  var dt5 = DateTime.parse("0099-01-02");
  Expect.equals(99, dt5.year);
  Expect.equals(1, dt5.month);
  Expect.equals(2, dt5.day);
  Expect.equals(0, dt5.hour);
  Expect.equals(0, dt5.minute);
  Expect.equals(0, dt5.second);
  Expect.equals(0, dt5.millisecond);
  Expect.equals(0, dt5.microsecond);
  Expect.isFalse(dt5.isUtc);
  var dt6 = DateTime.parse("2012-01-01 00:00:10.012");
  Expect.equals(12, dt6.millisecond);
  Expect.equals(0, dt6.microsecond);
  dt6 = DateTime.parse("2012-01-01 00:00:10.003");
  Expect.equals(3, dt6.millisecond);
  Expect.equals(0, dt6.microsecond);
  dt6 = DateTime.parse("2012-01-01 00:00:10.5");
  Expect.equals(500, dt6.millisecond);
  Expect.equals(0, dt6.microsecond);
  dt6 = DateTime.parse("2012-01-01 00:00:10.003Z");
  Expect.equals(3, dt6.millisecond);
  Expect.equals(0, dt6.microsecond);
  dt6 = DateTime.parse("2012-01-01 00:00:10.5z");
  Expect.equals(500, dt6.millisecond);
  Expect.equals(0, dt6.microsecond);
  var dt7 = DateTime.parse("2011-05-11T18:58:35Z");
  Expect.equals(1305140315000, dt7.millisecondsSinceEpoch);
  var dt8 = DateTime.parse("-1234-01-01T00:00:00Z");
  Expect.equals(-1234, dt8.year);
  Expect.equals(1, dt8.month);
  Expect.equals(1, dt8.day);
  Expect.equals(0, dt8.hour);
  Expect.equals(0, dt8.minute);
  Expect.equals(0, dt8.second);
  Expect.equals(0, dt8.millisecond);
  Expect.equals(0, dt8.microsecond);
  Expect.isTrue(dt8.isUtc);
  var dt9 = DateTime.parse("-1234-01-01T00:00:00");
  Expect.equals(-1234, dt9.year);
  Expect.equals(1, dt9.month);
  Expect.equals(1, dt9.day);
  Expect.equals(0, dt9.hour);
  Expect.equals(0, dt9.minute);
  Expect.equals(0, dt9.second);
  Expect.equals(0, dt9.millisecond);
  Expect.equals(0, dt9.microsecond);
  Expect.isFalse(dt9.isUtc);
  var dt10 = DateTime.parse("-12340101");
  Expect.equals(-1234, dt10.year);
  Expect.equals(1, dt10.month);
  Expect.equals(1, dt10.day);
  Expect.equals(0, dt10.hour);
  Expect.equals(0, dt10.minute);
  Expect.equals(0, dt10.second);
  Expect.equals(0, dt10.millisecond);
  Expect.equals(0, dt10.microsecond);
  Expect.isFalse(dt10.isUtc);
  dt1 = DateTime.parse("2012-02-27 13:27:00");
  Expect.equals(2012, dt1.year);
  Expect.equals(2, dt1.month);
  Expect.equals(27, dt1.day);
  Expect.equals(13, dt1.hour);
  Expect.equals(27, dt1.minute);
  Expect.equals(0, dt1.second);
  Expect.equals(0, dt1.millisecond);
  Expect.equals(0, dt1.microsecond);
  Expect.equals(false, dt1.isUtc);
  dt1 = DateTime.parse("2012-02-27 13:27:00.423z");
  Expect.equals(2012, dt1.year);
  Expect.equals(2, dt1.month);
  Expect.equals(27, dt1.day);
  Expect.equals(13, dt1.hour);
  Expect.equals(27, dt1.minute);
  Expect.equals(0, dt1.second);
  Expect.equals(423, dt1.millisecond);
  Expect.equals(0, dt1.microsecond);
  Expect.equals(true, dt1.isUtc);
  dt1 = DateTime.parse("20120227 13:27:00");
  Expect.equals(2012, dt1.year);
  Expect.equals(2, dt1.month);
  Expect.equals(27, dt1.day);
  Expect.equals(13, dt1.hour);
  Expect.equals(27, dt1.minute);
  Expect.equals(0, dt1.second);
  Expect.equals(0, dt1.millisecond);
  Expect.equals(0, dt1.microsecond);
  Expect.equals(false, dt1.isUtc);
  dt1 = DateTime.parse("20120227T132700");
  Expect.equals(2012, dt1.year);
  Expect.equals(2, dt1.month);
  Expect.equals(27, dt1.day);
  Expect.equals(13, dt1.hour);
  Expect.equals(27, dt1.minute);
  Expect.equals(0, dt1.second);
  Expect.equals(0, dt1.millisecond);
  Expect.equals(0, dt1.microsecond);
  Expect.equals(false, dt1.isUtc);
  dt1 = DateTime.parse("20120227");
  Expect.equals(2012, dt1.year);
  Expect.equals(2, dt1.month);
  Expect.equals(27, dt1.day);
  Expect.equals(0, dt1.hour);
  Expect.equals(0, dt1.minute);
  Expect.equals(0, dt1.second);
  Expect.equals(0, dt1.millisecond);
  Expect.equals(0, dt1.microsecond);
  Expect.equals(false, dt1.isUtc);
  dt1 = DateTime.parse("2012-02-27T14Z");
  Expect.equals(2012, dt1.year);
  Expect.equals(2, dt1.month);
  Expect.equals(27, dt1.day);
  Expect.equals(14, dt1.hour);
  Expect.equals(0, dt1.minute);
  Expect.equals(0, dt1.second);
  Expect.equals(0, dt1.millisecond);
  Expect.equals(0, dt1.microsecond);
  Expect.equals(true, dt1.isUtc);
  dt1 = DateTime.parse("-123450101 00:00:00 Z");
  Expect.equals(-12345, dt1.year);
  Expect.equals(1, dt1.month);
  Expect.equals(1, dt1.day);
  Expect.equals(0, dt1.hour);
  Expect.equals(0, dt1.minute);
  Expect.equals(0, dt1.second);
  Expect.equals(0, dt1.millisecond);
  Expect.equals(0, dt1.microsecond);
  Expect.equals(true, dt1.isUtc);
  dt1 = DateTime.parse("1999-01-02 23:59:59.99951");
  Expect.equals(1999, dt1.year);
  Expect.equals(1, dt1.month);
  Expect.equals(2, dt1.day);
  Expect.equals(23, dt1.hour);
  Expect.equals(59, dt1.minute);
  Expect.equals(59, dt1.second);
  Expect.equals(999, dt1.millisecond);
  Expect.equals(510, dt1.microsecond);
  Expect.equals(false, dt1.isUtc);
  dt1 = DateTime.parse("1999-01-02 23:58:59.99951Z");
  Expect.equals(1999, dt1.year);
  Expect.equals(1, dt1.month);
  Expect.equals(2, dt1.day);
  Expect.equals(23, dt1.hour);
  Expect.equals(58, dt1.minute);
  Expect.equals(59, dt1.second);
  Expect.equals(999, dt1.millisecond);
  Expect.equals(510, dt1.microsecond);
  Expect.equals(true, dt1.isUtc);
  dt1 = DateTime.parse("0009-09-09 09:09:09.009Z");
  Expect.equals(9, dt1.year);
  Expect.equals(9, dt1.month);
  Expect.equals(9, dt1.day);
  Expect.equals(9, dt1.hour);
  Expect.equals(9, dt1.minute);
  Expect.equals(9, dt1.second);
  Expect.equals(9, dt1.millisecond);
  Expect.equals(true, dt1.isUtc);
  dt1 = DateTime.parse("0009-09-09 09:09:09.009-00");
  Expect.equals(9, dt1.year);
  Expect.equals(9, dt1.month);
  Expect.equals(9, dt1.day);
  Expect.equals(9, dt1.hour);
  Expect.equals(9, dt1.minute);
  Expect.equals(9, dt1.second);
  Expect.equals(9, dt1.millisecond);
  Expect.equals(true, dt1.isUtc);
  dt1 = DateTime.parse("0009-09-09 09:09:09.009-0000");
  Expect.equals(9, dt1.year);
  Expect.equals(9, dt1.month);
  Expect.equals(9, dt1.day);
  Expect.equals(9, dt1.hour);
  Expect.equals(9, dt1.minute);
  Expect.equals(9, dt1.second);
  Expect.equals(9, dt1.millisecond);
  Expect.equals(true, dt1.isUtc);
  dt1 = DateTime.parse("0009-09-09 09:09:09.009-02");
  Expect.equals(9, dt1.year);
  Expect.equals(9, dt1.month);
  Expect.equals(9, dt1.day);
  Expect.equals(11, dt1.hour);
  Expect.equals(9, dt1.minute);
  Expect.equals(9, dt1.second);
  Expect.equals(9, dt1.millisecond);
  Expect.equals(true, dt1.isUtc);
  dt1 = DateTime.parse("0009-09-09 09:09:09.009+0200");
  Expect.equals(9, dt1.year);
  Expect.equals(9, dt1.month);
  Expect.equals(9, dt1.day);
  Expect.equals(7, dt1.hour);
  Expect.equals(9, dt1.minute);
  Expect.equals(9, dt1.second);
  Expect.equals(9, dt1.millisecond);
  Expect.equals(true, dt1.isUtc);
  dt1 = DateTime.parse("0009-09-09 09:09:09.009+1200");
  Expect.equals(9, dt1.year);
  Expect.equals(9, dt1.month);
  Expect.equals(8, dt1.day);
  Expect.equals(21, dt1.hour);
  Expect.equals(9, dt1.minute);
  Expect.equals(9, dt1.second);
  Expect.equals(9, dt1.millisecond);
  Expect.equals(true, dt1.isUtc);
  dt1 = DateTime.parse("0009-09-09 09:09:09.009-1200");
  Expect.equals(9, dt1.year);
  Expect.equals(9, dt1.month);
  Expect.equals(9, dt1.day);
  Expect.equals(21, dt1.hour);
  Expect.equals(9, dt1.minute);
  Expect.equals(9, dt1.second);
  Expect.equals(9, dt1.millisecond);
  Expect.equals(true, dt1.isUtc);
  dt1 = DateTime.parse("0009-09-09 09:09:09.009-0230");
  Expect.equals(9, dt1.year);
  Expect.equals(9, dt1.month);
  Expect.equals(9, dt1.day);
  Expect.equals(11, dt1.hour);
  Expect.equals(39, dt1.minute);
  Expect.equals(9, dt1.second);
  Expect.equals(9, dt1.millisecond);
  Expect.equals(true, dt1.isUtc);
  dt1 = DateTime.parse("0009-09-09 09:09:09.009-2134");
  Expect.equals(9, dt1.year);
  Expect.equals(9, dt1.month);
  Expect.equals(10, dt1.day);
  Expect.equals(6, dt1.hour);
  Expect.equals(43, dt1.minute);
  Expect.equals(9, dt1.second);
  Expect.equals(9, dt1.millisecond);
  Expect.equals(true, dt1.isUtc);

  Expect.throwsFormatException(() => DateTime.parse("bad"));
  var bad_year =
      1970 + (_MAX_MILLISECONDS ~/ (1000 * 60 * 60 * 24 * 365.2425)) + 1;
  Expect.throwsFormatException(
      () => DateTime.parse(bad_year.toString() + "-01-01"));
  // The last valid time; should not throw.
  dt1 = DateTime.parse("275760-09-13T00:00:00.000Z");
  Expect.throwsFormatException(
      () => DateTime.parse("275760-09-14T00:00:00.000Z"));
  Expect.throwsFormatException(
      () => DateTime.parse("275760-09-13T00:00:00.001Z"));
  Expect.throwsFormatException(
      () => DateTime.parse("275760-09-13T00:00:00.000001Z"));
  // first valid time; should not throw.
  dt1 = DateTime.parse("-271821-04-20T00:00:00.000Z");
  Expect.throwsFormatException(
      () => DateTime.parse("-271821-04-19T23:59:59.999Z"));

  Expect.throwsFormatException(
      () => DateTime.parse("-271821-04-19T23:59:59.999999Z"));
}

void testWeekday() {
  // 2011-10-06 is Summertime.
  var d = new DateTime(2011, 10, 6, 0, 45, 37, 0);
  Expect.equals(DateTime.thursday, d.weekday);
  d = new DateTime.utc(2011, 10, 6, 0, 45, 37, 0);
  Expect.equals(DateTime.thursday, d.weekday);
  d = new DateTime(2011, 10, 5, 23, 45, 37, 0);
  Expect.equals(DateTime.wednesday, d.weekday);
  d = new DateTime.utc(2011, 10, 5, 23, 45, 37, 0);
  Expect.equals(DateTime.wednesday, d.weekday);
  // 1970-01-01 is Wintertime.
  d = new DateTime(1970, 1, 1, 0, 0, 0, 1);
  Expect.equals(DateTime.thursday, d.weekday);
  d = new DateTime.utc(1970, 1, 1, 0, 0, 0, 1);
  Expect.equals(DateTime.thursday, d.weekday);
  d = new DateTime.utc(1969, 12, 31, 23, 59, 59, 999);
  Expect.equals(DateTime.wednesday, d.weekday);
  d = new DateTime(1969, 12, 31, 23, 59, 59, 999);
  Expect.equals(DateTime.wednesday, d.weekday);
  d = new DateTime(2011, 10, 4, 23, 45, 37, 0);
  Expect.equals(DateTime.tuesday, d.weekday);
  d = new DateTime(2011, 10, 3, 23, 45, 37, 0);
  Expect.equals(DateTime.monday, d.weekday);
  d = new DateTime(2011, 10, 2, 23, 45, 37, 0);
  Expect.equals(DateTime.sunday, d.weekday);
  d = new DateTime(2011, 10, 1, 23, 45, 37, 0);
  Expect.equals(DateTime.saturday, d.weekday);
  d = new DateTime(2011, 9, 30, 23, 45, 37, 0);
  Expect.equals(DateTime.friday, d.weekday);
}

void testToStrings() {
  void test(date, time) {
    {
      // UTC time.
      String source1 = "$date ${time}Z";
      String source2 = "${date}T${time}Z";
      var utcTime1 = DateTime.parse(source1);
      var utcTime2 = DateTime.parse(source2);
      Expect.isTrue(utcTime1.isUtc);
      Expect.equals(utcTime1, utcTime2);
      Expect.equals(source1, utcTime1.toString());
      Expect.equals(source2, utcTime1.toIso8601String());
    }
    {
      // Local time
      String source1 = "$date $time";
      String source2 = "${date}T$time";
      var utcTime1 = DateTime.parse(source1);
      var utcTime2 = DateTime.parse(source2);
      Expect.isFalse(utcTime1.isUtc);
      Expect.equals(utcTime1, utcTime2);
      Expect.equals(source1, utcTime1.toString());
      Expect.equals(source2, utcTime1.toIso8601String());
    }
  }

  test("2000-01-01", "12:00:00.000");
  test("-2000-01-01", "12:00:00.000");
  test("1970-01-01", "00:00:00.000");
  test("1969-12-31", "23:59:59.999");
  test("1969-09-09", "00:09:09.009");
  test("2000-01-01", "12:00:00.000001");
  test("-2000-01-01", "12:00:00.000001");
  test("1970-01-01", "00:00:00.000001");
  test("1969-12-31", "23:59:59.999999");
  test("1969-09-09", "00:09:09.009999");
}

void testIsoString() {
  var d = new DateTime(9999, 1, 1, 23, 59, 59, 999);
  Expect.equals("9999-01-01T23:59:59.999", d.toIso8601String());
  d = new DateTime(-9999, 1, 1, 23, 59, 59, 999);
  Expect.equals("-9999-01-01T23:59:59.999", d.toIso8601String());
  d = new DateTime.utc(9999, 1, 1, 23, 59, 59, 999);
  Expect.equals("9999-01-01T23:59:59.999Z", d.toIso8601String());
  d = new DateTime.utc(-9999, 1, 1, 23, 59, 59, 999);
  Expect.equals("-9999-01-01T23:59:59.999Z", d.toIso8601String());

  d = new DateTime(10000, 1, 1, 23, 59, 59, 999);
  Expect.equals("+010000-01-01T23:59:59.999", d.toIso8601String());
  d = new DateTime(-10000, 1, 1, 23, 59, 59, 999);
  Expect.equals("-010000-01-01T23:59:59.999", d.toIso8601String());
  d = new DateTime.utc(10000, 1, 1, 23, 59, 59, 999);
  Expect.equals("+010000-01-01T23:59:59.999Z", d.toIso8601String());
  d = new DateTime.utc(-10000, 1, 1, 23, 59, 59, 999);
  Expect.equals("-010000-01-01T23:59:59.999Z", d.toIso8601String());

  d = new DateTime(9999, 1, 1, 23, 59, 59, 999, 999);
  Expect.equals("9999-01-01T23:59:59.999999", d.toIso8601String());
  d = new DateTime(-9999, 1, 1, 23, 59, 59, 999, 999);
  Expect.equals("-9999-01-01T23:59:59.999999", d.toIso8601String());
  d = new DateTime.utc(9999, 1, 1, 23, 59, 59, 999, 999);
  Expect.equals("9999-01-01T23:59:59.999999Z", d.toIso8601String());
  d = new DateTime.utc(-9999, 1, 1, 23, 59, 59, 999, 999);
  Expect.equals("-9999-01-01T23:59:59.999999Z", d.toIso8601String());

  d = new DateTime(10000, 1, 1, 23, 59, 59, 999, 999);
  Expect.equals("+010000-01-01T23:59:59.999999", d.toIso8601String());
  d = new DateTime(-10000, 1, 1, 23, 59, 59, 999, 999);
  Expect.equals("-010000-01-01T23:59:59.999999", d.toIso8601String());
  d = new DateTime.utc(10000, 1, 1, 23, 59, 59, 999, 999);
  Expect.equals("+010000-01-01T23:59:59.999999Z", d.toIso8601String());
  d = new DateTime.utc(-10000, 1, 1, 23, 59, 59, 999, 999);
  Expect.equals("-010000-01-01T23:59:59.999999Z", d.toIso8601String());

  d = new DateTime(9999, 1, 1, 23, 49, 59, 989, 979);
  Expect.equals("9999-01-01T23:49:59.989979", d.toIso8601String());
  d = new DateTime(-9999, 1, 1, 23, 49, 59, 989, 979);
  Expect.equals("-9999-01-01T23:49:59.989979", d.toIso8601String());
  d = new DateTime.utc(9999, 1, 1, 23, 49, 59, 989, 979);
  Expect.equals("9999-01-01T23:49:59.989979Z", d.toIso8601String());
  d = new DateTime.utc(-9999, 1, 1, 23, 49, 59, 989, 979);
  Expect.equals("-9999-01-01T23:49:59.989979Z", d.toIso8601String());

  d = new DateTime(10000, 1, 1, 23, 49, 59, 989, 979);
  Expect.equals("+010000-01-01T23:49:59.989979", d.toIso8601String());
  d = new DateTime(-10000, 1, 1, 23, 49, 59, 989, 979);
  Expect.equals("-010000-01-01T23:49:59.989979", d.toIso8601String());
  d = new DateTime.utc(10000, 1, 1, 23, 49, 59, 989, 979);
  Expect.equals("+010000-01-01T23:49:59.989979Z", d.toIso8601String());
  d = new DateTime.utc(-10000, 1, 1, 23, 49, 59, 989, 979);
  Expect.equals("-010000-01-01T23:49:59.989979Z", d.toIso8601String());
}

void testRegression46966() {
  // See http://dartbug.com/46966
  // The constructor allowed numbers larger than 100_000_000 days
  // from epoch, contrary to documentation (and web behavior).

  // Maximally allowed milliseconds on either side of epoch
  // (±100 000 000 days).
  var maxMilliseconds = 100000000 * 24 * 60 * 60 * 1000;
  var maxDate = DateTime.fromMillisecondsSinceEpoch(maxMilliseconds);
  var minDate = DateTime.fromMillisecondsSinceEpoch(-maxMilliseconds);

  // Throws if greater.
  Expect.throws(() => DateTime.fromMillisecondsSinceEpoch(maxMilliseconds + 1));
  Expect.throws(
      () => DateTime.fromMillisecondsSinceEpoch(-maxMilliseconds - 1));

  // But also if much greater.
  // The badMin value overflows 64-bits when multiplied by 1000.
  var badMin = 0x20c49ba5e353f8;
  Expect.throws(() => DateTime.fromMillisecondsSinceEpoch(badMin));
  Expect.throws(() => DateTime.fromMillisecondsSinceEpoch(-badMin));
  Expect.throws(() => DateTime.fromMillisecondsSinceEpoch(badMin + 1));
  Expect.throws(() => DateTime.fromMillisecondsSinceEpoch(-badMin - 1));
  var badMax = double.maxFinite.toInt(); // 2^63-1 on VM, max double on JS.
  Expect.throws(() => DateTime.fromMillisecondsSinceEpoch(badMax));
  Expect.throws(() => DateTime.fromMillisecondsSinceEpoch(-badMax - 1));
}

void main() {
  testNow();
  testTimestamp();
  testMillisecondsSinceEpoch();
  testMicrosecondsSinceEpoch();
  testConstructors();
  testUTCGetters();
  testLocalGetters();
  testChangeTimeZone();
  testSubAdd();
  testUnderflowAndOverflow();
  testDateStrings();
  testEquivalentYears();
  testWeekday();
  testToStrings();
  testIsoString();
  testRegression46966();
}
