/* * Copyright 2001-2015 Stephen Colebourne * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.joda.time; import java.util.Locale; import org.joda.time.chrono.ISOChronology; import junit.framework.TestCase; import junit.framework.TestSuite; /** * This class is a Junit unit test for min/max long values. * * @author Stephen Colebourne */ public class TestMinMaxLong extends TestCase { private static final DateTimeZone LONDON = DateTimeZone.forID("Europe/London"); private static final int ACTUAL_MAX_YEAR = 292278994; private static final int ACTUAL_MIN_YEAR = -292275055; private DateTimeZone zone = null; private Locale locale = null; public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } public static TestSuite suite() { return new TestSuite(TestMinMaxLong.class); } public TestMinMaxLong(String name) { super(name); } protected void setUp() throws Exception { zone = DateTimeZone.getDefault(); locale = Locale.getDefault(); DateTimeZone.setDefault(LONDON); java.util.TimeZone.setDefault(LONDON.toTimeZone()); Locale.setDefault(Locale.UK); } protected void tearDown() throws Exception { DateTimeZone.setDefault(zone); java.util.TimeZone.setDefault(zone.toTimeZone()); Locale.setDefault(locale); zone = null; } //----------------------------------------------------------------------- public void testDateTime_max() throws Throwable { // toString adjusts to UTC rather than overflow DateTime dt = new DateTime(ACTUAL_MAX_YEAR, 8, 17, 7, 12, 55, 807, DateTimeZone.UTC); assertEquals(Long.MAX_VALUE, dt.getMillis()); assertEquals(ISOChronology.getInstanceUTC(), dt.getChronology()); DateTime test = new DateTime(Long.MAX_VALUE); assertEquals(Long.MAX_VALUE, test.getMillis()); assertEquals(ISOChronology.getInstanceUTC(), test.getChronology()); } public void testDateTime_max_math() throws Throwable { DateTime test = new DateTime(Long.MAX_VALUE); // always in UTC assertEquals("292278994-08-17T07:12:55.807Z", test.toString()); assertEquals(new DateTime(Long.MAX_VALUE - 807, DateTimeZone.UTC), test.minus(807)); assertEquals("292278994-08-17T07:12:55.000Z", test.minus(807).toString()); assertEquals(new DateTime(Long.MAX_VALUE - 1000, DateTimeZone.UTC), test.minusSeconds(1)); assertEquals("292278994-08-17T07:12:54.807Z", test.minusSeconds(1).toString()); assertEquals(new DateTime(Long.MAX_VALUE - 60000, DateTimeZone.UTC), test.minusMinutes(1)); assertEquals("292278994-08-17T07:11:55.807Z", test.minusMinutes(1).toString()); assertEquals(new DateTime(Long.MAX_VALUE - 3600000, DateTimeZone.UTC), test.minusHours(1)); assertEquals("292278994-08-17T06:12:55.807Z", test.minusHours(1).toString()); assertEquals(new DateTime(Long.MAX_VALUE - 3600000, DateTimeZone.UTC), test.minusHours(1)); assertEquals("292278994-08-17T06:12:55.808Z", test.minusHours(1).plusMillis(1).toString()); assertEquals(new DateTime(Long.MAX_VALUE - (3600000 - 60000), DateTimeZone.UTC), test.minusMinutes(59)); assertEquals("292278994-08-17T06:13:55.807Z", test.minusMinutes(59).toString()); assertEquals(new DateTime(Long.MAX_VALUE - (3600000 - 60000) + 1, DateTimeZone.UTC), test.minusMinutes(59).plusMillis(1)); assertEquals("292278994-08-17T06:13:55.808Z", test.minusMinutes(59).plusMillis(1).toString()); assertEquals(new DateTime(Long.MAX_VALUE - 3600000, DateTimeZone.UTC), test.minusMinutes(61).plusMinutes(1)); assertEquals("292278994-08-17T06:12:55.807Z", test.minusHours(1).toString()); try { test.plusMillis(1); fail(); } catch (ArithmeticException ex) { // expected } } public void testDateTime_max_fields() { assertEquals(ACTUAL_MAX_YEAR, ISOChronology.getInstanceUTC().year().getMaximumValue() + 1); // ensure time-zone correct in previous year assertEquals("292278992-06-30T00:00:00.000+01:00", new DateTime(292278992, 6, 30, 0, 0).toString()); assertEquals("292278992-12-31T00:00:00.000Z", new DateTime(292278992, 12, 31, 0, 0).toString()); // assertEquals("292278993-06-30T00:00:00.000+01:00", new DateTime(292278993, 6, 30, 0, 0).toString()); assertEquals("292278993-12-31T00:00:00.000Z", new DateTime(292278993, 12, 31, 0, 0).toString()); // permitted DateTime a = new DateTime(ACTUAL_MAX_YEAR, 1, 1, 0, 0, 0, 0); assertEquals("292278994-01-01T00:00:00.000Z", a.toString()); // permitted DateTime b = new DateTime(ACTUAL_MAX_YEAR, 8, 17, 7, 0, 0, 0); assertEquals("292278994-08-17T07:00:00.000+01:00", b.toString()); // permitted DateTime c = new DateTime(ACTUAL_MAX_YEAR, 8, 17, 7, 12, 55, 0); assertEquals("292278994-08-17T07:12:55.000+01:00", c.toString()); // permitted DateTime d = new DateTime(ACTUAL_MAX_YEAR, 8, 17, 7, 12, 55, 806); assertEquals(new DateTime(Long.MAX_VALUE - 1 - 3600000), d); assertEquals("292278994-08-17T07:12:55.806+01:00", d.toString()); // clamp to max DateTime e = new DateTime(ACTUAL_MAX_YEAR, 8, 17, 7, 12, 55, 807); assertEquals(new DateTime(Long.MAX_VALUE), e); assertEquals("292278994-08-17T07:12:55.807Z", e.toString()); // clamp to max DateTime f = new DateTime(ACTUAL_MAX_YEAR, 8, 17, 7, 12, 55, 808); assertEquals(new DateTime(Long.MAX_VALUE), f); assertEquals("292278994-08-17T07:12:55.807Z", f.toString()); // clamp to max DateTime g = new DateTime(ACTUAL_MAX_YEAR, 12, 31, 23, 59, 59, 999); assertEquals(new DateTime(Long.MAX_VALUE), g); assertEquals("292278994-08-17T07:12:55.807Z", g.toString()); } public void testDateTime_max_fieldsUTC() { DateTimeZone.setDefault(DateTimeZone.UTC); assertEquals(ACTUAL_MAX_YEAR, ISOChronology.getInstanceUTC().year().getMaximumValue() + 1); // ensure time-zone correct in previous year assertEquals("292278992-06-30T00:00:00.000Z", new DateTime(292278992, 6, 30, 0, 0).toString()); assertEquals("292278992-12-31T00:00:00.000Z", new DateTime(292278992, 12, 31, 0, 0).toString()); assertEquals("292278993-06-30T00:00:00.000Z", new DateTime(292278993, 6, 30, 0, 0).toString()); assertEquals("292278993-12-31T00:00:00.000Z", new DateTime(292278993, 12, 31, 0, 0).toString()); // permitted DateTime a = new DateTime(ACTUAL_MAX_YEAR, 1, 1, 0, 0, 0, 0); assertEquals("292278994-01-01T00:00:00.000Z", a.toString()); // permitted DateTime b = new DateTime(ACTUAL_MAX_YEAR, 8, 17, 7, 0, 0, 0); assertEquals("292278994-08-17T07:00:00.000Z", b.toString()); // permitted DateTime c = new DateTime(ACTUAL_MAX_YEAR, 8, 17, 7, 12, 55, 0); assertEquals("292278994-08-17T07:12:55.000Z", c.toString()); // permitted DateTime d = new DateTime(ACTUAL_MAX_YEAR, 8, 17, 7, 12, 55, 806); assertEquals(new DateTime(Long.MAX_VALUE - 1), d); assertEquals("292278994-08-17T07:12:55.806Z", d.toString()); // clamp to max DateTime e = new DateTime(ACTUAL_MAX_YEAR, 8, 17, 7, 12, 55, 807); assertEquals(new DateTime(Long.MAX_VALUE), e); assertEquals("292278994-08-17T07:12:55.807Z", e.toString()); // clamp to max DateTime f = new DateTime(ACTUAL_MAX_YEAR, 8, 17, 7, 12, 55, 808); assertEquals(new DateTime(Long.MAX_VALUE), f); assertEquals("292278994-08-17T07:12:55.807Z", f.toString()); // clamp to max DateTime g = new DateTime(ACTUAL_MAX_YEAR, 12, 31, 23, 59, 59, 999); assertEquals(new DateTime(Long.MAX_VALUE), g); assertEquals("292278994-08-17T07:12:55.807Z", g.toString()); } public void testDateTime_max_fieldsNewYork() { DateTimeZone.setDefault(DateTimeZone.forID("America/New_York")); assertEquals(ACTUAL_MAX_YEAR, ISOChronology.getInstanceUTC().year().getMaximumValue() + 1); // ensure time-zone correct in previous year assertEquals("292278992-06-30T00:00:00.000-04:00", new DateTime(292278992, 6, 30, 0, 0).toString()); assertEquals("292278992-12-31T00:00:00.000-05:00", new DateTime(292278992, 12, 31, 0, 0).toString()); // assertEquals("292278993-06-30T00:00:00.000-04:00", new DateTime(292278993, 6, 30, 0, 0).toString()); assertEquals("292278993-12-31T00:00:00.000-05:00", new DateTime(292278993, 12, 31, 0, 0).toString()); // permitted DateTime a = new DateTime(ACTUAL_MAX_YEAR, 1, 1, 0, 0, 0, 0); assertEquals("292278994-01-01T00:00:00.000-05:00", a.toString()); // permitted DateTime b = new DateTime(ACTUAL_MAX_YEAR, 8, 17, 3, 0, 0, 0); assertEquals("292278994-08-17T03:00:00.000-04:00", b.toString()); // permitted DateTime c = new DateTime(ACTUAL_MAX_YEAR, 8, 17, 3, 12, 55, 0); assertEquals("292278994-08-17T03:12:55.000-04:00", c.toString()); // permitted DateTime d = new DateTime(ACTUAL_MAX_YEAR, 8, 17, 3, 12, 55, 806); assertEquals(new DateTime(Long.MAX_VALUE - 1), d); assertEquals("292278994-08-17T03:12:55.806-04:00", d.toString()); // clamp to max DateTime e = new DateTime(ACTUAL_MAX_YEAR, 8, 17, 3, 12, 55, 807); assertEquals(new DateTime(Long.MAX_VALUE), e); assertEquals("292278994-08-17T07:12:55.807Z", e.toString()); // clamp to max DateTime f = new DateTime(ACTUAL_MAX_YEAR, 8, 17, 7, 12, 55, 807); assertEquals(new DateTime(Long.MAX_VALUE), f); assertEquals("292278994-08-17T07:12:55.807Z", f.toString()); // clamp to max DateTime g = new DateTime(ACTUAL_MAX_YEAR, 12, 31, 23, 59, 59, 999); assertEquals(new DateTime(Long.MAX_VALUE), g); assertEquals("292278994-08-17T07:12:55.807Z", g.toString()); } public void testDateTime_max_long() { assertEquals("292278994-08-17T07:12:55.807+01:00", new DateTime(Long.MAX_VALUE - 3600000).toString()); assertEquals("292278994-08-17T06:12:55.808Z", new DateTime(Long.MAX_VALUE - 3599999).toString()); assertEquals("292278994-08-17T07:11:55.807Z", new DateTime(Long.MAX_VALUE - 60000).toString()); assertEquals("292278994-08-17T07:12:55.000Z", new DateTime(Long.MAX_VALUE - 807).toString()); assertEquals("292278994-08-17T07:12:55.806Z", new DateTime(Long.MAX_VALUE - 1).toString()); assertEquals("292278994-08-17T07:12:55.807Z", new DateTime(Long.MAX_VALUE).toString()); } public void testPrintParseMax() { DateTime test1 = new DateTime(Long.MAX_VALUE); assertEquals(test1, DateTime.parse(test1.toString())); DateTime test2 = new DateTime(Long.valueOf(Long.MAX_VALUE)); assertEquals(test2, DateTime.parse(test2.toString())); assertEquals(test2, test1); } //----------------------------------------------------------------------- public void testDateTime_min() throws Throwable { DateTime dt = new DateTime(-292275054, 1, 1, 0, 0); DateTime test = new DateTime(dt.getMillis()); assertEquals(dt, test); assertEquals("-292275054-01-01T00:00:00.000-00:01:15", test.toString()); } public void testDateTime_min_math() throws Throwable { DateTime test = new DateTime(Long.MIN_VALUE); // always in UTC assertEquals("-292275055-05-16T16:47:04.192Z", test.toString()); assertEquals(new DateTime(Long.MIN_VALUE + 808, DateTimeZone.UTC), test.plus(808)); assertEquals("-292275055-05-16T16:47:05.000Z", test.plus(808).toString()); assertEquals(new DateTime(Long.MIN_VALUE + 808, DateTimeZone.UTC), test.plusMillis(808)); assertEquals("-292275055-05-16T16:47:05.000Z", test.plusMillis(808).toString()); assertEquals(new DateTime(Long.MIN_VALUE + 1000, DateTimeZone.UTC), test.plusSeconds(1)); assertEquals("-292275055-05-16T16:47:05.192Z", test.plusSeconds(1).toString()); assertEquals(new DateTime(Long.MIN_VALUE + 60000, DateTimeZone.UTC), test.plusMinutes(1)); assertEquals("-292275055-05-16T16:48:04.192Z", test.plusMinutes(1).toString()); assertEquals(new DateTime(Long.MIN_VALUE + 80000, DateTimeZone.UTC), test.plusSeconds(80)); assertEquals("-292275055-05-16T16:48:24.192Z", test.plusSeconds(80).toString()); try { test.minusMillis(1); fail(); } catch (ArithmeticException ex) { // expected } } public void testDateTime_min_fields() { assertEquals(ACTUAL_MIN_YEAR, ISOChronology.getInstanceUTC().year().getMinimumValue() - 1); // ensure previous year assertEquals("-292275053-01-01T00:00:00.000-00:01:15", new DateTime(-292275053, 1, 1, 0, 0).toString()); assertEquals("-292275054-01-01T00:00:00.000-00:01:15", new DateTime(-292275054, 1, 1, 0, 0).toString()); // permitted DateTime a = new DateTime(ACTUAL_MIN_YEAR, 12, 31, 23, 59, 59, 999); assertEquals("-292275055-12-31T23:59:59.999-00:01:15", a.toString()); // permitted DateTime b = new DateTime(ACTUAL_MIN_YEAR, 5, 17, 0, 0, 0, 0); assertEquals("-292275055-05-17T00:00:00.000-00:01:15", b.toString()); // permitted DateTime c = new DateTime(ACTUAL_MIN_YEAR, 5, 16, 17, 0, 0, 0); assertEquals("-292275055-05-16T17:00:00.000-00:01:15", c.toString()); // permitted DateTime d = new DateTime(ACTUAL_MIN_YEAR, 5, 16, 16, 47, 4, 193); assertEquals("-292275055-05-16T16:47:04.193-00:01:15", d.toString()); // clamp to max DateTime e = new DateTime(ACTUAL_MIN_YEAR, 5, 16, 16, 47, 4, 192); assertEquals(new DateTime(Long.MIN_VALUE), e); assertEquals("-292275055-05-16T16:47:04.192Z", e.toString()); // clamp to max DateTime f = new DateTime(ACTUAL_MIN_YEAR, 5, 16, 16, 47, 4, 191); assertEquals(new DateTime(Long.MIN_VALUE), f); assertEquals("-292275055-05-16T16:47:04.192Z", f.toString()); // clamp to max DateTime g = new DateTime(ACTUAL_MIN_YEAR, 1, 1, 0, 0, 0, 0); assertEquals(new DateTime(Long.MIN_VALUE), g); assertEquals("-292275055-05-16T16:47:04.192Z", g.toString()); } public void testDateTime_min_long() { assertEquals("-292275055-05-16T16:47:04.192-00:01:15", new DateTime(Long.MIN_VALUE + 75000).toString()); assertEquals("-292275055-05-16T16:48:19.191Z", new DateTime(Long.MIN_VALUE + 74999).toString()); assertEquals("-292275055-05-16T16:48:04.192Z", new DateTime(Long.MIN_VALUE + 60000).toString()); assertEquals("-292275055-05-16T16:47:05.192Z", new DateTime(Long.MIN_VALUE + 1000).toString()); assertEquals("-292275055-05-16T16:47:04.193Z", new DateTime(Long.MIN_VALUE + 1).toString()); assertEquals("-292275055-05-16T16:47:04.192Z", new DateTime(Long.MIN_VALUE).toString()); } public void testPrintParseMin() { DateTime test1 = new DateTime(Long.MIN_VALUE); assertEquals(test1, DateTime.parse(test1.toString())); DateTime test2 = new DateTime(Long.valueOf(Long.MIN_VALUE)); assertEquals(test2, DateTime.parse(test2.toString())); assertEquals(test2, test1); } public void testDateTime_aroundZero() { DateTime base = new DateTime(1970, 1, 1, 1, 2, DateTimeZone.UTC); assertEquals(62 * 60000L, base.getMillis()); for (int i = -23; i <= 23; i++) { DateTime dt = new DateTime(1970, 1, 1, 1, 2, DateTimeZone.forOffsetHours(i)); assertEquals(base.getMillis() - i * 3600000L, dt.getMillis()); } } }