blob: 329db67eea4eade8f6a0e342edfd85deba0c76d4 [file] [log] [blame]
// 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();
}