-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
Copy pathdate_time11_test.dart
144 lines (128 loc) · 5.15 KB
/
date_time11_test.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
// 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();
}