// Copyright (c) 2017, 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";

// Make sure that date-times close to daylight savings work correctly.
// See http://dartbug.com/30550

/// A list of (decomposed) date-times where daylight saving changes
/// happen.
///
/// This list covers multiple timezones to increase test coverage on
/// different machines.
final daylightSavingChanges = [
  // TZ environment, y, m, d, h, change.
  ["Europe/Paris", 2017, 03, 26, 02, 60],
  ["Europe/Paris", 2017, 10, 29, 03, -60],
  ["Antarctica/Troll", 2017, 03, 19, 01, 120],
  ["Antarctica/Troll", 2017, 10, 29, 03, -120],
  ["Australia/Canberra", 2017, 04, 02, 03, -60],
  ["Australia/Canberra", 2017, 10, 01, 02, 60],
  ["Australia/Lord_Howe", 2017, 04, 02, 02, -30],
  ["Australia/Lord_Howe", 2017, 10, 01, 02, 30],
  ["Atlantic/Bermuda", 2017, 03, 12, 02, 60], // US and Canada.
  ["Atlantic/Bermuda", 2017, 11, 05, 02, -60],
  ["America/Campo_Grande", 2017, 02, 19, 00, -60], // Brazil
  ["America/Campo_Grande", 2017, 10, 15, 00, 60],
  ["America/Santiago", 2017, 05, 14, 00, -60],
  ["America/Santiago", 2017, 08, 13, 00, 60],
  ["Chile/EasterIsland", 2017, 05, 13, 22, -60],
  ["Chile/EasterIsland", 2017, 08, 12, 22, 60],
  ["Pacific/Fiji", 2017, 01, 15, 03, -60],
  ["Pacific/Fiji", 2017, 11, 05, 02, 60],
  ["America/Scoresbysund", 2017, 03, 26, 00, 60], // Ittoqqortoormiit.
  ["America/Scoresbysund", 2017, 10, 29, 01, -60],
  ["Asia/Tehran", 2017, 03, 22, 00, 60],
  ["Asia/Tehran", 2017, 09, 22, 00, -60],
  ["Israel", 2017, 03, 24, 02, 60],
  ["Israel", 2017, 10, 29, 02, -60],
  ["Asia/Amman", 2017, 03, 31, 00, 60],
  ["Asia/Amman", 2017, 10, 27, 01, -60],
  ["Mexico/General", 2017, 04, 02, 02, 60],
  ["Mexico/General", 2017, 10, 29, 02, -60],
];

void runTests() {
  // Makes sure we don't go into the wrong direction during a
  // daylight-savings change (as happened in #30550).
  for (var test in daylightSavingChanges) {
    for (int i = 0; i < 2; i++) {
      var year = test[1] as int;
      var month = test[2] as int;
      var day = test[3] as int;
      var hour = test[4] as int;

      var minute = i == 0 ? 0 : test[5] as int;
      // Rather adjust the hours than keeping the minutes.
      hour += minute ~/ 60;
      minute = minute.remainder(60) as int;
      if (hour < 0) {
        hour += 24;
        day--;
      }

      {
        // Check that microseconds are taken into account.
        var dtMillisecond = new DateTime(year, month, day, hour, minute, 0, 1);
        var dtSecond = new DateTime(year, month, day, hour, minute, 1);
        Expect.equals(
          const Duration(milliseconds: 999),
          dtSecond.difference(dtMillisecond),
        );

        dtMillisecond = new DateTime(year, month, day, hour, minute, 0, -1);
        dtSecond = new DateTime(year, month, day, hour, minute, -1);
        Expect.equals(
          const Duration(milliseconds: 999),
          dtMillisecond.difference(dtSecond),
        );
      }

      var dt1 = new DateTime(year, month, day, hour);
      var dt2 = new DateTime(year, month, day, hour, 1);

      // Earlier:
      int earlierDay = day;
      int earlierHour = hour - 1;
      if (earlierHour < 0) {
        earlierHour = 23;
        earlierDay--;
      }
      var dt3 = new DateTime(year, month, earlierDay, earlierHour, 59);

      var diff1 = dt2.difference(dt1).inMinutes;
      var diff2 = dt1.difference(dt3).inMinutes;

      if (diff1 == 1 && diff2 == 1 && dt1.hour == hour && dt1.minute == 0) {
        // Regular date-time.
        continue;
      }

      // At most one is at a distance of more than a minute.
      Expect.isTrue(diff1 == 1 || diff2 == 1);

      if (diff2 < 0) {
        // This happens, when we ask for invalid times.
        // Suppose daylight-saving is at 2:00 and switches to 3:00. If we
        // ask for 2:59, we get 3:59 (59 minutes after 2:00).
        Expect.isFalse(dt3.day == earlierDay && dt3.hour == earlierHour);
        // If that's the case, then removing one minute from dt1 should
        // not yield a date-time with the earlier values, and it should
        // be far away from dt3.
        var dt4 = dt1.add(const Duration(minutes: -1));
        Expect.isFalse(dt4.day == earlierDay && dt4.hour == earlierHour);
        Expect.isTrue(dt4.isBefore(dt1));
        Expect.isTrue(
          dt4.day < earlierDay ||
              (dt4.day == earlierDay && dt4.hour < earlierHour),
        );
        continue;
      }

      // They must be in the right order.
      Expect.isTrue(dt1.isBefore(dt2));
      Expect.isTrue(dt3.isBefore(dt1));
    }
  }
}

void main() {
  // The following code constructs a String with all timezones that are
  // relevant for this test.
  // This can be helpful for running tests in multiple timezones.
  // Typically, one would write something like:
  //    for tz in <contents_of_string>; do TZ=$tz tools/test.py ...; done
  var result = new StringBuffer();
  for (int i = 0; i < daylightSavingChanges.length; i += 2) {
    if (i != 0) result.write(" ");
    result.write(daylightSavingChanges[i][0]);
  }

  runTests();
}
