// 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();
}
