// Copyright (c) 2003-present, Jodd Team (http://jodd.org) // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. package jodd.datetime; import org.junit.Test; import java.util.Calendar; import java.util.GregorianCalendar; import static org.junit.Assert.*; public class JDateTimeTest { @Test public void testSetGetMillis() { JDateTime jdt = new JDateTime(2003, 2, 28, 23, 59, 59, 0); for (int i = 0; i < 1000; i++) { jdt.setMillisecond(i); assertEquals(i, jdt.getMillisecond()); } } @Test public void testSet999Millis() { JDateTime jdt = new JDateTime(); jdt.set(2003, 2, 28, 23, 59, 59, 999); assertEquals("2003-02-28 23:59:59.999", jdt.toString()); jdt.set(2003, 2, 28, 23, 59, 60, 0); assertEquals("2003-03-01 00:00:00.000", jdt.toString()); // this used to be a problem jdt.set(2003, 2, 28, 23, 59, 59, 999); // 12 fraction digits - last working assertEquals("2003-02-28 23:59:59.999", jdt.toString()); } @Test public void testDaysInMonth() { JDateTime jdt = new JDateTime(2003, 1, 1); assertEquals(31, jdt.getMonthLength()); assertEquals(28, jdt.getMonthLength(2)); jdt = new JDateTime(2000, 1, 1); assertEquals(31, jdt.getMonthLength()); assertEquals(29, jdt.getMonthLength(2)); } @Test public void testToString() { JDateTime jdt = new JDateTime(2003, 1, 1, 1, 1, 1, 1); assertEquals("2003-01-01 01:01:01.001", jdt.toString()); jdt.set(200, 10, 10, 10, 10, 10, 12); assertEquals("0200-10-10 10:10:10.012", jdt.toString()); jdt.set(2003, 10, 10, 10, 10, 10, 123); assertEquals("2003-10-10 10:10:10.123", jdt.toString()); } @Test public void testAddMonths() { GregorianCalendar gc = new GregorianCalendar(2003, 0, 31); gc.add(Calendar.MONTH, 1); assertEquals(1, gc.get(Calendar.MONTH)); assertEquals(28, gc.get(Calendar.DAY_OF_MONTH)); JDateTime gt = new JDateTime(2003, 1, 31); gt.setMonthFix(false); gt.addMonth(1); assertEquals("2003-03-03 00:00:00.000", gt.toString()); gt.setDate(2003, 1, 31); gt.addMonth(1, true); assertEquals("2003-02-28 00:00:00.000", gt.toString()); gt.setDate(2004, 1, 31); gt.addMonth(1); assertEquals("2004-03-02 00:00:00.000", gt.toString()); gt.setDate(2004, 1, 31); gt.addMonth(1, true); assertEquals("2004-02-29 00:00:00.000", gt.toString()); gt.setDate(2003, 1, 25); gt.add(0, 1, 6, true); assertEquals("2003-02-28 00:00:00.000", gt.toString()); gt.setDate(2003, 1, 20); gt.add(0, 10, 11, true); assertEquals("2003-11-30 00:00:00.000", gt.toString()); gt.setDate(2004, 2, 29); gt.addYear(1, true); assertEquals("2005-02-28 00:00:00.000", gt.toString()); gt.setDate(2004, 2, 29); gt.addYear(-1, true); assertEquals("2003-02-28 00:00:00.000", gt.toString()); gt.setDate(2003, 11, 31); // == 2003-12-01 gt.add(0, -8, -31, true); assertEquals("2003-02-28 00:00:00.000", gt.toString()); gt.setDate(2003, 11, 31); gt.add(0, -8, -31, false); assertEquals("2003-03-01 00:00:00.000", gt.toString()); gt.setDate(2004, 5, 31); gt.addMonth(-3, true); assertEquals("2004-02-29 00:00:00.000", gt.toString()); gt.setDate(2003, 11, 31); gt.addMonth(-10, true); assertEquals("2003-02-01 00:00:00.000", gt.toString()); } @Test public void testMiscSetsGets() { JDateTime gt = new JDateTime(2003, 11, 26, 21, 8, 25, 173); gt.setYear(2002); assertEquals(2002, gt.getYear()); gt.setMonth(10); assertEquals(10, gt.getMonth()); gt.setDay(27); assertEquals(27, gt.getDay()); gt.setHour(22); assertEquals(22, gt.getHour()); gt.setMinute(8); assertEquals(8, gt.getMinute()); gt.setSecond(24); assertEquals(24, gt.getSecond()); assertEquals(173, gt.getMillisecond()); gt.setSecond(25, 371); assertEquals(25, gt.getSecond()); assertEquals(371, gt.getMillisecond()); gt.setMillisecond(173); assertEquals(173, gt.getMillisecond()); assertEquals("2002-10-27 22:08:25.173", gt.toString()); } @Test public void testLeapYears() { JDateTime gt = new JDateTime(1984, 2, 29); assertTrue(gt.isLeapYear()); assertEquals("1984-02-29 00:00:00.000", gt.toString()); gt.set(1985, 2, 29); assertFalse(gt.isLeapYear()); assertEquals("1985-03-01 00:00:00.000", gt.toString()); gt.set(2004, 2, 29); assertTrue(gt.isLeapYear()); assertEquals("2004-02-29 00:00:00.000", gt.toString()); gt.set(1900, 2, 29); assertFalse(gt.isLeapYear()); // not a leap year assertEquals("1900-03-01 00:00:00.000", gt.toString()); gt.set(2000, 2, 29); assertTrue(gt.isLeapYear()); // a leap year assertEquals("2000-02-29 00:00:00.000", gt.toString()); gt.set(1600, 2, 29); assertTrue(gt.isLeapYear()); // a leap year assertEquals("1600-02-29 00:00:00.000", gt.toString()); for (int y = -4700; y < 5000; y++) { gt.set(y, 2, 29); assertEquals(31 + 29, gt.getDayOfYear()); if (gt.isLeapYear()) { assertEquals(29, gt.getDay()); } else { assertEquals(1, gt.getDay()); } } } @Test public void testMillis() { GregorianCalendar gc = new GregorianCalendar(); JDateTime jdt = new JDateTime(); long delta = 0; if (jdt.getHour() == 1) { delta = 60 * 60 * 1000; } long now = System.currentTimeMillis() + delta; gc.setTimeInMillis(now); jdt.setTimeInMillis(now); assertEquals(now, jdt.getTimeInMillis()); assertEquals(gc.getTimeInMillis(), jdt.getTimeInMillis()); JDateTime jdt2 = new JDateTime(); jdt2.setTimeInMillis(jdt.getTimeInMillis()); assertEquals(jdt.toString(), jdt2.toString()); assertEquals(gc.getTimeInMillis(), jdt2.getTimeInMillis()); for (int year = 1000; year < 3000; year++) { if (year == 1582) { continue; } jdt.setYear(year); jdt.setMillisecond(0); gc.set(Calendar.YEAR, year); gc.set(Calendar.MILLISECOND, 0); for (int month = 1; month <= 12; month++) { jdt.setMonth(month); gc.set(Calendar.MONTH, month - 1); for (int sec = 0; sec < 60; sec++) { jdt.setSecond(sec); gc.set(Calendar.SECOND, sec); assertEquals(gc.getTimeInMillis(), jdt.getTimeInMillis()); jdt.setTimeInMillis(gc.getTimeInMillis()); gc.setTimeInMillis(gc.getTimeInMillis()); assertEquals(gc.getTimeInMillis(), jdt.getTimeInMillis()); } } } } @Test public void testClone() { JDateTime now = new JDateTime(2009, 5, 1, 23, 45, 1, 0); JulianDateStamp now3 = now.getJulianDate().clone(); JDateTime now2 = now.clone(); assertEquals(now.time, now2.time); assertEquals(now.jdate, now3); assertEquals(now.jdate, now2.jdate); assertEquals(now, now2); } }