| // 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, extreme values. |
| |
| // Identical to _maxMillisecondsSinceEpoch in date_time.dart |
| const int _MAX_MILLISECONDS = 8640000000000000; |
| |
| void testExtremes() { |
| var dt = DateTime.fromMillisecondsSinceEpoch(_MAX_MILLISECONDS, isUtc: true); |
| Expect.equals(275760, dt.year); |
| Expect.equals(9, dt.month); |
| Expect.equals(13, dt.day); |
| Expect.equals(0, dt.hour); |
| Expect.equals(0, dt.minute); |
| Expect.equals(0, dt.second); |
| Expect.equals(0, dt.millisecond); |
| Expect.equals(0, dt.microsecond); |
| dt = DateTime.fromMillisecondsSinceEpoch(-_MAX_MILLISECONDS, isUtc: true); |
| Expect.equals(-271821, dt.year); |
| Expect.equals(4, dt.month); |
| Expect.equals(20, dt.day); |
| Expect.equals(0, dt.hour); |
| Expect.equals(0, dt.minute); |
| Expect.equals(0, dt.second); |
| Expect.equals(0, dt.millisecond); |
| Expect.equals(0, dt.microsecond); |
| // Make sure that we can build the extreme dates in local too. |
| dt = DateTime.fromMillisecondsSinceEpoch(_MAX_MILLISECONDS); |
| dt = DateTime( |
| dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.millisecond); |
| Expect.equals(_MAX_MILLISECONDS, dt.millisecondsSinceEpoch); |
| dt = DateTime.fromMillisecondsSinceEpoch(-_MAX_MILLISECONDS); |
| dt = DateTime( |
| dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.millisecond); |
| Expect.equals(-_MAX_MILLISECONDS, dt.millisecondsSinceEpoch); |
| Expect.throws(() => |
| DateTime.fromMillisecondsSinceEpoch(_MAX_MILLISECONDS + 1, isUtc: true)); |
| Expect.throws(() => |
| DateTime.fromMillisecondsSinceEpoch(-_MAX_MILLISECONDS - 1, isUtc: true)); |
| Expect.throws( |
| () => DateTime.fromMillisecondsSinceEpoch(_MAX_MILLISECONDS + 1)); |
| Expect.throws( |
| () => DateTime.fromMillisecondsSinceEpoch(-_MAX_MILLISECONDS - 1)); |
| dt = DateTime.fromMillisecondsSinceEpoch(_MAX_MILLISECONDS); |
| Expect.throws( |
| () => DateTime(dt.year, dt.month, dt.day, dt.hour, dt.minute, 0, 1)); |
| dt = DateTime.fromMillisecondsSinceEpoch(_MAX_MILLISECONDS, isUtc: true); |
| Expect.throws( |
| () => DateTime.utc(dt.year, dt.month, dt.day, dt.hour, dt.minute, 0, 1)); |
| dt = DateTime.fromMillisecondsSinceEpoch(-_MAX_MILLISECONDS); |
| Expect.throws( |
| () => DateTime(dt.year, dt.month, dt.day, dt.hour, dt.minute, 0, -1)); |
| dt = DateTime.fromMillisecondsSinceEpoch(-_MAX_MILLISECONDS, isUtc: true); |
| Expect.throws( |
| () => DateTime.utc(dt.year, dt.month, dt.day, dt.hour, dt.minute, 0, -1)); |
| |
| /// The nearest value to [base] in the direction [delta]. For native `int`s, |
| /// this is just `base + delta`. For web `int`s outside the safe range, the |
| /// next value might differ by some power of two. |
| int nearest(int base, int delta) { |
| for (int factor = 1;; factor *= 2) { |
| final next = base + delta * factor; |
| print(factor); |
| if (next != base) return next; |
| } |
| } |
| |
| dt = DateTime.fromMicrosecondsSinceEpoch(_MAX_MILLISECONDS * 1000); |
| dt = DateTime(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second); |
| Expect.equals(_MAX_MILLISECONDS * 1000, dt.microsecondsSinceEpoch); |
| print(-_MAX_MILLISECONDS * 1000); |
| dt = DateTime.fromMicrosecondsSinceEpoch(-_MAX_MILLISECONDS * 1000); |
| dt = DateTime(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second); |
| Expect.equals(-_MAX_MILLISECONDS * 1000, dt.microsecondsSinceEpoch); |
| Expect.throws(() => DateTime.fromMicrosecondsSinceEpoch( |
| nearest(_MAX_MILLISECONDS * 1000, 1), |
| isUtc: true)); |
| Expect.throws(() => DateTime.fromMicrosecondsSinceEpoch( |
| nearest(-_MAX_MILLISECONDS * 1000, -1), |
| isUtc: true)); |
| Expect.throws(() => DateTime.fromMicrosecondsSinceEpoch( |
| nearest(_MAX_MILLISECONDS * 1000, 1))); |
| Expect.throws(() => DateTime.fromMicrosecondsSinceEpoch( |
| nearest(-_MAX_MILLISECONDS * 1000, -1))); |
| // These should all succeed - stepping into the valid range rather than out: |
| DateTime.fromMicrosecondsSinceEpoch(nearest(-_MAX_MILLISECONDS * 1000, 1), |
| isUtc: true); |
| DateTime.fromMicrosecondsSinceEpoch(nearest(_MAX_MILLISECONDS * 1000, -1), |
| isUtc: true); |
| DateTime.fromMicrosecondsSinceEpoch(nearest(-_MAX_MILLISECONDS * 1000, 1)); |
| DateTime.fromMicrosecondsSinceEpoch(nearest(_MAX_MILLISECONDS * 1000, -1)); |
| |
| dt = DateTime.fromMillisecondsSinceEpoch(_MAX_MILLISECONDS); |
| Expect.throws( |
| () => DateTime(dt.year, dt.month, dt.day, dt.hour, dt.minute, 0, 0, 1)); |
| Expect.throws(() => dt.copyWith(microsecond: 1)); |
| Expect.isTrue(dt.copyWith(microsecond: -1).toString().endsWith('.999999')); |
| |
| dt = DateTime.fromMillisecondsSinceEpoch(_MAX_MILLISECONDS, isUtc: true); |
| Expect.throws(() => |
| DateTime.utc(dt.year, dt.month, dt.day, dt.hour, dt.minute, 0, 0, 1)); |
| Expect.throws(() => dt.copyWith(microsecond: 1)); |
| Expect.isTrue(dt.copyWith(microsecond: -1).toString().endsWith('.999999Z')); |
| |
| dt = DateTime.fromMillisecondsSinceEpoch(-_MAX_MILLISECONDS); |
| Expect.throws( |
| () => DateTime(dt.year, dt.month, dt.day, dt.hour, dt.minute, 0, 0, -1)); |
| Expect.throws(() => dt.copyWith(microsecond: -1)); |
| Expect.isTrue(dt.copyWith(microsecond: 1).toString().endsWith('.000001')); |
| |
| dt = DateTime.fromMillisecondsSinceEpoch(-_MAX_MILLISECONDS, isUtc: true); |
| Expect.throws(() => |
| DateTime.utc(dt.year, dt.month, dt.day, dt.hour, dt.minute, 0, 0, -1)); |
| Expect.throws(() => dt.copyWith(microsecond: -1)); |
| Expect.isTrue(dt.copyWith(microsecond: 1).toString().endsWith('.000001Z')); |
| |
| // Regression test for https://dartbug.com/55438 |
| dt = DateTime.utc(1969, 12, 31, 23, 59, 59, 999, 999); |
| Expect.equals(-1, dt.microsecondsSinceEpoch); |
| // The first fix confused millisecondsSinceEpoch and microsecondsSinceEpoch. |
| dt = DateTime.utc(1696, 3, 16, 23, 59, 59, 999, 999); |
| Expect.equals(-_MAX_MILLISECONDS - 1, dt.microsecondsSinceEpoch); |
| } |
| |
| void main() { |
| testExtremes(); |
| } |