From 4859ad52decc4f15e09af87f528a52fa28d5d169 Mon Sep 17 00:00:00 2001 From: Gary Gregory Date: Wed, 24 Feb 2021 10:05:34 -0500 Subject: [PATCH] Sort members. --- .../commons/lang3/time/CalendarUtilsTest.java | 8 +- .../lang3/time/DateFormatUtilsTest.java | 132 +- .../lang3/time/DateUtilsFragmentTest.java | 914 +++++----- .../lang3/time/DateUtilsRoundingTest.java | 1084 +++++------ .../commons/lang3/time/DateUtilsTest.java | 1614 ++++++++--------- .../lang3/time/DurationFormatUtilsTest.java | 904 ++++----- .../lang3/time/FastDateFormatTest.java | 262 +-- .../lang3/time/FastDateParserSDFTest.java | 76 +- .../lang3/time/FastDateParserTest.java | 44 +- .../time/FastDateParser_MoreOrLessTest.java | 60 +- .../FastDateParser_TimeZoneStrategyTest.java | 18 +- .../lang3/time/FastDatePrinterTest.java | 398 ++-- .../commons/lang3/time/FastTimeZoneTest.java | 62 +- .../commons/lang3/time/GmtTimeZoneTest.java | 80 +- .../commons/lang3/time/StopWatchTest.java | 28 +- 15 files changed, 2842 insertions(+), 2842 deletions(-) diff --git a/src/test/java/org/apache/commons/lang3/time/CalendarUtilsTest.java b/src/test/java/org/apache/commons/lang3/time/CalendarUtilsTest.java index 74ac0097f..3ae5a9651 100644 --- a/src/test/java/org/apache/commons/lang3/time/CalendarUtilsTest.java +++ b/src/test/java/org/apache/commons/lang3/time/CalendarUtilsTest.java @@ -26,8 +26,8 @@ public class CalendarUtilsTest { @Test - public void testGetYear() { - assertEquals(Calendar.getInstance().get(Calendar.YEAR), CalendarUtils.INSTANCE.getYear()); + public void testGetDayOfMonth() { + assertEquals(Calendar.getInstance().get(Calendar.DAY_OF_MONTH), CalendarUtils.INSTANCE.getDayOfMonth()); } @Test @@ -36,8 +36,8 @@ public void testGetMonth() { } @Test - public void testGetDayOfMonth() { - assertEquals(Calendar.getInstance().get(Calendar.DAY_OF_MONTH), CalendarUtils.INSTANCE.getDayOfMonth()); + public void testGetYear() { + assertEquals(Calendar.getInstance().get(Calendar.YEAR), CalendarUtils.INSTANCE.getYear()); } } diff --git a/src/test/java/org/apache/commons/lang3/time/DateFormatUtilsTest.java b/src/test/java/org/apache/commons/lang3/time/DateFormatUtilsTest.java index 31679de72..cff1aac5e 100644 --- a/src/test/java/org/apache/commons/lang3/time/DateFormatUtilsTest.java +++ b/src/test/java/org/apache/commons/lang3/time/DateFormatUtilsTest.java @@ -38,6 +38,24 @@ */ @SuppressWarnings("deprecation") // tests lots of deprecated items public class DateFormatUtilsTest { + private void assertFormats(final String expectedValue, final String pattern, final TimeZone timeZone, final Calendar cal) { + assertEquals(expectedValue, DateFormatUtils.format(cal.getTime(), pattern, timeZone)); + assertEquals(expectedValue, DateFormatUtils.format(cal.getTime().getTime(), pattern, timeZone)); + assertEquals(expectedValue, DateFormatUtils.format(cal, pattern, timeZone)); + } + + private Calendar createFebruaryTestDate(final TimeZone timeZone) { + final Calendar cal = Calendar.getInstance(timeZone); + cal.set(2002, Calendar.FEBRUARY, 23, 9, 11, 12); + return cal; + } + + private Calendar createJuneTestDate(final TimeZone timeZone) { + final Calendar cal = Calendar.getInstance(timeZone); + cal.set(2003, Calendar.JUNE, 8, 10, 11, 12); + return cal; + } + //----------------------------------------------------------------------- @Test public void testConstructor() { @@ -49,6 +67,20 @@ public void testConstructor() { assertFalse(Modifier.isFinal(DateFormatUtils.class.getModifiers())); } + @Test + public void testDateISO() { + testGmtMinus3("2002-02-23", DateFormatUtils.ISO_DATE_FORMAT.getPattern()); + testGmtMinus3("2002-02-23-03:00", DateFormatUtils.ISO_DATE_TIME_ZONE_FORMAT.getPattern()); + testUTC("2002-02-23Z", DateFormatUtils.ISO_DATE_TIME_ZONE_FORMAT.getPattern()); + } + + @Test + public void testDateTimeISO() { + testGmtMinus3("2002-02-23T09:11:12", DateFormatUtils.ISO_DATETIME_FORMAT.getPattern()); + testGmtMinus3("2002-02-23T09:11:12-03:00", DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern()); + testUTC("2002-02-23T09:11:12Z", DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern()); + } + //----------------------------------------------------------------------- @Test public void testFormat() { @@ -110,77 +142,11 @@ public void testFormatUTC() { assertEquals ("2005-01-01T12:00:00", DateFormatUtils.formatUTC(c.getTime().getTime(), DateFormatUtils.ISO_DATETIME_FORMAT.getPattern(), Locale.US)); } - private void assertFormats(final String expectedValue, final String pattern, final TimeZone timeZone, final Calendar cal) { - assertEquals(expectedValue, DateFormatUtils.format(cal.getTime(), pattern, timeZone)); - assertEquals(expectedValue, DateFormatUtils.format(cal.getTime().getTime(), pattern, timeZone)); - assertEquals(expectedValue, DateFormatUtils.format(cal, pattern, timeZone)); - } - - private Calendar createFebruaryTestDate(final TimeZone timeZone) { - final Calendar cal = Calendar.getInstance(timeZone); - cal.set(2002, Calendar.FEBRUARY, 23, 9, 11, 12); - return cal; - } - - private Calendar createJuneTestDate(final TimeZone timeZone) { - final Calendar cal = Calendar.getInstance(timeZone); - cal.set(2003, Calendar.JUNE, 8, 10, 11, 12); - return cal; - } - private void testGmtMinus3(final String expectedValue, final String pattern) { final TimeZone timeZone = TimeZone.getTimeZone("GMT-3"); assertFormats(expectedValue, pattern, timeZone, createFebruaryTestDate(timeZone)); } - private void testUTC(final String expectedValue, final String pattern) { - final TimeZone timeZone = FastTimeZone.getGmtTimeZone(); - assertFormats(expectedValue, pattern, timeZone, createFebruaryTestDate(timeZone)); - } - - @Test - public void testDateTimeISO() { - testGmtMinus3("2002-02-23T09:11:12", DateFormatUtils.ISO_DATETIME_FORMAT.getPattern()); - testGmtMinus3("2002-02-23T09:11:12-03:00", DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern()); - testUTC("2002-02-23T09:11:12Z", DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern()); - } - - @Test - public void testDateISO() { - testGmtMinus3("2002-02-23", DateFormatUtils.ISO_DATE_FORMAT.getPattern()); - testGmtMinus3("2002-02-23-03:00", DateFormatUtils.ISO_DATE_TIME_ZONE_FORMAT.getPattern()); - testUTC("2002-02-23Z", DateFormatUtils.ISO_DATE_TIME_ZONE_FORMAT.getPattern()); - } - - @Test - public void testTimeISO() { - testGmtMinus3("T09:11:12", DateFormatUtils.ISO_TIME_FORMAT.getPattern()); - testGmtMinus3("T09:11:12-03:00", DateFormatUtils.ISO_TIME_TIME_ZONE_FORMAT.getPattern()); - testUTC("T09:11:12Z", DateFormatUtils.ISO_TIME_TIME_ZONE_FORMAT.getPattern()); - } - - @Test - public void testTimeNoTISO() { - testGmtMinus3("09:11:12", DateFormatUtils.ISO_TIME_NO_T_FORMAT.getPattern()); - testGmtMinus3("09:11:12-03:00", DateFormatUtils.ISO_TIME_NO_T_TIME_ZONE_FORMAT.getPattern()); - testUTC("09:11:12Z", DateFormatUtils.ISO_TIME_NO_T_TIME_ZONE_FORMAT.getPattern()); - } - - @DefaultLocale(language = "en") - @Test - public void testSMTP() { - TimeZone timeZone = TimeZone.getTimeZone("GMT-3"); - Calendar june = createJuneTestDate(timeZone); - - assertFormats("Sun, 08 Jun 2003 10:11:12 -0300", DateFormatUtils.SMTP_DATETIME_FORMAT.getPattern(), - timeZone, june); - - timeZone = FastTimeZone.getGmtTimeZone(); - june = createJuneTestDate(timeZone); - assertFormats("Sun, 08 Jun 2003 10:11:12 +0000", DateFormatUtils.SMTP_DATETIME_FORMAT.getPattern(), - timeZone, june); - } - @Test public void testLANG1000() throws Exception { final String date = "2013-11-18T12:48:05Z"; @@ -238,4 +204,38 @@ public void testLang916() { assertEquals("2009-10-16T07:42:16+01:00", value, "calendar"); } } + + @DefaultLocale(language = "en") + @Test + public void testSMTP() { + TimeZone timeZone = TimeZone.getTimeZone("GMT-3"); + Calendar june = createJuneTestDate(timeZone); + + assertFormats("Sun, 08 Jun 2003 10:11:12 -0300", DateFormatUtils.SMTP_DATETIME_FORMAT.getPattern(), + timeZone, june); + + timeZone = FastTimeZone.getGmtTimeZone(); + june = createJuneTestDate(timeZone); + assertFormats("Sun, 08 Jun 2003 10:11:12 +0000", DateFormatUtils.SMTP_DATETIME_FORMAT.getPattern(), + timeZone, june); + } + + @Test + public void testTimeISO() { + testGmtMinus3("T09:11:12", DateFormatUtils.ISO_TIME_FORMAT.getPattern()); + testGmtMinus3("T09:11:12-03:00", DateFormatUtils.ISO_TIME_TIME_ZONE_FORMAT.getPattern()); + testUTC("T09:11:12Z", DateFormatUtils.ISO_TIME_TIME_ZONE_FORMAT.getPattern()); + } + + @Test + public void testTimeNoTISO() { + testGmtMinus3("09:11:12", DateFormatUtils.ISO_TIME_NO_T_FORMAT.getPattern()); + testGmtMinus3("09:11:12-03:00", DateFormatUtils.ISO_TIME_NO_T_TIME_ZONE_FORMAT.getPattern()); + testUTC("09:11:12Z", DateFormatUtils.ISO_TIME_NO_T_TIME_ZONE_FORMAT.getPattern()); + } + + private void testUTC(final String expectedValue, final String pattern) { + final TimeZone timeZone = FastTimeZone.getGmtTimeZone(); + assertFormats(expectedValue, pattern, timeZone, createFebruaryTestDate(timeZone)); + } } diff --git a/src/test/java/org/apache/commons/lang3/time/DateUtilsFragmentTest.java b/src/test/java/org/apache/commons/lang3/time/DateUtilsFragmentTest.java index a920455a7..8e2913fde 100644 --- a/src/test/java/org/apache/commons/lang3/time/DateUtilsFragmentTest.java +++ b/src/test/java/org/apache/commons/lang3/time/DateUtilsFragmentTest.java @@ -47,137 +47,8 @@ public void setUp() { } @Test - public void testNullDate() { - assertThrows( - NullPointerException.class, - () -> DateUtils.getFragmentInMilliseconds((Date) null, Calendar.MILLISECOND)); - - assertThrows( - NullPointerException.class, - () -> DateUtils.getFragmentInSeconds((Date) null, Calendar.MILLISECOND)); - - assertThrows( - NullPointerException.class, - () -> DateUtils.getFragmentInMinutes((Date) null, Calendar.MILLISECOND)); - - assertThrows( - NullPointerException.class, - () -> DateUtils.getFragmentInHours((Date) null, Calendar.MILLISECOND)); - - assertThrows( - NullPointerException.class, - () -> DateUtils.getFragmentInDays((Date) null, Calendar.MILLISECOND)); - } - - @Test - public void testNullCalendar() { - assertThrows( - IllegalArgumentException.class, - () -> DateUtils.getFragmentInMilliseconds((Calendar) null, Calendar.MILLISECOND)); - - assertThrows( - IllegalArgumentException.class, - () -> DateUtils.getFragmentInSeconds((Calendar) null, Calendar.MILLISECOND)); - - assertThrows( - IllegalArgumentException.class, - () -> DateUtils.getFragmentInMinutes((Calendar) null, Calendar.MILLISECOND)); - - assertThrows( - IllegalArgumentException.class, - () -> DateUtils.getFragmentInHours((Calendar) null, Calendar.MILLISECOND)); - - assertThrows( - IllegalArgumentException.class, - () -> DateUtils.getFragmentInDays((Calendar) null, Calendar.MILLISECOND)); - } - - @Test - public void testInvalidFragmentWithDate() { - assertThrows(IllegalArgumentException.class, () -> DateUtils.getFragmentInMilliseconds(aDate, 0)); - assertThrows(IllegalArgumentException.class, () -> DateUtils.getFragmentInSeconds(aDate, 0)); - assertThrows(IllegalArgumentException.class, () -> DateUtils.getFragmentInMinutes(aDate, 0)); - assertThrows(IllegalArgumentException.class, () -> DateUtils.getFragmentInHours(aDate, 0)); - assertThrows(IllegalArgumentException.class, () -> DateUtils.getFragmentInDays(aDate, 0)); - } - - @Test - public void testInvalidFragmentWithCalendar() { - assertThrows(IllegalArgumentException.class, () -> DateUtils.getFragmentInMilliseconds(aCalendar, 0)); - assertThrows(IllegalArgumentException.class, () -> DateUtils.getFragmentInSeconds(aCalendar, 0)); - assertThrows(IllegalArgumentException.class, () -> DateUtils.getFragmentInMinutes(aCalendar, 0)); - assertThrows(IllegalArgumentException.class, () -> DateUtils.getFragmentInHours(aCalendar, 0)); - assertThrows(IllegalArgumentException.class, () -> DateUtils.getFragmentInDays(aCalendar, 0)); - } - - @Test - public void testMillisecondFragmentInLargerUnitWithDate() { - assertEquals(0, DateUtils.getFragmentInMilliseconds(aDate, Calendar.MILLISECOND)); - assertEquals(0, DateUtils.getFragmentInSeconds(aDate, Calendar.MILLISECOND)); - assertEquals(0, DateUtils.getFragmentInMinutes(aDate, Calendar.MILLISECOND)); - assertEquals(0, DateUtils.getFragmentInHours(aDate, Calendar.MILLISECOND)); - assertEquals(0, DateUtils.getFragmentInDays(aDate, Calendar.MILLISECOND)); - } - - @Test - public void testMillisecondFragmentInLargerUnitWithCalendar() { - assertEquals(0, DateUtils.getFragmentInMilliseconds(aCalendar, Calendar.MILLISECOND)); - assertEquals(0, DateUtils.getFragmentInSeconds(aCalendar, Calendar.MILLISECOND)); - assertEquals(0, DateUtils.getFragmentInMinutes(aCalendar, Calendar.MILLISECOND)); - assertEquals(0, DateUtils.getFragmentInHours(aCalendar, Calendar.MILLISECOND)); - assertEquals(0, DateUtils.getFragmentInDays(aCalendar, Calendar.MILLISECOND)); - } - - @Test - public void testSecondFragmentInLargerUnitWithDate() { - assertEquals(0, DateUtils.getFragmentInSeconds(aDate, Calendar.SECOND)); - assertEquals(0, DateUtils.getFragmentInMinutes(aDate, Calendar.SECOND)); - assertEquals(0, DateUtils.getFragmentInHours(aDate, Calendar.SECOND)); - assertEquals(0, DateUtils.getFragmentInDays(aDate, Calendar.SECOND)); - } - - @Test - public void testSecondFragmentInLargerUnitWithCalendar() { - assertEquals(0, DateUtils.getFragmentInSeconds(aCalendar, Calendar.SECOND)); - assertEquals(0, DateUtils.getFragmentInMinutes(aCalendar, Calendar.SECOND)); - assertEquals(0, DateUtils.getFragmentInHours(aCalendar, Calendar.SECOND)); - assertEquals(0, DateUtils.getFragmentInDays(aCalendar, Calendar.SECOND)); - } - - @Test - public void testMinuteFragmentInLargerUnitWithDate() { - assertEquals(0, DateUtils.getFragmentInMinutes(aDate, Calendar.MINUTE)); - assertEquals(0, DateUtils.getFragmentInHours(aDate, Calendar.MINUTE)); - assertEquals(0, DateUtils.getFragmentInDays(aDate, Calendar.MINUTE)); - } - - @Test - public void testMinuteFragmentInLargerUnitWithCalendar() { - assertEquals(0, DateUtils.getFragmentInMinutes(aCalendar, Calendar.MINUTE)); - assertEquals(0, DateUtils.getFragmentInHours(aCalendar, Calendar.MINUTE)); - assertEquals(0, DateUtils.getFragmentInDays(aCalendar, Calendar.MINUTE)); - } - - @Test - public void testHourOfDayFragmentInLargerUnitWithDate() { - assertEquals(0, DateUtils.getFragmentInHours(aDate, Calendar.HOUR_OF_DAY)); - assertEquals(0, DateUtils.getFragmentInDays(aDate, Calendar.HOUR_OF_DAY)); - } - - @Test - public void testHourOfDayFragmentInLargerUnitWithCalendar() { - assertEquals(0, DateUtils.getFragmentInHours(aCalendar, Calendar.HOUR_OF_DAY)); - assertEquals(0, DateUtils.getFragmentInDays(aCalendar, Calendar.HOUR_OF_DAY)); - } - - @Test - public void testDayOfYearFragmentInLargerUnitWithDate() { - assertEquals(0, DateUtils.getFragmentInDays(aDate, Calendar.DAY_OF_YEAR)); - } - - @Test - public void testDayOfYearFragmentInLargerUnitWithCalendar() { - assertEquals(0, DateUtils.getFragmentInDays(aCalendar, Calendar.DAY_OF_YEAR)); + public void testDateFragmentInLargerUnitWithCalendar() { + assertEquals(0, DateUtils.getFragmentInDays(aCalendar, Calendar.DATE)); } @Test @@ -186,335 +57,13 @@ public void testDateFragmentInLargerUnitWithDate() { } @Test - public void testDateFragmentInLargerUnitWithCalendar() { - assertEquals(0, DateUtils.getFragmentInDays(aCalendar, Calendar.DATE)); - } - - //Calendar.SECOND as useful fragment - - @Test - public void testMillisecondsOfSecondWithDate() { - final long testResult = DateUtils.getFragmentInMilliseconds(aDate, Calendar.SECOND); - assertEquals(millis, testResult); + public void testDayOfYearFragmentInLargerUnitWithCalendar() { + assertEquals(0, DateUtils.getFragmentInDays(aCalendar, Calendar.DAY_OF_YEAR)); } @Test - public void testMillisecondsOfSecondWithCalendar() { - final long testResult = DateUtils.getFragmentInMilliseconds(aCalendar, Calendar.SECOND); - assertEquals(millis, testResult); - assertEquals(aCalendar.get(Calendar.MILLISECOND), testResult); - } - - //Calendar.MINUTE as useful fragment - - @Test - public void testMillisecondsOfMinuteWithDate() { - final long testResult = DateUtils.getFragmentInMilliseconds(aDate, Calendar.MINUTE); - assertEquals(millis + (seconds * DateUtils.MILLIS_PER_SECOND), testResult); - } - - @Test - public void testMillisecondsOfMinuteWithCalender() { - final long testResult = DateUtils.getFragmentInMilliseconds(aCalendar, Calendar.MINUTE); - assertEquals(millis + (seconds * DateUtils.MILLIS_PER_SECOND), testResult); - } - - @Test - public void testSecondsofMinuteWithDate() { - final long testResult = DateUtils.getFragmentInSeconds(aDate, Calendar.MINUTE); - assertEquals(seconds, testResult); - } - - @Test - public void testSecondsofMinuteWithCalendar() { - final long testResult = DateUtils.getFragmentInSeconds(aCalendar, Calendar.MINUTE); - assertEquals(seconds, testResult); - assertEquals(aCalendar.get(Calendar.SECOND), testResult); - } - - //Calendar.HOUR_OF_DAY as useful fragment - - @Test - public void testMillisecondsOfHourWithDate() { - final long testResult = DateUtils.getFragmentInMilliseconds(aDate, Calendar.HOUR_OF_DAY); - assertEquals(millis + (seconds * DateUtils.MILLIS_PER_SECOND) + (minutes * DateUtils.MILLIS_PER_MINUTE), testResult); - } - - @Test - public void testMillisecondsOfHourWithCalendar() { - final long testResult = DateUtils.getFragmentInMilliseconds(aCalendar, Calendar.HOUR_OF_DAY); - assertEquals(millis + (seconds * DateUtils.MILLIS_PER_SECOND) + (minutes * DateUtils.MILLIS_PER_MINUTE), testResult); - } - - @Test - public void testSecondsofHourWithDate() { - final long testResult = DateUtils.getFragmentInSeconds(aDate, Calendar.HOUR_OF_DAY); - assertEquals( - seconds - + (minutes - * DateUtils.MILLIS_PER_MINUTE / DateUtils.MILLIS_PER_SECOND), - testResult); - } - - @Test - public void testSecondsofHourWithCalendar() { - final long testResult = DateUtils.getFragmentInSeconds(aCalendar, Calendar.HOUR_OF_DAY); - assertEquals( - seconds - + (minutes - * DateUtils.MILLIS_PER_MINUTE / DateUtils.MILLIS_PER_SECOND), - testResult); - } - - @Test - public void testMinutesOfHourWithDate() { - final long testResult = DateUtils.getFragmentInMinutes(aDate, Calendar.HOUR_OF_DAY); - assertEquals(minutes, testResult); - } - - @Test - public void testMinutesOfHourWithCalendar() { - final long testResult = DateUtils.getFragmentInMinutes(aCalendar, Calendar.HOUR_OF_DAY); - assertEquals(minutes, testResult); - } - - //Calendar.DATE and Calendar.DAY_OF_YEAR as useful fragment - @Test - public void testMillisecondsOfDayWithDate() { - long testresult = DateUtils.getFragmentInMilliseconds(aDate, Calendar.DATE); - final long expectedValue = millis + (seconds * DateUtils.MILLIS_PER_SECOND) + (minutes * DateUtils.MILLIS_PER_MINUTE) + (hours * DateUtils.MILLIS_PER_HOUR); - assertEquals(expectedValue, testresult); - testresult = DateUtils.getFragmentInMilliseconds(aDate, Calendar.DAY_OF_YEAR); - assertEquals(expectedValue, testresult); - } - - @Test - public void testMillisecondsOfDayWithCalendar() { - long testresult = DateUtils.getFragmentInMilliseconds(aCalendar, Calendar.DATE); - final long expectedValue = millis + (seconds * DateUtils.MILLIS_PER_SECOND) + (minutes * DateUtils.MILLIS_PER_MINUTE) + (hours * DateUtils.MILLIS_PER_HOUR); - assertEquals(expectedValue, testresult); - testresult = DateUtils.getFragmentInMilliseconds(aCalendar, Calendar.DAY_OF_YEAR); - assertEquals(expectedValue, testresult); - } - - @Test - public void testSecondsOfDayWithDate() { - long testresult = DateUtils.getFragmentInSeconds(aDate, Calendar.DATE); - final long expectedValue = seconds + ((minutes * DateUtils.MILLIS_PER_MINUTE) + (hours * DateUtils.MILLIS_PER_HOUR))/ DateUtils.MILLIS_PER_SECOND; - assertEquals(expectedValue, testresult); - testresult = DateUtils.getFragmentInSeconds(aDate, Calendar.DAY_OF_YEAR); - assertEquals(expectedValue, testresult); - } - - @Test - public void testSecondsOfDayWithCalendar() { - long testresult = DateUtils.getFragmentInSeconds(aCalendar, Calendar.DATE); - final long expectedValue = seconds + ((minutes * DateUtils.MILLIS_PER_MINUTE) + (hours * DateUtils.MILLIS_PER_HOUR))/ DateUtils.MILLIS_PER_SECOND; - assertEquals(expectedValue, testresult); - testresult = DateUtils.getFragmentInSeconds(aCalendar, Calendar.DAY_OF_YEAR); - assertEquals(expectedValue, testresult); - } - - @Test - public void testMinutesOfDayWithDate() { - long testResult = DateUtils.getFragmentInMinutes(aDate, Calendar.DATE); - final long expectedValue = minutes + ((hours * DateUtils.MILLIS_PER_HOUR))/ DateUtils.MILLIS_PER_MINUTE; - assertEquals(expectedValue, testResult); - testResult = DateUtils.getFragmentInMinutes(aDate, Calendar.DAY_OF_YEAR); - assertEquals(expectedValue, testResult); - } - - @Test - public void testMinutesOfDayWithCalendar() { - long testResult = DateUtils.getFragmentInMinutes(aCalendar, Calendar.DATE); - final long expectedValue = minutes + ((hours * DateUtils.MILLIS_PER_HOUR))/ DateUtils.MILLIS_PER_MINUTE; - assertEquals(expectedValue, testResult); - testResult = DateUtils.getFragmentInMinutes(aCalendar, Calendar.DAY_OF_YEAR); - assertEquals(expectedValue, testResult); - } - - @Test - public void testHoursOfDayWithDate() { - long testResult = DateUtils.getFragmentInHours(aDate, Calendar.DATE); - final long expectedValue = hours; - assertEquals(expectedValue, testResult); - testResult = DateUtils.getFragmentInHours(aDate, Calendar.DAY_OF_YEAR); - assertEquals(expectedValue, testResult); - } - - @Test - public void testHoursOfDayWithCalendar() { - long testResult = DateUtils.getFragmentInHours(aCalendar, Calendar.DATE); - final long expectedValue = hours; - assertEquals(expectedValue, testResult); - testResult = DateUtils.getFragmentInHours(aCalendar, Calendar.DAY_OF_YEAR); - assertEquals(expectedValue, testResult); - } - - - //Calendar.MONTH as useful fragment - @Test - public void testMillisecondsOfMonthWithDate() { - final long testResult = DateUtils.getFragmentInMilliseconds(aDate, Calendar.MONTH); - assertEquals(millis + (seconds * DateUtils.MILLIS_PER_SECOND) + (minutes * DateUtils.MILLIS_PER_MINUTE) - + (hours * DateUtils.MILLIS_PER_HOUR) + ((days - 1) * DateUtils.MILLIS_PER_DAY), - testResult); - } - - @Test - public void testMillisecondsOfMonthWithCalendar() { - final long testResult = DateUtils.getFragmentInMilliseconds(aCalendar, Calendar.MONTH); - assertEquals(millis + (seconds * DateUtils.MILLIS_PER_SECOND) + (minutes * DateUtils.MILLIS_PER_MINUTE) - + (hours * DateUtils.MILLIS_PER_HOUR) + ((days - 1) * DateUtils.MILLIS_PER_DAY), -testResult); - } - - @Test - public void testSecondsOfMonthWithDate() { - final long testResult = DateUtils.getFragmentInSeconds(aDate, Calendar.MONTH); - assertEquals( - seconds - + ((minutes * DateUtils.MILLIS_PER_MINUTE) - + (hours * DateUtils.MILLIS_PER_HOUR) + ((days - 1) * DateUtils.MILLIS_PER_DAY)) - / DateUtils.MILLIS_PER_SECOND, - testResult); - } - - @Test - public void testSecondsOfMonthWithCalendar() { - final long testResult = DateUtils.getFragmentInSeconds(aCalendar, Calendar.MONTH); - assertEquals( - seconds - + ((minutes * DateUtils.MILLIS_PER_MINUTE) - + (hours * DateUtils.MILLIS_PER_HOUR) + ((days - 1) * DateUtils.MILLIS_PER_DAY)) - / DateUtils.MILLIS_PER_SECOND, - testResult); - } - - @Test - public void testMinutesOfMonthWithDate() { - final long testResult = DateUtils.getFragmentInMinutes(aDate, Calendar.MONTH); - assertEquals(minutes - + ((hours * DateUtils.MILLIS_PER_HOUR) + ((days - 1) * DateUtils.MILLIS_PER_DAY)) - / DateUtils.MILLIS_PER_MINUTE, - testResult); - } - - @Test - public void testMinutesOfMonthWithCalendar() { - final long testResult = DateUtils.getFragmentInMinutes(aCalendar, Calendar.MONTH); - assertEquals( minutes +((hours * DateUtils.MILLIS_PER_HOUR) + ((days - 1) * DateUtils.MILLIS_PER_DAY)) - / DateUtils.MILLIS_PER_MINUTE, - testResult); - } - - @Test - public void testHoursOfMonthWithDate() { - final long testResult = DateUtils.getFragmentInHours(aDate, Calendar.MONTH); - assertEquals(hours + (((days - 1) * DateUtils.MILLIS_PER_DAY)) - / DateUtils.MILLIS_PER_HOUR, - testResult); - } - - @Test - public void testHoursOfMonthWithCalendar() { - final long testResult = DateUtils.getFragmentInHours(aCalendar, Calendar.MONTH); - assertEquals( hours +(((days - 1) * DateUtils.MILLIS_PER_DAY)) - / DateUtils.MILLIS_PER_HOUR, - testResult); - } - - //Calendar.YEAR as useful fragment - @Test - public void testMillisecondsOfYearWithDate() { - final long testResult = DateUtils.getFragmentInMilliseconds(aDate, Calendar.YEAR); - final Calendar cal = Calendar.getInstance(); - cal.setTime(aDate); - assertEquals(millis + (seconds * DateUtils.MILLIS_PER_SECOND) + (minutes * DateUtils.MILLIS_PER_MINUTE) - + (hours * DateUtils.MILLIS_PER_HOUR) + ((cal.get(Calendar.DAY_OF_YEAR) - 1)* DateUtils.MILLIS_PER_DAY), - testResult); - } - - @Test - public void testMillisecondsOfYearWithCalendar() { - final long testResult = DateUtils.getFragmentInMilliseconds(aCalendar, Calendar.YEAR); - assertEquals(millis + (seconds * DateUtils.MILLIS_PER_SECOND) + (minutes * DateUtils.MILLIS_PER_MINUTE) - + (hours * DateUtils.MILLIS_PER_HOUR) + ((aCalendar.get(Calendar.DAY_OF_YEAR) - 1) * DateUtils.MILLIS_PER_DAY), -testResult); - } - - @Test - public void testSecondsOfYearWithDate() { - final long testResult = DateUtils.getFragmentInSeconds(aDate, Calendar.YEAR); - final Calendar cal = Calendar.getInstance(); - cal.setTime(aDate); - assertEquals( - seconds - + ((minutes * DateUtils.MILLIS_PER_MINUTE) - + (hours * DateUtils.MILLIS_PER_HOUR) + ((cal.get(Calendar.DAY_OF_YEAR) - 1) * DateUtils.MILLIS_PER_DAY)) - / DateUtils.MILLIS_PER_SECOND, - testResult); - } - - @Test - public void testSecondsOfYearWithCalendar() { - final long testResult = DateUtils.getFragmentInSeconds(aCalendar, Calendar.YEAR); - assertEquals( - seconds - + ((minutes * DateUtils.MILLIS_PER_MINUTE) - + (hours * DateUtils.MILLIS_PER_HOUR) + ((aCalendar.get(Calendar.DAY_OF_YEAR) - 1) * DateUtils.MILLIS_PER_DAY)) - / DateUtils.MILLIS_PER_SECOND, - testResult); - } - - @Test - public void testMinutesOfYearWithDate() { - final long testResult = DateUtils.getFragmentInMinutes(aDate, Calendar.YEAR); - final Calendar cal = Calendar.getInstance(); - cal.setTime(aDate); - assertEquals(minutes - + ((hours * DateUtils.MILLIS_PER_HOUR) + ((cal.get(Calendar.DAY_OF_YEAR) - 1) * DateUtils.MILLIS_PER_DAY)) - / DateUtils.MILLIS_PER_MINUTE, - testResult); - } - - @Test - public void testMinutesOfYearWithCalendar() { - final long testResult = DateUtils.getFragmentInMinutes(aCalendar, Calendar.YEAR); - assertEquals( minutes +((hours * DateUtils.MILLIS_PER_HOUR) + ((aCalendar.get(Calendar.DAY_OF_YEAR) - 1) * DateUtils.MILLIS_PER_DAY)) - / DateUtils.MILLIS_PER_MINUTE, - testResult); - } - - @Test - public void testMinutesOfYearWithWrongOffsetBugWithCalendar() { - final Calendar c = Calendar.getInstance(); - c.set(Calendar.MONTH, Calendar.JANUARY); - c.set(Calendar.DAY_OF_YEAR, 1); - c.set(Calendar.HOUR_OF_DAY, 0); - c.set(Calendar.MINUTE, 0); - c.set(Calendar.SECOND, 0); - c.set(Calendar.MILLISECOND, 0); - final long testResult = DateUtils.getFragmentInMinutes(c, Calendar.YEAR); - assertEquals( 0, testResult); - } - - @Test - public void testHoursOfYearWithDate() { - final long testResult = DateUtils.getFragmentInHours(aDate, Calendar.YEAR); - final Calendar cal = Calendar.getInstance(); - cal.setTime(aDate); - assertEquals(hours + (((cal.get(Calendar.DAY_OF_YEAR) - 1) * DateUtils.MILLIS_PER_DAY)) - / DateUtils.MILLIS_PER_HOUR, - testResult); - } - - @Test - public void testHoursOfYearWithCalendar() { - final long testResult = DateUtils.getFragmentInHours(aCalendar, Calendar.YEAR); - assertEquals( hours +(((aCalendar.get(Calendar.DAY_OF_YEAR) - 1) * DateUtils.MILLIS_PER_DAY)) - / DateUtils.MILLIS_PER_HOUR, - testResult); + public void testDayOfYearFragmentInLargerUnitWithDate() { + assertEquals(0, DateUtils.getFragmentInDays(aDate, Calendar.DAY_OF_YEAR)); } @Test @@ -544,4 +93,455 @@ public void testDaysOfYearWithDate() { cal.setTime(aDate); assertEquals(cal.get(Calendar.DAY_OF_YEAR), testResult); } + + @Test + public void testHourOfDayFragmentInLargerUnitWithCalendar() { + assertEquals(0, DateUtils.getFragmentInHours(aCalendar, Calendar.HOUR_OF_DAY)); + assertEquals(0, DateUtils.getFragmentInDays(aCalendar, Calendar.HOUR_OF_DAY)); + } + + @Test + public void testHourOfDayFragmentInLargerUnitWithDate() { + assertEquals(0, DateUtils.getFragmentInHours(aDate, Calendar.HOUR_OF_DAY)); + assertEquals(0, DateUtils.getFragmentInDays(aDate, Calendar.HOUR_OF_DAY)); + } + + @Test + public void testHoursOfDayWithCalendar() { + long testResult = DateUtils.getFragmentInHours(aCalendar, Calendar.DATE); + final long expectedValue = hours; + assertEquals(expectedValue, testResult); + testResult = DateUtils.getFragmentInHours(aCalendar, Calendar.DAY_OF_YEAR); + assertEquals(expectedValue, testResult); + } + + @Test + public void testHoursOfDayWithDate() { + long testResult = DateUtils.getFragmentInHours(aDate, Calendar.DATE); + final long expectedValue = hours; + assertEquals(expectedValue, testResult); + testResult = DateUtils.getFragmentInHours(aDate, Calendar.DAY_OF_YEAR); + assertEquals(expectedValue, testResult); + } + + @Test + public void testHoursOfMonthWithCalendar() { + final long testResult = DateUtils.getFragmentInHours(aCalendar, Calendar.MONTH); + assertEquals( hours +(((days - 1) * DateUtils.MILLIS_PER_DAY)) + / DateUtils.MILLIS_PER_HOUR, + testResult); + } + + @Test + public void testHoursOfMonthWithDate() { + final long testResult = DateUtils.getFragmentInHours(aDate, Calendar.MONTH); + assertEquals(hours + (((days - 1) * DateUtils.MILLIS_PER_DAY)) + / DateUtils.MILLIS_PER_HOUR, + testResult); + } + + @Test + public void testHoursOfYearWithCalendar() { + final long testResult = DateUtils.getFragmentInHours(aCalendar, Calendar.YEAR); + assertEquals( hours +(((aCalendar.get(Calendar.DAY_OF_YEAR) - 1) * DateUtils.MILLIS_PER_DAY)) + / DateUtils.MILLIS_PER_HOUR, + testResult); + } + + @Test + public void testHoursOfYearWithDate() { + final long testResult = DateUtils.getFragmentInHours(aDate, Calendar.YEAR); + final Calendar cal = Calendar.getInstance(); + cal.setTime(aDate); + assertEquals(hours + (((cal.get(Calendar.DAY_OF_YEAR) - 1) * DateUtils.MILLIS_PER_DAY)) + / DateUtils.MILLIS_PER_HOUR, + testResult); + } + + //Calendar.SECOND as useful fragment + + @Test + public void testInvalidFragmentWithCalendar() { + assertThrows(IllegalArgumentException.class, () -> DateUtils.getFragmentInMilliseconds(aCalendar, 0)); + assertThrows(IllegalArgumentException.class, () -> DateUtils.getFragmentInSeconds(aCalendar, 0)); + assertThrows(IllegalArgumentException.class, () -> DateUtils.getFragmentInMinutes(aCalendar, 0)); + assertThrows(IllegalArgumentException.class, () -> DateUtils.getFragmentInHours(aCalendar, 0)); + assertThrows(IllegalArgumentException.class, () -> DateUtils.getFragmentInDays(aCalendar, 0)); + } + + @Test + public void testInvalidFragmentWithDate() { + assertThrows(IllegalArgumentException.class, () -> DateUtils.getFragmentInMilliseconds(aDate, 0)); + assertThrows(IllegalArgumentException.class, () -> DateUtils.getFragmentInSeconds(aDate, 0)); + assertThrows(IllegalArgumentException.class, () -> DateUtils.getFragmentInMinutes(aDate, 0)); + assertThrows(IllegalArgumentException.class, () -> DateUtils.getFragmentInHours(aDate, 0)); + assertThrows(IllegalArgumentException.class, () -> DateUtils.getFragmentInDays(aDate, 0)); + } + + //Calendar.MINUTE as useful fragment + + @Test + public void testMillisecondFragmentInLargerUnitWithCalendar() { + assertEquals(0, DateUtils.getFragmentInMilliseconds(aCalendar, Calendar.MILLISECOND)); + assertEquals(0, DateUtils.getFragmentInSeconds(aCalendar, Calendar.MILLISECOND)); + assertEquals(0, DateUtils.getFragmentInMinutes(aCalendar, Calendar.MILLISECOND)); + assertEquals(0, DateUtils.getFragmentInHours(aCalendar, Calendar.MILLISECOND)); + assertEquals(0, DateUtils.getFragmentInDays(aCalendar, Calendar.MILLISECOND)); + } + + @Test + public void testMillisecondFragmentInLargerUnitWithDate() { + assertEquals(0, DateUtils.getFragmentInMilliseconds(aDate, Calendar.MILLISECOND)); + assertEquals(0, DateUtils.getFragmentInSeconds(aDate, Calendar.MILLISECOND)); + assertEquals(0, DateUtils.getFragmentInMinutes(aDate, Calendar.MILLISECOND)); + assertEquals(0, DateUtils.getFragmentInHours(aDate, Calendar.MILLISECOND)); + assertEquals(0, DateUtils.getFragmentInDays(aDate, Calendar.MILLISECOND)); + } + + @Test + public void testMillisecondsOfDayWithCalendar() { + long testresult = DateUtils.getFragmentInMilliseconds(aCalendar, Calendar.DATE); + final long expectedValue = millis + (seconds * DateUtils.MILLIS_PER_SECOND) + (minutes * DateUtils.MILLIS_PER_MINUTE) + (hours * DateUtils.MILLIS_PER_HOUR); + assertEquals(expectedValue, testresult); + testresult = DateUtils.getFragmentInMilliseconds(aCalendar, Calendar.DAY_OF_YEAR); + assertEquals(expectedValue, testresult); + } + + //Calendar.DATE and Calendar.DAY_OF_YEAR as useful fragment + @Test + public void testMillisecondsOfDayWithDate() { + long testresult = DateUtils.getFragmentInMilliseconds(aDate, Calendar.DATE); + final long expectedValue = millis + (seconds * DateUtils.MILLIS_PER_SECOND) + (minutes * DateUtils.MILLIS_PER_MINUTE) + (hours * DateUtils.MILLIS_PER_HOUR); + assertEquals(expectedValue, testresult); + testresult = DateUtils.getFragmentInMilliseconds(aDate, Calendar.DAY_OF_YEAR); + assertEquals(expectedValue, testresult); + } + + //Calendar.HOUR_OF_DAY as useful fragment + + @Test + public void testMillisecondsOfHourWithCalendar() { + final long testResult = DateUtils.getFragmentInMilliseconds(aCalendar, Calendar.HOUR_OF_DAY); + assertEquals(millis + (seconds * DateUtils.MILLIS_PER_SECOND) + (minutes * DateUtils.MILLIS_PER_MINUTE), testResult); + } + + @Test + public void testMillisecondsOfHourWithDate() { + final long testResult = DateUtils.getFragmentInMilliseconds(aDate, Calendar.HOUR_OF_DAY); + assertEquals(millis + (seconds * DateUtils.MILLIS_PER_SECOND) + (minutes * DateUtils.MILLIS_PER_MINUTE), testResult); + } + + @Test + public void testMillisecondsOfMinuteWithCalender() { + final long testResult = DateUtils.getFragmentInMilliseconds(aCalendar, Calendar.MINUTE); + assertEquals(millis + (seconds * DateUtils.MILLIS_PER_SECOND), testResult); + } + + @Test + public void testMillisecondsOfMinuteWithDate() { + final long testResult = DateUtils.getFragmentInMilliseconds(aDate, Calendar.MINUTE); + assertEquals(millis + (seconds * DateUtils.MILLIS_PER_SECOND), testResult); + } + + @Test + public void testMillisecondsOfMonthWithCalendar() { + final long testResult = DateUtils.getFragmentInMilliseconds(aCalendar, Calendar.MONTH); + assertEquals(millis + (seconds * DateUtils.MILLIS_PER_SECOND) + (minutes * DateUtils.MILLIS_PER_MINUTE) + + (hours * DateUtils.MILLIS_PER_HOUR) + ((days - 1) * DateUtils.MILLIS_PER_DAY), +testResult); + } + + //Calendar.MONTH as useful fragment + @Test + public void testMillisecondsOfMonthWithDate() { + final long testResult = DateUtils.getFragmentInMilliseconds(aDate, Calendar.MONTH); + assertEquals(millis + (seconds * DateUtils.MILLIS_PER_SECOND) + (minutes * DateUtils.MILLIS_PER_MINUTE) + + (hours * DateUtils.MILLIS_PER_HOUR) + ((days - 1) * DateUtils.MILLIS_PER_DAY), + testResult); + } + + @Test + public void testMillisecondsOfSecondWithCalendar() { + final long testResult = DateUtils.getFragmentInMilliseconds(aCalendar, Calendar.SECOND); + assertEquals(millis, testResult); + assertEquals(aCalendar.get(Calendar.MILLISECOND), testResult); + } + + @Test + public void testMillisecondsOfSecondWithDate() { + final long testResult = DateUtils.getFragmentInMilliseconds(aDate, Calendar.SECOND); + assertEquals(millis, testResult); + } + + @Test + public void testMillisecondsOfYearWithCalendar() { + final long testResult = DateUtils.getFragmentInMilliseconds(aCalendar, Calendar.YEAR); + assertEquals(millis + (seconds * DateUtils.MILLIS_PER_SECOND) + (minutes * DateUtils.MILLIS_PER_MINUTE) + + (hours * DateUtils.MILLIS_PER_HOUR) + ((aCalendar.get(Calendar.DAY_OF_YEAR) - 1) * DateUtils.MILLIS_PER_DAY), +testResult); + } + + //Calendar.YEAR as useful fragment + @Test + public void testMillisecondsOfYearWithDate() { + final long testResult = DateUtils.getFragmentInMilliseconds(aDate, Calendar.YEAR); + final Calendar cal = Calendar.getInstance(); + cal.setTime(aDate); + assertEquals(millis + (seconds * DateUtils.MILLIS_PER_SECOND) + (minutes * DateUtils.MILLIS_PER_MINUTE) + + (hours * DateUtils.MILLIS_PER_HOUR) + ((cal.get(Calendar.DAY_OF_YEAR) - 1)* DateUtils.MILLIS_PER_DAY), + testResult); + } + + @Test + public void testMinuteFragmentInLargerUnitWithCalendar() { + assertEquals(0, DateUtils.getFragmentInMinutes(aCalendar, Calendar.MINUTE)); + assertEquals(0, DateUtils.getFragmentInHours(aCalendar, Calendar.MINUTE)); + assertEquals(0, DateUtils.getFragmentInDays(aCalendar, Calendar.MINUTE)); + } + + @Test + public void testMinuteFragmentInLargerUnitWithDate() { + assertEquals(0, DateUtils.getFragmentInMinutes(aDate, Calendar.MINUTE)); + assertEquals(0, DateUtils.getFragmentInHours(aDate, Calendar.MINUTE)); + assertEquals(0, DateUtils.getFragmentInDays(aDate, Calendar.MINUTE)); + } + + @Test + public void testMinutesOfDayWithCalendar() { + long testResult = DateUtils.getFragmentInMinutes(aCalendar, Calendar.DATE); + final long expectedValue = minutes + ((hours * DateUtils.MILLIS_PER_HOUR))/ DateUtils.MILLIS_PER_MINUTE; + assertEquals(expectedValue, testResult); + testResult = DateUtils.getFragmentInMinutes(aCalendar, Calendar.DAY_OF_YEAR); + assertEquals(expectedValue, testResult); + } + + @Test + public void testMinutesOfDayWithDate() { + long testResult = DateUtils.getFragmentInMinutes(aDate, Calendar.DATE); + final long expectedValue = minutes + ((hours * DateUtils.MILLIS_PER_HOUR))/ DateUtils.MILLIS_PER_MINUTE; + assertEquals(expectedValue, testResult); + testResult = DateUtils.getFragmentInMinutes(aDate, Calendar.DAY_OF_YEAR); + assertEquals(expectedValue, testResult); + } + + + @Test + public void testMinutesOfHourWithCalendar() { + final long testResult = DateUtils.getFragmentInMinutes(aCalendar, Calendar.HOUR_OF_DAY); + assertEquals(minutes, testResult); + } + + @Test + public void testMinutesOfHourWithDate() { + final long testResult = DateUtils.getFragmentInMinutes(aDate, Calendar.HOUR_OF_DAY); + assertEquals(minutes, testResult); + } + + @Test + public void testMinutesOfMonthWithCalendar() { + final long testResult = DateUtils.getFragmentInMinutes(aCalendar, Calendar.MONTH); + assertEquals( minutes +((hours * DateUtils.MILLIS_PER_HOUR) + ((days - 1) * DateUtils.MILLIS_PER_DAY)) + / DateUtils.MILLIS_PER_MINUTE, + testResult); + } + + @Test + public void testMinutesOfMonthWithDate() { + final long testResult = DateUtils.getFragmentInMinutes(aDate, Calendar.MONTH); + assertEquals(minutes + + ((hours * DateUtils.MILLIS_PER_HOUR) + ((days - 1) * DateUtils.MILLIS_PER_DAY)) + / DateUtils.MILLIS_PER_MINUTE, + testResult); + } + + @Test + public void testMinutesOfYearWithCalendar() { + final long testResult = DateUtils.getFragmentInMinutes(aCalendar, Calendar.YEAR); + assertEquals( minutes +((hours * DateUtils.MILLIS_PER_HOUR) + ((aCalendar.get(Calendar.DAY_OF_YEAR) - 1) * DateUtils.MILLIS_PER_DAY)) + / DateUtils.MILLIS_PER_MINUTE, + testResult); + } + + @Test + public void testMinutesOfYearWithDate() { + final long testResult = DateUtils.getFragmentInMinutes(aDate, Calendar.YEAR); + final Calendar cal = Calendar.getInstance(); + cal.setTime(aDate); + assertEquals(minutes + + ((hours * DateUtils.MILLIS_PER_HOUR) + ((cal.get(Calendar.DAY_OF_YEAR) - 1) * DateUtils.MILLIS_PER_DAY)) + / DateUtils.MILLIS_PER_MINUTE, + testResult); + } + + @Test + public void testMinutesOfYearWithWrongOffsetBugWithCalendar() { + final Calendar c = Calendar.getInstance(); + c.set(Calendar.MONTH, Calendar.JANUARY); + c.set(Calendar.DAY_OF_YEAR, 1); + c.set(Calendar.HOUR_OF_DAY, 0); + c.set(Calendar.MINUTE, 0); + c.set(Calendar.SECOND, 0); + c.set(Calendar.MILLISECOND, 0); + final long testResult = DateUtils.getFragmentInMinutes(c, Calendar.YEAR); + assertEquals( 0, testResult); + } + + @Test + public void testNullCalendar() { + assertThrows( + IllegalArgumentException.class, + () -> DateUtils.getFragmentInMilliseconds((Calendar) null, Calendar.MILLISECOND)); + + assertThrows( + IllegalArgumentException.class, + () -> DateUtils.getFragmentInSeconds((Calendar) null, Calendar.MILLISECOND)); + + assertThrows( + IllegalArgumentException.class, + () -> DateUtils.getFragmentInMinutes((Calendar) null, Calendar.MILLISECOND)); + + assertThrows( + IllegalArgumentException.class, + () -> DateUtils.getFragmentInHours((Calendar) null, Calendar.MILLISECOND)); + + assertThrows( + IllegalArgumentException.class, + () -> DateUtils.getFragmentInDays((Calendar) null, Calendar.MILLISECOND)); + } + + @Test + public void testNullDate() { + assertThrows( + NullPointerException.class, + () -> DateUtils.getFragmentInMilliseconds((Date) null, Calendar.MILLISECOND)); + + assertThrows( + NullPointerException.class, + () -> DateUtils.getFragmentInSeconds((Date) null, Calendar.MILLISECOND)); + + assertThrows( + NullPointerException.class, + () -> DateUtils.getFragmentInMinutes((Date) null, Calendar.MILLISECOND)); + + assertThrows( + NullPointerException.class, + () -> DateUtils.getFragmentInHours((Date) null, Calendar.MILLISECOND)); + + assertThrows( + NullPointerException.class, + () -> DateUtils.getFragmentInDays((Date) null, Calendar.MILLISECOND)); + } + + @Test + public void testSecondFragmentInLargerUnitWithCalendar() { + assertEquals(0, DateUtils.getFragmentInSeconds(aCalendar, Calendar.SECOND)); + assertEquals(0, DateUtils.getFragmentInMinutes(aCalendar, Calendar.SECOND)); + assertEquals(0, DateUtils.getFragmentInHours(aCalendar, Calendar.SECOND)); + assertEquals(0, DateUtils.getFragmentInDays(aCalendar, Calendar.SECOND)); + } + + @Test + public void testSecondFragmentInLargerUnitWithDate() { + assertEquals(0, DateUtils.getFragmentInSeconds(aDate, Calendar.SECOND)); + assertEquals(0, DateUtils.getFragmentInMinutes(aDate, Calendar.SECOND)); + assertEquals(0, DateUtils.getFragmentInHours(aDate, Calendar.SECOND)); + assertEquals(0, DateUtils.getFragmentInDays(aDate, Calendar.SECOND)); + } + + @Test + public void testSecondsOfDayWithCalendar() { + long testresult = DateUtils.getFragmentInSeconds(aCalendar, Calendar.DATE); + final long expectedValue = seconds + ((minutes * DateUtils.MILLIS_PER_MINUTE) + (hours * DateUtils.MILLIS_PER_HOUR))/ DateUtils.MILLIS_PER_SECOND; + assertEquals(expectedValue, testresult); + testresult = DateUtils.getFragmentInSeconds(aCalendar, Calendar.DAY_OF_YEAR); + assertEquals(expectedValue, testresult); + } + + @Test + public void testSecondsOfDayWithDate() { + long testresult = DateUtils.getFragmentInSeconds(aDate, Calendar.DATE); + final long expectedValue = seconds + ((minutes * DateUtils.MILLIS_PER_MINUTE) + (hours * DateUtils.MILLIS_PER_HOUR))/ DateUtils.MILLIS_PER_SECOND; + assertEquals(expectedValue, testresult); + testresult = DateUtils.getFragmentInSeconds(aDate, Calendar.DAY_OF_YEAR); + assertEquals(expectedValue, testresult); + } + + @Test + public void testSecondsofHourWithCalendar() { + final long testResult = DateUtils.getFragmentInSeconds(aCalendar, Calendar.HOUR_OF_DAY); + assertEquals( + seconds + + (minutes + * DateUtils.MILLIS_PER_MINUTE / DateUtils.MILLIS_PER_SECOND), + testResult); + } + + @Test + public void testSecondsofHourWithDate() { + final long testResult = DateUtils.getFragmentInSeconds(aDate, Calendar.HOUR_OF_DAY); + assertEquals( + seconds + + (minutes + * DateUtils.MILLIS_PER_MINUTE / DateUtils.MILLIS_PER_SECOND), + testResult); + } + + @Test + public void testSecondsofMinuteWithCalendar() { + final long testResult = DateUtils.getFragmentInSeconds(aCalendar, Calendar.MINUTE); + assertEquals(seconds, testResult); + assertEquals(aCalendar.get(Calendar.SECOND), testResult); + } + + @Test + public void testSecondsofMinuteWithDate() { + final long testResult = DateUtils.getFragmentInSeconds(aDate, Calendar.MINUTE); + assertEquals(seconds, testResult); + } + + @Test + public void testSecondsOfMonthWithCalendar() { + final long testResult = DateUtils.getFragmentInSeconds(aCalendar, Calendar.MONTH); + assertEquals( + seconds + + ((minutes * DateUtils.MILLIS_PER_MINUTE) + + (hours * DateUtils.MILLIS_PER_HOUR) + ((days - 1) * DateUtils.MILLIS_PER_DAY)) + / DateUtils.MILLIS_PER_SECOND, + testResult); + } + + @Test + public void testSecondsOfMonthWithDate() { + final long testResult = DateUtils.getFragmentInSeconds(aDate, Calendar.MONTH); + assertEquals( + seconds + + ((minutes * DateUtils.MILLIS_PER_MINUTE) + + (hours * DateUtils.MILLIS_PER_HOUR) + ((days - 1) * DateUtils.MILLIS_PER_DAY)) + / DateUtils.MILLIS_PER_SECOND, + testResult); + } + + @Test + public void testSecondsOfYearWithCalendar() { + final long testResult = DateUtils.getFragmentInSeconds(aCalendar, Calendar.YEAR); + assertEquals( + seconds + + ((minutes * DateUtils.MILLIS_PER_MINUTE) + + (hours * DateUtils.MILLIS_PER_HOUR) + ((aCalendar.get(Calendar.DAY_OF_YEAR) - 1) * DateUtils.MILLIS_PER_DAY)) + / DateUtils.MILLIS_PER_SECOND, + testResult); + } + + @Test + public void testSecondsOfYearWithDate() { + final long testResult = DateUtils.getFragmentInSeconds(aDate, Calendar.YEAR); + final Calendar cal = Calendar.getInstance(); + cal.setTime(aDate); + assertEquals( + seconds + + ((minutes * DateUtils.MILLIS_PER_MINUTE) + + (hours * DateUtils.MILLIS_PER_HOUR) + ((cal.get(Calendar.DAY_OF_YEAR) - 1) * DateUtils.MILLIS_PER_DAY)) + / DateUtils.MILLIS_PER_SECOND, + testResult); + } } diff --git a/src/test/java/org/apache/commons/lang3/time/DateUtilsRoundingTest.java b/src/test/java/org/apache/commons/lang3/time/DateUtilsRoundingTest.java index a13b161a2..e12d58d48 100644 --- a/src/test/java/org/apache/commons/lang3/time/DateUtilsRoundingTest.java +++ b/src/test/java/org/apache/commons/lang3/time/DateUtilsRoundingTest.java @@ -58,548 +58,6 @@ public class DateUtilsRoundingTest { FastDateFormat fdf = DateFormatUtils.ISO_DATETIME_FORMAT; - @BeforeEach - public void setUp() throws Exception { - - dateTimeParser = new SimpleDateFormat("MMM dd, yyyy H:mm:ss.SSS", Locale.ENGLISH); - - targetYearDate = dateTimeParser.parse("January 1, 2007 0:00:00.000"); - targetDateDate = targetDayOfMonthDate = dateTimeParser.parse("June 1, 2008 0:00:00.000"); - targetAmDate = dateTimeParser.parse("June 1, 2008 0:00:00.000"); - targetPmDate = dateTimeParser.parse("June 1, 2008 12:00:00.000"); - targetHourDate = dateTimeParser.parse("June 1, 2008 8:00:00.000"); - targetHourOfDayDate = dateTimeParser.parse("June 1, 2008 8:00:00.000"); - targetMinuteDate = dateTimeParser.parse("June 1, 2008 8:15:00.000"); - targetSecondDate = dateTimeParser.parse("June 1, 2008 8:15:14.000"); - targetMilliSecondDate = dateTimeParser.parse("June 1, 2008 8:15:14.231"); - - januaryOneDate = dateTimeParser.parse("January 1, 2008 0:00:00.000"); - januaryOneCalendar = Calendar.getInstance(); - januaryOneCalendar.setTime(januaryOneDate); - } - - /** - * Tests DateUtils.round()-method with Calendar.Year - * - * @throws Exception so we don't have to catch it - * @since 3.0 - */ - @Test - public void testRoundYear() throws Exception { - final int calendarField = Calendar.YEAR; - final Date roundedUpDate = dateTimeParser.parse("January 1, 2008 0:00:00.000"); - final Date roundedDownDate = targetYearDate; - final Date lastRoundedDownDate = dateTimeParser.parse("June 30, 2007 23:59:59.999"); - baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); - } - - /** - * Tests DateUtils.round()-method with Calendar.MONTH - * Includes rounding months with 28, 29, 30 and 31 days - * Includes rounding to January 1 - * - * @throws Exception so we don't have to catch it - * @since 3.0 - */ - @Test - public void testRoundMonth() throws Exception { - final int calendarField = Calendar.MONTH; - Date roundedUpDate, roundedDownDate, lastRoundedDownDate; - Date minDate, maxDate; - - //month with 28 days - roundedUpDate = dateTimeParser.parse("March 1, 2007 0:00:00.000"); - roundedDownDate = dateTimeParser.parse("February 1, 2007 0:00:00.000"); - lastRoundedDownDate = dateTimeParser.parse("February 14, 2007 23:59:59.999"); - baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); - - //month with 29 days - roundedUpDate = dateTimeParser.parse("March 1, 2008 0:00:00.000"); - roundedDownDate = dateTimeParser.parse("February 1, 2008 0:00:00.000"); - lastRoundedDownDate = dateTimeParser.parse("February 15, 2008 23:59:59.999"); - baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); - - //month with 30 days - roundedUpDate = dateTimeParser.parse("May 1, 2008 0:00:00.000"); - roundedDownDate = dateTimeParser.parse("April 1, 2008 0:00:00.000"); - lastRoundedDownDate = dateTimeParser.parse("April 15, 2008 23:59:59.999"); - baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); - - //month with 31 days - roundedUpDate = dateTimeParser.parse("June 1, 2008 0:00:00.000"); - roundedDownDate = dateTimeParser.parse("May 1, 2008 0:00:00.000"); - lastRoundedDownDate = dateTimeParser.parse("May 16, 2008 23:59:59.999"); - baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); - - //round to January 1 - minDate = dateTimeParser.parse("December 17, 2007 00:00:00.000"); - maxDate = dateTimeParser.parse("January 16, 2008 23:59:59.999"); - roundToJanuaryFirst(minDate, maxDate, calendarField); - } - - /** - * Tests DateUtils.round()-method with DateUtils.SEMI_MONTH - * Includes rounding months with 28, 29, 30 and 31 days, each with first and second half - * Includes rounding to January 1 - * - * @throws Exception so we don't have to catch it - * @since 3.0 - */ - @Test - public void testRoundSemiMonth() throws Exception { - final int calendarField = DateUtils.SEMI_MONTH; - Date roundedUpDate, roundedDownDate, lastRoundedDownDate; - Date minDate, maxDate; - - //month with 28 days (1) - roundedUpDate = dateTimeParser.parse("February 16, 2007 0:00:00.000"); - roundedDownDate = dateTimeParser.parse("February 1, 2007 0:00:00.000"); - lastRoundedDownDate = dateTimeParser.parse("February 8, 2007 23:59:59.999"); - baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); - - //month with 28 days (2) - roundedUpDate = dateTimeParser.parse("March 1, 2007 0:00:00.000"); - roundedDownDate = dateTimeParser.parse("February 16, 2007 0:00:00.000"); - lastRoundedDownDate = dateTimeParser.parse("February 23, 2007 23:59:59.999"); - baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); - - //month with 29 days (1) - roundedUpDate = dateTimeParser.parse("February 16, 2008 0:00:00.000"); - roundedDownDate = dateTimeParser.parse("February 1, 2008 0:00:00.000"); - lastRoundedDownDate = dateTimeParser.parse("February 8, 2008 23:59:59.999"); - baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); - - //month with 29 days (2) - roundedUpDate = dateTimeParser.parse("March 1, 2008 0:00:00.000"); - roundedDownDate = dateTimeParser.parse("February 16, 2008 0:00:00.000"); - lastRoundedDownDate = dateTimeParser.parse("February 23, 2008 23:59:59.999"); - baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); - - //month with 30 days (1) - roundedUpDate = dateTimeParser.parse("April 16, 2008 0:00:00.000"); - roundedDownDate = dateTimeParser.parse("April 1, 2008 0:00:00.000"); - lastRoundedDownDate = dateTimeParser.parse("April 8, 2008 23:59:59.999"); - baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); - - //month with 30 days (2) - roundedUpDate = dateTimeParser.parse("May 1, 2008 0:00:00.000"); - roundedDownDate = dateTimeParser.parse("April 16, 2008 0:00:00.000"); - lastRoundedDownDate = dateTimeParser.parse("April 23, 2008 23:59:59.999"); - baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); - - //month with 31 days (1) - roundedUpDate = dateTimeParser.parse("May 16, 2008 0:00:00.000"); - roundedDownDate = dateTimeParser.parse("May 1, 2008 0:00:00.000"); - lastRoundedDownDate = dateTimeParser.parse("May 8, 2008 23:59:59.999"); - baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); - - //month with 31 days (2) - roundedUpDate = dateTimeParser.parse("June 1, 2008 0:00:00.000"); - roundedDownDate = dateTimeParser.parse("May 16, 2008 0:00:00.000"); - lastRoundedDownDate = dateTimeParser.parse("May 23, 2008 23:59:59.999"); - baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); - - //round to January 1 - minDate = dateTimeParser.parse("December 24, 2007 00:00:00.000"); - maxDate = dateTimeParser.parse("January 8, 2008 23:59:59.999"); - roundToJanuaryFirst(minDate, maxDate, calendarField); - } - - /** - * Tests DateUtils.round()-method with Calendar.DATE - * Includes rounding the extremes of one day - * Includes rounding to January 1 - * - * @throws Exception so we don't have to catch it - * @since 3.0 - */ - @Test - public void testRoundDate() throws Exception { - final int calendarField = Calendar.DATE; - Date roundedUpDate, roundedDownDate, lastRoundedDownDate; - Date minDate, maxDate; - - roundedUpDate = dateTimeParser.parse("June 2, 2008 0:00:00.000"); - roundedDownDate = targetDateDate; - lastRoundedDownDate = dateTimeParser.parse("June 1, 2008 11:59:59.999"); - baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); - - //round to January 1 - minDate = dateTimeParser.parse("December 31, 2007 12:00:00.000"); - maxDate = dateTimeParser.parse("January 1, 2008 11:59:59.999"); - roundToJanuaryFirst(minDate, maxDate, calendarField); - } - - /** - * Tests DateUtils.round()-method with Calendar.DAY_OF_MONTH - * Includes rounding the extremes of one day - * Includes rounding to January 1 - * - * @throws Exception so we don't have to catch it - * @since 3.0 - */ - @Test - public void testRoundDayOfMonth() throws Exception { - final int calendarField = Calendar.DAY_OF_MONTH; - Date roundedUpDate, roundedDownDate, lastRoundedDownDate; - Date minDate, maxDate; - - roundedUpDate = dateTimeParser.parse("June 2, 2008 0:00:00.000"); - roundedDownDate = targetDayOfMonthDate; - lastRoundedDownDate = dateTimeParser.parse("June 1, 2008 11:59:59.999"); - baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); - - //round to January 1 - minDate = dateTimeParser.parse("December 31, 2007 12:00:00.000"); - maxDate = dateTimeParser.parse("January 1, 2008 11:59:59.999"); - roundToJanuaryFirst(minDate, maxDate, calendarField); - } - - /** - * Tests DateUtils.round()-method with Calendar.AM_PM - * Includes rounding the extremes of both AM and PM of one day - * Includes rounding to January 1 - * - * @throws Exception so we don't have to catch it - * @since 3.0 - */ - @Test - public void testRoundAmPm() throws Exception { - final int calendarField = Calendar.AM_PM; - Date roundedUpDate, roundedDownDate, lastRoundedDownDate; - Date minDate, maxDate; - - //AM - roundedUpDate = dateTimeParser.parse("June 1, 2008 12:00:00.000"); - roundedDownDate = targetAmDate; - lastRoundedDownDate = dateTimeParser.parse("June 1, 2008 5:59:59.999"); - baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); - - //PM - roundedUpDate = dateTimeParser.parse("June 2, 2008 0:00:00.000"); - roundedDownDate = targetPmDate; - lastRoundedDownDate = dateTimeParser.parse("June 1, 2008 17:59:59.999"); - baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); - - //round to January 1 - minDate = dateTimeParser.parse("December 31, 2007 18:00:00.000"); - maxDate = dateTimeParser.parse("January 1, 2008 5:59:59.999"); - roundToJanuaryFirst(minDate, maxDate, calendarField); - } - - /** - * Tests DateUtils.round()-method with Calendar.HOUR_OF_DAY - * Includes rounding the extremes of one hour - * Includes rounding to January 1 - * - * @throws Exception so we don't have to catch it - * @since 3.0 - */ - @Test - public void testRoundHourOfDay() throws Exception { - final int calendarField = Calendar.HOUR_OF_DAY; - Date roundedUpDate, roundedDownDate, lastRoundedDownDate; - Date minDate, maxDate; - - roundedUpDate = dateTimeParser.parse("June 1, 2008 9:00:00.000"); - roundedDownDate = targetHourOfDayDate; - lastRoundedDownDate = dateTimeParser.parse("June 1, 2008 8:29:59.999"); - baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); - - //round to January 1 - minDate = dateTimeParser.parse("December 31, 2007 23:30:00.000"); - maxDate = dateTimeParser.parse("January 1, 2008 0:29:59.999"); - roundToJanuaryFirst(minDate, maxDate, calendarField); - } - - /** - * Tests DateUtils.round()-method with Calendar.HOUR - * Includes rounding the extremes of one hour - * Includes rounding to January 1 - * - * @throws Exception so we don't have to catch it - * @since 3.0 - */ - @Test - public void testRoundHour() throws Exception { - final int calendarField = Calendar.HOUR; - Date roundedUpDate, roundedDownDate, lastRoundedDownDate; - Date minDate, maxDate; - - roundedUpDate = dateTimeParser.parse("June 1, 2008 9:00:00.000"); - roundedDownDate = targetHourDate; - lastRoundedDownDate = dateTimeParser.parse("June 1, 2008 8:29:59.999"); - baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); - - //round to January 1 - minDate = dateTimeParser.parse("December 31, 2007 23:30:00.000"); - maxDate = dateTimeParser.parse("January 1, 2008 0:29:59.999"); - roundToJanuaryFirst(minDate, maxDate, calendarField); - } - - /** - * Tests DateUtils.round()-method with Calendar.MINUTE - * Includes rounding the extremes of one minute - * Includes rounding to January 1 - * - * @throws Exception so we don't have to catch it - * @since 3.0 - */ - @Test - public void testRoundMinute() throws Exception { - final int calendarField = Calendar.MINUTE; - Date roundedUpDate, roundedDownDate, lastRoundedDownDate; - Date minDate, maxDate; - - roundedUpDate = dateTimeParser.parse("June 1, 2008 8:16:00.000"); - roundedDownDate = targetMinuteDate; - lastRoundedDownDate = dateTimeParser.parse("June 1, 2008 8:15:29.999"); - baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); - - //round to January 1 - minDate = dateTimeParser.parse("December 31, 2007 23:59:30.000"); - maxDate = dateTimeParser.parse("January 1, 2008 0:00:29.999"); - roundToJanuaryFirst(minDate, maxDate, calendarField); - } - - /** - * Tests DateUtils.round()-method with Calendar.SECOND - * Includes rounding the extremes of one second - * Includes rounding to January 1 - * - * @throws Exception so we don't have to catch it - * @since 3.0 - */ - @Test - public void testRoundSecond() throws Exception { - final int calendarField = Calendar.SECOND; - Date roundedUpDate, roundedDownDate, lastRoundedDownDate; - Date minDate, maxDate; - - roundedUpDate = dateTimeParser.parse("June 1, 2008 8:15:15.000"); - roundedDownDate = targetSecondDate; - lastRoundedDownDate = dateTimeParser.parse("June 1, 2008 8:15:14.499"); - baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); - - //round to January 1 - minDate = dateTimeParser.parse("December 31, 2007 23:59:59.500"); - maxDate = dateTimeParser.parse("January 1, 2008 0:00:00.499"); - roundToJanuaryFirst(minDate, maxDate, calendarField); - } - - /** - * Tests DateUtils.round()-method with Calendar.MILLISECOND - * Includes rounding the extremes of one second - * Includes rounding to January 1 - * - * @throws Exception so we don't have to catch it - * @since 3.0 - */ - @Test - public void testRoundMilliSecond() throws Exception { - final int calendarField = Calendar.MILLISECOND; - Date roundedUpDate, roundedDownDate, lastRoundedDownDate; - Date minDate, maxDate; - - roundedDownDate = lastRoundedDownDate = targetMilliSecondDate; - roundedUpDate = dateTimeParser.parse("June 1, 2008 8:15:14.232"); - baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); - - //round to January 1 - minDate = maxDate = januaryOneDate; - roundToJanuaryFirst(minDate, maxDate, calendarField); - } - - /** - * Test DateUtils.truncate()-method with Calendar.YEAR - * - * @throws Exception so we don't have to catch it - * @since 3.0 - */ - @Test - public void testTruncateYear() throws Exception { - final int calendarField = Calendar.YEAR; - final Date lastTruncateDate = dateTimeParser.parse("December 31, 2007 23:59:59.999"); - baseTruncateTest(targetYearDate, lastTruncateDate, calendarField); - } - - /** - * Test DateUtils.truncate()-method with Calendar.MONTH - * - * @throws Exception so we don't have to catch it - * @since 3.0 - */ - @Test - public void testTruncateMonth() throws Exception { - final int calendarField = Calendar.MONTH; - final Date truncatedDate = dateTimeParser.parse("March 1, 2008 0:00:00.000"); - final Date lastTruncateDate = dateTimeParser.parse("March 31, 2008 23:59:59.999"); - baseTruncateTest(truncatedDate, lastTruncateDate, calendarField); - } - - /** - * Test DateUtils.truncate()-method with DateUtils.SEMI_MONTH - * Includes truncating months with 28, 29, 30 and 31 days, each with first and second half - * - * @throws Exception so we don't have to catch it - * @since 3.0 - */ - @Test - public void testTruncateSemiMonth() throws Exception { - final int calendarField = DateUtils.SEMI_MONTH; - Date truncatedDate, lastTruncateDate; - - //month with 28 days (1) - truncatedDate = dateTimeParser.parse("February 1, 2007 0:00:00.000"); - lastTruncateDate = dateTimeParser.parse("February 15, 2007 23:59:59.999"); - baseTruncateTest(truncatedDate, lastTruncateDate, calendarField); - - //month with 28 days (2) - truncatedDate = dateTimeParser.parse("February 16, 2007 0:00:00.000"); - lastTruncateDate = dateTimeParser.parse("February 28, 2007 23:59:59.999"); - baseTruncateTest(truncatedDate, lastTruncateDate, calendarField); - - //month with 29 days (1) - truncatedDate = dateTimeParser.parse("February 1, 2008 0:00:00.000"); - lastTruncateDate = dateTimeParser.parse("February 15, 2008 23:59:59.999"); - baseTruncateTest(truncatedDate, lastTruncateDate, calendarField); - - //month with 29 days (2) - truncatedDate = dateTimeParser.parse("February 16, 2008 0:00:00.000"); - lastTruncateDate = dateTimeParser.parse("February 29, 2008 23:59:59.999"); - baseTruncateTest(truncatedDate, lastTruncateDate, calendarField); - - //month with 30 days (1) - truncatedDate = dateTimeParser.parse("April 1, 2008 0:00:00.000"); - lastTruncateDate = dateTimeParser.parse("April 15, 2008 23:59:59.999"); - baseTruncateTest(truncatedDate, lastTruncateDate, calendarField); - - //month with 30 days (2) - truncatedDate = dateTimeParser.parse("April 16, 2008 0:00:00.000"); - lastTruncateDate = dateTimeParser.parse("April 30, 2008 23:59:59.999"); - baseTruncateTest(truncatedDate, lastTruncateDate, calendarField); - - //month with 31 days (1) - truncatedDate = dateTimeParser.parse("March 1, 2008 0:00:00.000"); - lastTruncateDate = dateTimeParser.parse("March 15, 2008 23:59:59.999"); - baseTruncateTest(truncatedDate, lastTruncateDate, calendarField); - - //month with 31 days (2) - truncatedDate = dateTimeParser.parse("March 16, 2008 0:00:00.000"); - lastTruncateDate = dateTimeParser.parse("March 31, 2008 23:59:59.999"); - baseTruncateTest(truncatedDate, lastTruncateDate, calendarField); - - } - - /** - * Test DateUtils.truncate()-method with Calendar.DATE - * - * @throws Exception so we don't have to catch it - * @since 3.0 - */ - @Test - public void testTruncateDate() throws Exception { - final int calendarField = Calendar.DATE; - final Date lastTruncateDate = dateTimeParser.parse("June 1, 2008 23:59:59.999"); - baseTruncateTest(targetDateDate, lastTruncateDate, calendarField); - } - - /** - * Test DateUtils.truncate()-method with Calendar.DAY_OF_MONTH - * - * @throws Exception so we don't have to catch it - * @since 3.0 - */ - @Test - public void testTruncateDayOfMonth() throws Exception { - final int calendarField = Calendar.DAY_OF_MONTH; - final Date lastTruncateDate = dateTimeParser.parse("June 1, 2008 23:59:59.999"); - baseTruncateTest(targetDayOfMonthDate, lastTruncateDate, calendarField); - } - - /** - * Test DateUtils.truncate()-method with Calendar.AM_PM - * Includes truncating the extremes of both AM and PM of one day - * - * @throws Exception so we don't have to catch it - * @since 3.0 - */ - @Test - public void testTruncateAmPm() throws Exception { - final int calendarField = Calendar.AM_PM; - - //AM - Date lastTruncateDate = dateTimeParser.parse("June 1, 2008 11:59:59.999"); - baseTruncateTest(targetAmDate, lastTruncateDate, calendarField); - - //PM - lastTruncateDate = dateTimeParser.parse("June 1, 2008 23:59:59.999"); - baseTruncateTest(targetPmDate, lastTruncateDate, calendarField); - } - - /** - * Test DateUtils.truncate()-method with Calendar.HOUR - * - * @throws Exception so we don't have to catch it - * @since 3.0 - */ - @Test - public void testTruncateHour() throws Exception { - final int calendarField = Calendar.HOUR; - final Date lastTruncateDate = dateTimeParser.parse("June 1, 2008 8:59:59.999"); - baseTruncateTest(targetHourDate, lastTruncateDate, calendarField); - } - - /** - * Test DateUtils.truncate()-method with Calendar.HOUR_OF_DAY - * - * @throws Exception so we don't have to catch it - * @since 3.0 - */ - @Test - public void testTruncateHourOfDay() throws Exception { - final int calendarField = Calendar.HOUR_OF_DAY; - final Date lastTruncateDate = dateTimeParser.parse("June 1, 2008 8:59:59.999"); - baseTruncateTest(targetHourOfDayDate, lastTruncateDate, calendarField); - } - - /** - * Test DateUtils.truncate()-method with Calendar.MINUTE - * - * @throws Exception so we don't have to catch it - * @since 3.0 - */ - @Test - public void testTruncateMinute() throws Exception { - final int calendarField = Calendar.MINUTE; - final Date lastTruncateDate = dateTimeParser.parse("June 1, 2008 8:15:59.999"); - baseTruncateTest(targetMinuteDate, lastTruncateDate, calendarField); - } - - /** - * Test DateUtils.truncate()-method with Calendar.SECOND - * - * @throws Exception so we don't have to catch it - * @since 3.0 - */ - @Test - public void testTruncateSecond() throws Exception { - final int calendarField = Calendar.SECOND; - final Date lastTruncateDate = dateTimeParser.parse("June 1, 2008 8:15:14.999"); - baseTruncateTest(targetSecondDate, lastTruncateDate, calendarField); - } - - /** - * Test DateUtils.truncate()-method with Calendar.SECOND - * - * @since 3.0 - */ - @Test - public void testTruncateMilliSecond() { - final int calendarField = Calendar.MILLISECOND; - baseTruncateTest(targetMilliSecondDate, targetMilliSecondDate, calendarField); - } - /** * When using this basetest all extremes are tested.
* It will test the Date, Calendar and Object-implementation
@@ -726,4 +184,546 @@ protected void roundToJanuaryFirst(final Date minDate, final Date maxDate, final assertNotEquals(januaryOneDate, DateUtils.round(toPrevRoundDate, calendarField), fdf.format(minCalendar) + " is not an lower-extreme when rounding as Date with CalendarField-value " + calendarField); assertNotEquals(januaryOneDate, DateUtils.round(toNextRoundDate, calendarField), fdf.format(maxCalendar) + " is not an upper-extreme when rounding as Date with CalendarField-value " + calendarField); } + + @BeforeEach + public void setUp() throws Exception { + + dateTimeParser = new SimpleDateFormat("MMM dd, yyyy H:mm:ss.SSS", Locale.ENGLISH); + + targetYearDate = dateTimeParser.parse("January 1, 2007 0:00:00.000"); + targetDateDate = targetDayOfMonthDate = dateTimeParser.parse("June 1, 2008 0:00:00.000"); + targetAmDate = dateTimeParser.parse("June 1, 2008 0:00:00.000"); + targetPmDate = dateTimeParser.parse("June 1, 2008 12:00:00.000"); + targetHourDate = dateTimeParser.parse("June 1, 2008 8:00:00.000"); + targetHourOfDayDate = dateTimeParser.parse("June 1, 2008 8:00:00.000"); + targetMinuteDate = dateTimeParser.parse("June 1, 2008 8:15:00.000"); + targetSecondDate = dateTimeParser.parse("June 1, 2008 8:15:14.000"); + targetMilliSecondDate = dateTimeParser.parse("June 1, 2008 8:15:14.231"); + + januaryOneDate = dateTimeParser.parse("January 1, 2008 0:00:00.000"); + januaryOneCalendar = Calendar.getInstance(); + januaryOneCalendar.setTime(januaryOneDate); + } + + /** + * Tests DateUtils.round()-method with Calendar.AM_PM + * Includes rounding the extremes of both AM and PM of one day + * Includes rounding to January 1 + * + * @throws Exception so we don't have to catch it + * @since 3.0 + */ + @Test + public void testRoundAmPm() throws Exception { + final int calendarField = Calendar.AM_PM; + Date roundedUpDate, roundedDownDate, lastRoundedDownDate; + Date minDate, maxDate; + + //AM + roundedUpDate = dateTimeParser.parse("June 1, 2008 12:00:00.000"); + roundedDownDate = targetAmDate; + lastRoundedDownDate = dateTimeParser.parse("June 1, 2008 5:59:59.999"); + baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); + + //PM + roundedUpDate = dateTimeParser.parse("June 2, 2008 0:00:00.000"); + roundedDownDate = targetPmDate; + lastRoundedDownDate = dateTimeParser.parse("June 1, 2008 17:59:59.999"); + baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); + + //round to January 1 + minDate = dateTimeParser.parse("December 31, 2007 18:00:00.000"); + maxDate = dateTimeParser.parse("January 1, 2008 5:59:59.999"); + roundToJanuaryFirst(minDate, maxDate, calendarField); + } + + /** + * Tests DateUtils.round()-method with Calendar.DATE + * Includes rounding the extremes of one day + * Includes rounding to January 1 + * + * @throws Exception so we don't have to catch it + * @since 3.0 + */ + @Test + public void testRoundDate() throws Exception { + final int calendarField = Calendar.DATE; + Date roundedUpDate, roundedDownDate, lastRoundedDownDate; + Date minDate, maxDate; + + roundedUpDate = dateTimeParser.parse("June 2, 2008 0:00:00.000"); + roundedDownDate = targetDateDate; + lastRoundedDownDate = dateTimeParser.parse("June 1, 2008 11:59:59.999"); + baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); + + //round to January 1 + minDate = dateTimeParser.parse("December 31, 2007 12:00:00.000"); + maxDate = dateTimeParser.parse("January 1, 2008 11:59:59.999"); + roundToJanuaryFirst(minDate, maxDate, calendarField); + } + + /** + * Tests DateUtils.round()-method with Calendar.DAY_OF_MONTH + * Includes rounding the extremes of one day + * Includes rounding to January 1 + * + * @throws Exception so we don't have to catch it + * @since 3.0 + */ + @Test + public void testRoundDayOfMonth() throws Exception { + final int calendarField = Calendar.DAY_OF_MONTH; + Date roundedUpDate, roundedDownDate, lastRoundedDownDate; + Date minDate, maxDate; + + roundedUpDate = dateTimeParser.parse("June 2, 2008 0:00:00.000"); + roundedDownDate = targetDayOfMonthDate; + lastRoundedDownDate = dateTimeParser.parse("June 1, 2008 11:59:59.999"); + baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); + + //round to January 1 + minDate = dateTimeParser.parse("December 31, 2007 12:00:00.000"); + maxDate = dateTimeParser.parse("January 1, 2008 11:59:59.999"); + roundToJanuaryFirst(minDate, maxDate, calendarField); + } + + /** + * Tests DateUtils.round()-method with Calendar.HOUR + * Includes rounding the extremes of one hour + * Includes rounding to January 1 + * + * @throws Exception so we don't have to catch it + * @since 3.0 + */ + @Test + public void testRoundHour() throws Exception { + final int calendarField = Calendar.HOUR; + Date roundedUpDate, roundedDownDate, lastRoundedDownDate; + Date minDate, maxDate; + + roundedUpDate = dateTimeParser.parse("June 1, 2008 9:00:00.000"); + roundedDownDate = targetHourDate; + lastRoundedDownDate = dateTimeParser.parse("June 1, 2008 8:29:59.999"); + baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); + + //round to January 1 + minDate = dateTimeParser.parse("December 31, 2007 23:30:00.000"); + maxDate = dateTimeParser.parse("January 1, 2008 0:29:59.999"); + roundToJanuaryFirst(minDate, maxDate, calendarField); + } + + /** + * Tests DateUtils.round()-method with Calendar.HOUR_OF_DAY + * Includes rounding the extremes of one hour + * Includes rounding to January 1 + * + * @throws Exception so we don't have to catch it + * @since 3.0 + */ + @Test + public void testRoundHourOfDay() throws Exception { + final int calendarField = Calendar.HOUR_OF_DAY; + Date roundedUpDate, roundedDownDate, lastRoundedDownDate; + Date minDate, maxDate; + + roundedUpDate = dateTimeParser.parse("June 1, 2008 9:00:00.000"); + roundedDownDate = targetHourOfDayDate; + lastRoundedDownDate = dateTimeParser.parse("June 1, 2008 8:29:59.999"); + baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); + + //round to January 1 + minDate = dateTimeParser.parse("December 31, 2007 23:30:00.000"); + maxDate = dateTimeParser.parse("January 1, 2008 0:29:59.999"); + roundToJanuaryFirst(minDate, maxDate, calendarField); + } + + /** + * Tests DateUtils.round()-method with Calendar.MILLISECOND + * Includes rounding the extremes of one second + * Includes rounding to January 1 + * + * @throws Exception so we don't have to catch it + * @since 3.0 + */ + @Test + public void testRoundMilliSecond() throws Exception { + final int calendarField = Calendar.MILLISECOND; + Date roundedUpDate, roundedDownDate, lastRoundedDownDate; + Date minDate, maxDate; + + roundedDownDate = lastRoundedDownDate = targetMilliSecondDate; + roundedUpDate = dateTimeParser.parse("June 1, 2008 8:15:14.232"); + baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); + + //round to January 1 + minDate = maxDate = januaryOneDate; + roundToJanuaryFirst(minDate, maxDate, calendarField); + } + + /** + * Tests DateUtils.round()-method with Calendar.MINUTE + * Includes rounding the extremes of one minute + * Includes rounding to January 1 + * + * @throws Exception so we don't have to catch it + * @since 3.0 + */ + @Test + public void testRoundMinute() throws Exception { + final int calendarField = Calendar.MINUTE; + Date roundedUpDate, roundedDownDate, lastRoundedDownDate; + Date minDate, maxDate; + + roundedUpDate = dateTimeParser.parse("June 1, 2008 8:16:00.000"); + roundedDownDate = targetMinuteDate; + lastRoundedDownDate = dateTimeParser.parse("June 1, 2008 8:15:29.999"); + baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); + + //round to January 1 + minDate = dateTimeParser.parse("December 31, 2007 23:59:30.000"); + maxDate = dateTimeParser.parse("January 1, 2008 0:00:29.999"); + roundToJanuaryFirst(minDate, maxDate, calendarField); + } + + /** + * Tests DateUtils.round()-method with Calendar.MONTH + * Includes rounding months with 28, 29, 30 and 31 days + * Includes rounding to January 1 + * + * @throws Exception so we don't have to catch it + * @since 3.0 + */ + @Test + public void testRoundMonth() throws Exception { + final int calendarField = Calendar.MONTH; + Date roundedUpDate, roundedDownDate, lastRoundedDownDate; + Date minDate, maxDate; + + //month with 28 days + roundedUpDate = dateTimeParser.parse("March 1, 2007 0:00:00.000"); + roundedDownDate = dateTimeParser.parse("February 1, 2007 0:00:00.000"); + lastRoundedDownDate = dateTimeParser.parse("February 14, 2007 23:59:59.999"); + baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); + + //month with 29 days + roundedUpDate = dateTimeParser.parse("March 1, 2008 0:00:00.000"); + roundedDownDate = dateTimeParser.parse("February 1, 2008 0:00:00.000"); + lastRoundedDownDate = dateTimeParser.parse("February 15, 2008 23:59:59.999"); + baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); + + //month with 30 days + roundedUpDate = dateTimeParser.parse("May 1, 2008 0:00:00.000"); + roundedDownDate = dateTimeParser.parse("April 1, 2008 0:00:00.000"); + lastRoundedDownDate = dateTimeParser.parse("April 15, 2008 23:59:59.999"); + baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); + + //month with 31 days + roundedUpDate = dateTimeParser.parse("June 1, 2008 0:00:00.000"); + roundedDownDate = dateTimeParser.parse("May 1, 2008 0:00:00.000"); + lastRoundedDownDate = dateTimeParser.parse("May 16, 2008 23:59:59.999"); + baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); + + //round to January 1 + minDate = dateTimeParser.parse("December 17, 2007 00:00:00.000"); + maxDate = dateTimeParser.parse("January 16, 2008 23:59:59.999"); + roundToJanuaryFirst(minDate, maxDate, calendarField); + } + + /** + * Tests DateUtils.round()-method with Calendar.SECOND + * Includes rounding the extremes of one second + * Includes rounding to January 1 + * + * @throws Exception so we don't have to catch it + * @since 3.0 + */ + @Test + public void testRoundSecond() throws Exception { + final int calendarField = Calendar.SECOND; + Date roundedUpDate, roundedDownDate, lastRoundedDownDate; + Date minDate, maxDate; + + roundedUpDate = dateTimeParser.parse("June 1, 2008 8:15:15.000"); + roundedDownDate = targetSecondDate; + lastRoundedDownDate = dateTimeParser.parse("June 1, 2008 8:15:14.499"); + baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); + + //round to January 1 + minDate = dateTimeParser.parse("December 31, 2007 23:59:59.500"); + maxDate = dateTimeParser.parse("January 1, 2008 0:00:00.499"); + roundToJanuaryFirst(minDate, maxDate, calendarField); + } + + /** + * Tests DateUtils.round()-method with DateUtils.SEMI_MONTH + * Includes rounding months with 28, 29, 30 and 31 days, each with first and second half + * Includes rounding to January 1 + * + * @throws Exception so we don't have to catch it + * @since 3.0 + */ + @Test + public void testRoundSemiMonth() throws Exception { + final int calendarField = DateUtils.SEMI_MONTH; + Date roundedUpDate, roundedDownDate, lastRoundedDownDate; + Date minDate, maxDate; + + //month with 28 days (1) + roundedUpDate = dateTimeParser.parse("February 16, 2007 0:00:00.000"); + roundedDownDate = dateTimeParser.parse("February 1, 2007 0:00:00.000"); + lastRoundedDownDate = dateTimeParser.parse("February 8, 2007 23:59:59.999"); + baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); + + //month with 28 days (2) + roundedUpDate = dateTimeParser.parse("March 1, 2007 0:00:00.000"); + roundedDownDate = dateTimeParser.parse("February 16, 2007 0:00:00.000"); + lastRoundedDownDate = dateTimeParser.parse("February 23, 2007 23:59:59.999"); + baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); + + //month with 29 days (1) + roundedUpDate = dateTimeParser.parse("February 16, 2008 0:00:00.000"); + roundedDownDate = dateTimeParser.parse("February 1, 2008 0:00:00.000"); + lastRoundedDownDate = dateTimeParser.parse("February 8, 2008 23:59:59.999"); + baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); + + //month with 29 days (2) + roundedUpDate = dateTimeParser.parse("March 1, 2008 0:00:00.000"); + roundedDownDate = dateTimeParser.parse("February 16, 2008 0:00:00.000"); + lastRoundedDownDate = dateTimeParser.parse("February 23, 2008 23:59:59.999"); + baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); + + //month with 30 days (1) + roundedUpDate = dateTimeParser.parse("April 16, 2008 0:00:00.000"); + roundedDownDate = dateTimeParser.parse("April 1, 2008 0:00:00.000"); + lastRoundedDownDate = dateTimeParser.parse("April 8, 2008 23:59:59.999"); + baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); + + //month with 30 days (2) + roundedUpDate = dateTimeParser.parse("May 1, 2008 0:00:00.000"); + roundedDownDate = dateTimeParser.parse("April 16, 2008 0:00:00.000"); + lastRoundedDownDate = dateTimeParser.parse("April 23, 2008 23:59:59.999"); + baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); + + //month with 31 days (1) + roundedUpDate = dateTimeParser.parse("May 16, 2008 0:00:00.000"); + roundedDownDate = dateTimeParser.parse("May 1, 2008 0:00:00.000"); + lastRoundedDownDate = dateTimeParser.parse("May 8, 2008 23:59:59.999"); + baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); + + //month with 31 days (2) + roundedUpDate = dateTimeParser.parse("June 1, 2008 0:00:00.000"); + roundedDownDate = dateTimeParser.parse("May 16, 2008 0:00:00.000"); + lastRoundedDownDate = dateTimeParser.parse("May 23, 2008 23:59:59.999"); + baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); + + //round to January 1 + minDate = dateTimeParser.parse("December 24, 2007 00:00:00.000"); + maxDate = dateTimeParser.parse("January 8, 2008 23:59:59.999"); + roundToJanuaryFirst(minDate, maxDate, calendarField); + } + + /** + * Tests DateUtils.round()-method with Calendar.Year + * + * @throws Exception so we don't have to catch it + * @since 3.0 + */ + @Test + public void testRoundYear() throws Exception { + final int calendarField = Calendar.YEAR; + final Date roundedUpDate = dateTimeParser.parse("January 1, 2008 0:00:00.000"); + final Date roundedDownDate = targetYearDate; + final Date lastRoundedDownDate = dateTimeParser.parse("June 30, 2007 23:59:59.999"); + baseRoundTest(roundedUpDate, roundedDownDate, lastRoundedDownDate, calendarField); + } + + /** + * Test DateUtils.truncate()-method with Calendar.AM_PM + * Includes truncating the extremes of both AM and PM of one day + * + * @throws Exception so we don't have to catch it + * @since 3.0 + */ + @Test + public void testTruncateAmPm() throws Exception { + final int calendarField = Calendar.AM_PM; + + //AM + Date lastTruncateDate = dateTimeParser.parse("June 1, 2008 11:59:59.999"); + baseTruncateTest(targetAmDate, lastTruncateDate, calendarField); + + //PM + lastTruncateDate = dateTimeParser.parse("June 1, 2008 23:59:59.999"); + baseTruncateTest(targetPmDate, lastTruncateDate, calendarField); + } + + /** + * Test DateUtils.truncate()-method with Calendar.DATE + * + * @throws Exception so we don't have to catch it + * @since 3.0 + */ + @Test + public void testTruncateDate() throws Exception { + final int calendarField = Calendar.DATE; + final Date lastTruncateDate = dateTimeParser.parse("June 1, 2008 23:59:59.999"); + baseTruncateTest(targetDateDate, lastTruncateDate, calendarField); + } + + /** + * Test DateUtils.truncate()-method with Calendar.DAY_OF_MONTH + * + * @throws Exception so we don't have to catch it + * @since 3.0 + */ + @Test + public void testTruncateDayOfMonth() throws Exception { + final int calendarField = Calendar.DAY_OF_MONTH; + final Date lastTruncateDate = dateTimeParser.parse("June 1, 2008 23:59:59.999"); + baseTruncateTest(targetDayOfMonthDate, lastTruncateDate, calendarField); + } + + /** + * Test DateUtils.truncate()-method with Calendar.HOUR + * + * @throws Exception so we don't have to catch it + * @since 3.0 + */ + @Test + public void testTruncateHour() throws Exception { + final int calendarField = Calendar.HOUR; + final Date lastTruncateDate = dateTimeParser.parse("June 1, 2008 8:59:59.999"); + baseTruncateTest(targetHourDate, lastTruncateDate, calendarField); + } + + /** + * Test DateUtils.truncate()-method with Calendar.HOUR_OF_DAY + * + * @throws Exception so we don't have to catch it + * @since 3.0 + */ + @Test + public void testTruncateHourOfDay() throws Exception { + final int calendarField = Calendar.HOUR_OF_DAY; + final Date lastTruncateDate = dateTimeParser.parse("June 1, 2008 8:59:59.999"); + baseTruncateTest(targetHourOfDayDate, lastTruncateDate, calendarField); + } + + /** + * Test DateUtils.truncate()-method with Calendar.SECOND + * + * @since 3.0 + */ + @Test + public void testTruncateMilliSecond() { + final int calendarField = Calendar.MILLISECOND; + baseTruncateTest(targetMilliSecondDate, targetMilliSecondDate, calendarField); + } + + /** + * Test DateUtils.truncate()-method with Calendar.MINUTE + * + * @throws Exception so we don't have to catch it + * @since 3.0 + */ + @Test + public void testTruncateMinute() throws Exception { + final int calendarField = Calendar.MINUTE; + final Date lastTruncateDate = dateTimeParser.parse("June 1, 2008 8:15:59.999"); + baseTruncateTest(targetMinuteDate, lastTruncateDate, calendarField); + } + + /** + * Test DateUtils.truncate()-method with Calendar.MONTH + * + * @throws Exception so we don't have to catch it + * @since 3.0 + */ + @Test + public void testTruncateMonth() throws Exception { + final int calendarField = Calendar.MONTH; + final Date truncatedDate = dateTimeParser.parse("March 1, 2008 0:00:00.000"); + final Date lastTruncateDate = dateTimeParser.parse("March 31, 2008 23:59:59.999"); + baseTruncateTest(truncatedDate, lastTruncateDate, calendarField); + } + + /** + * Test DateUtils.truncate()-method with Calendar.SECOND + * + * @throws Exception so we don't have to catch it + * @since 3.0 + */ + @Test + public void testTruncateSecond() throws Exception { + final int calendarField = Calendar.SECOND; + final Date lastTruncateDate = dateTimeParser.parse("June 1, 2008 8:15:14.999"); + baseTruncateTest(targetSecondDate, lastTruncateDate, calendarField); + } + + /** + * Test DateUtils.truncate()-method with DateUtils.SEMI_MONTH + * Includes truncating months with 28, 29, 30 and 31 days, each with first and second half + * + * @throws Exception so we don't have to catch it + * @since 3.0 + */ + @Test + public void testTruncateSemiMonth() throws Exception { + final int calendarField = DateUtils.SEMI_MONTH; + Date truncatedDate, lastTruncateDate; + + //month with 28 days (1) + truncatedDate = dateTimeParser.parse("February 1, 2007 0:00:00.000"); + lastTruncateDate = dateTimeParser.parse("February 15, 2007 23:59:59.999"); + baseTruncateTest(truncatedDate, lastTruncateDate, calendarField); + + //month with 28 days (2) + truncatedDate = dateTimeParser.parse("February 16, 2007 0:00:00.000"); + lastTruncateDate = dateTimeParser.parse("February 28, 2007 23:59:59.999"); + baseTruncateTest(truncatedDate, lastTruncateDate, calendarField); + + //month with 29 days (1) + truncatedDate = dateTimeParser.parse("February 1, 2008 0:00:00.000"); + lastTruncateDate = dateTimeParser.parse("February 15, 2008 23:59:59.999"); + baseTruncateTest(truncatedDate, lastTruncateDate, calendarField); + + //month with 29 days (2) + truncatedDate = dateTimeParser.parse("February 16, 2008 0:00:00.000"); + lastTruncateDate = dateTimeParser.parse("February 29, 2008 23:59:59.999"); + baseTruncateTest(truncatedDate, lastTruncateDate, calendarField); + + //month with 30 days (1) + truncatedDate = dateTimeParser.parse("April 1, 2008 0:00:00.000"); + lastTruncateDate = dateTimeParser.parse("April 15, 2008 23:59:59.999"); + baseTruncateTest(truncatedDate, lastTruncateDate, calendarField); + + //month with 30 days (2) + truncatedDate = dateTimeParser.parse("April 16, 2008 0:00:00.000"); + lastTruncateDate = dateTimeParser.parse("April 30, 2008 23:59:59.999"); + baseTruncateTest(truncatedDate, lastTruncateDate, calendarField); + + //month with 31 days (1) + truncatedDate = dateTimeParser.parse("March 1, 2008 0:00:00.000"); + lastTruncateDate = dateTimeParser.parse("March 15, 2008 23:59:59.999"); + baseTruncateTest(truncatedDate, lastTruncateDate, calendarField); + + //month with 31 days (2) + truncatedDate = dateTimeParser.parse("March 16, 2008 0:00:00.000"); + lastTruncateDate = dateTimeParser.parse("March 31, 2008 23:59:59.999"); + baseTruncateTest(truncatedDate, lastTruncateDate, calendarField); + + } + + /** + * Test DateUtils.truncate()-method with Calendar.YEAR + * + * @throws Exception so we don't have to catch it + * @since 3.0 + */ + @Test + public void testTruncateYear() throws Exception { + final int calendarField = Calendar.YEAR; + final Date lastTruncateDate = dateTimeParser.parse("December 31, 2007 23:59:59.999"); + baseTruncateTest(targetYearDate, lastTruncateDate, calendarField); + } } diff --git a/src/test/java/org/apache/commons/lang3/time/DateUtilsTest.java b/src/test/java/org/apache/commons/lang3/time/DateUtilsTest.java index 14dbf89c2..dd6025dce 100644 --- a/src/test/java/org/apache/commons/lang3/time/DateUtilsTest.java +++ b/src/test/java/org/apache/commons/lang3/time/DateUtilsTest.java @@ -48,13 +48,68 @@ public class DateUtilsTest { private static Date BASE_DATE; + /** + * Used to check that Calendar objects are close enough + * delta is in milliseconds + */ + private static void assertCalendarsEquals(final String message, final Calendar cal1, final Calendar cal2, final long delta) { + assertFalse(Math.abs(cal1.getTime().getTime() - cal2.getTime().getTime()) > delta, + message + " expected " + cal1.getTime() + " but got " + cal2.getTime()); + } + + /** + * This checks that this is a 7 element iterator of Calendar objects + * that are dates (no time), and exactly 1 day spaced after each other. + */ + private static void assertWeekIterator(final Iterator it, final Calendar start) { + final Calendar end = (Calendar) start.clone(); + end.add(Calendar.DATE, 6); + + assertWeekIterator(it, start, end); + } + /** + * This checks that this is a 7 divisble iterator of Calendar objects + * that are dates (no time), and exactly 1 day spaced after each other + * (in addition to the proper start and stop dates) + */ + private static void assertWeekIterator(final Iterator it, final Calendar start, final Calendar end) { + Calendar cal = (Calendar) it.next(); + assertCalendarsEquals("", start, cal, 0); + Calendar last = null; + int count = 1; + while (it.hasNext()) { + //Check this is just a date (no time component) + assertCalendarsEquals("", cal, DateUtils.truncate(cal, Calendar.DATE), 0); + + last = cal; + cal = (Calendar) it.next(); + count++; + + //Check that this is one day more than the last date + last.add(Calendar.DATE, 1); + assertCalendarsEquals("", last, cal, 0); + } + + assertFalse(count % 7 != 0, "There were " + count + " days in this iterator"); + assertCalendarsEquals("", end, cal, 0); + } + /** + * Convenience method for when working with Date objects + */ + private static void assertWeekIterator(final Iterator it, final Date start, final Date end) { + final Calendar calStart = Calendar.getInstance(); + calStart.setTime(start); + final Calendar calEnd = Calendar.getInstance(); + calEnd.setTime(end); + + assertWeekIterator(it, calStart, calEnd); + } @BeforeAll public static void classSetup() { final GregorianCalendar cal = new GregorianCalendar(2000, 6, 5, 4, 3, 2); cal.set(Calendar.MILLISECOND, 1); BASE_DATE = cal.getTime(); } - private DateFormat dateParser = null; private DateFormat dateTimeParser = null; private Date dateAmPm1 = null; @@ -80,11 +135,28 @@ public static void classSetup() { private Calendar cal4 = null; private Calendar cal5 = null; private Calendar cal6 = null; + private Calendar cal7 = null; + private Calendar cal8 = null; + private TimeZone zone = null; + private TimeZone defaultZone = null; + //----------------------------------------------------------------------- + private void assertDate(final Date date, final int year, final int month, final int day, final int hour, final int min, final int sec, final int mil) { + final GregorianCalendar cal = new GregorianCalendar(); + cal.setTime(date); + assertEquals(year, cal.get(Calendar.YEAR)); + assertEquals(month, cal.get(Calendar.MONTH)); + assertEquals(day, cal.get(Calendar.DAY_OF_MONTH)); + assertEquals(hour, cal.get(Calendar.HOUR_OF_DAY)); + assertEquals(min, cal.get(Calendar.MINUTE)); + assertEquals(sec, cal.get(Calendar.SECOND)); + assertEquals(mil, cal.get(Calendar.MILLISECOND)); + } + @BeforeEach public void setUp() throws Exception { dateParser = new SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH); @@ -143,288 +215,6 @@ public void setUp() throws Exception { } } - //----------------------------------------------------------------------- - @Test - public void testConstructor() { - assertNotNull(new DateUtils()); - final Constructor[] cons = DateUtils.class.getDeclaredConstructors(); - assertEquals(1, cons.length); - assertTrue(Modifier.isPublic(cons[0].getModifiers())); - assertTrue(Modifier.isPublic(DateUtils.class.getModifiers())); - assertFalse(Modifier.isFinal(DateUtils.class.getModifiers())); - } - - //----------------------------------------------------------------------- - @Test - public void testIsSameDay_Date() { - Date datea = new GregorianCalendar(2004, 6, 9, 13, 45).getTime(); - Date dateb = new GregorianCalendar(2004, 6, 9, 13, 45).getTime(); - assertTrue(DateUtils.isSameDay(datea, dateb)); - dateb = new GregorianCalendar(2004, 6, 10, 13, 45).getTime(); - assertFalse(DateUtils.isSameDay(datea, dateb)); - datea = new GregorianCalendar(2004, 6, 10, 13, 45).getTime(); - assertTrue(DateUtils.isSameDay(datea, dateb)); - dateb = new GregorianCalendar(2005, 6, 10, 13, 45).getTime(); - assertFalse(DateUtils.isSameDay(datea, dateb)); - } - - @Test - public void testIsSameDay_DateNullNull() { - assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameDay((Date) null, null)); - } - - @Test - public void testIsSameDay_DateNullNotNull() { - assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameDay(null, new Date())); - } - - @Test - public void testIsSameDay_DateNotNullNull() { - assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameDay(new Date(), null)); - } - - //----------------------------------------------------------------------- - @Test - public void testIsSameDay_Cal() { - final GregorianCalendar cala = new GregorianCalendar(2004, 6, 9, 13, 45); - final GregorianCalendar calb = new GregorianCalendar(2004, 6, 9, 13, 45); - assertTrue(DateUtils.isSameDay(cala, calb)); - calb.add(Calendar.DAY_OF_YEAR, 1); - assertFalse(DateUtils.isSameDay(cala, calb)); - cala.add(Calendar.DAY_OF_YEAR, 1); - assertTrue(DateUtils.isSameDay(cala, calb)); - calb.add(Calendar.YEAR, 1); - assertFalse(DateUtils.isSameDay(cala, calb)); - } - - @Test - public void testIsSameDay_CalNullNull() { - assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameDay((Calendar) null, null)); - } - - @Test - public void testIsSameDay_CalNullNotNull() { - assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameDay(null, Calendar.getInstance())); - } - - @Test - public void testIsSameDay_CalNotNullNull() { - assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameDay(Calendar.getInstance(), null)); - } - - //----------------------------------------------------------------------- - @Test - public void testIsSameInstant_Date() { - Date datea = new GregorianCalendar(2004, 6, 9, 13, 45).getTime(); - Date dateb = new GregorianCalendar(2004, 6, 9, 13, 45).getTime(); - assertTrue(DateUtils.isSameInstant(datea, dateb)); - dateb = new GregorianCalendar(2004, 6, 10, 13, 45).getTime(); - assertFalse(DateUtils.isSameInstant(datea, dateb)); - datea = new GregorianCalendar(2004, 6, 10, 13, 45).getTime(); - assertTrue(DateUtils.isSameInstant(datea, dateb)); - dateb = new GregorianCalendar(2005, 6, 10, 13, 45).getTime(); - assertFalse(DateUtils.isSameInstant(datea, dateb)); - } - - @Test - public void testIsSameInstant_DateNullNull() { - assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameInstant((Date) null, null)); - } - - @Test - public void testIsSameInstant_DateNullNotNull() { - assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameInstant(null, new Date())); - } - - @Test - public void testIsSameInstant_DateNotNullNull() { - assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameInstant(new Date(), null)); - } - - //----------------------------------------------------------------------- - @Test - public void testIsSameInstant_Cal() { - final GregorianCalendar cala = new GregorianCalendar(TimeZone.getTimeZone("GMT+1")); - final GregorianCalendar calb = new GregorianCalendar(TimeZone.getTimeZone("GMT-1")); - cala.set(2004, Calendar.JULY, 9, 13, 45, 0); - cala.set(Calendar.MILLISECOND, 0); - calb.set(2004, Calendar.JULY, 9, 13, 45, 0); - calb.set(Calendar.MILLISECOND, 0); - assertFalse(DateUtils.isSameInstant(cala, calb)); - - calb.set(2004, Calendar.JULY, 9, 11, 45, 0); - assertTrue(DateUtils.isSameInstant(cala, calb)); - } - - @Test - public void testIsSameInstant_CalNullNull() { - assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameInstant((Calendar) null, null)); - } - - @Test - public void testIsSameInstant_CalNullNotNull() { - assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameInstant(null, Calendar.getInstance())); - } - - @Test - public void testIsSameInstant_CalNotNullNull() { - assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameInstant(Calendar.getInstance(), null)); - } - - //----------------------------------------------------------------------- - @Test - public void testIsSameLocalTime_Cal() { - final GregorianCalendar cala = new GregorianCalendar(TimeZone.getTimeZone("GMT+1")); - final GregorianCalendar calb = new GregorianCalendar(TimeZone.getTimeZone("GMT-1")); - cala.set(2004, Calendar.JULY, 9, 13, 45, 0); - cala.set(Calendar.MILLISECOND, 0); - calb.set(2004, Calendar.JULY, 9, 13, 45, 0); - calb.set(Calendar.MILLISECOND, 0); - assertTrue(DateUtils.isSameLocalTime(cala, calb)); - - final Calendar calc = Calendar.getInstance(); - final Calendar cald = Calendar.getInstance(); - calc.set(2004, Calendar.JULY, 9, 4, 0, 0); - cald.set(2004, Calendar.JULY, 9, 16, 0, 0); - calc.set(Calendar.MILLISECOND, 0); - cald.set(Calendar.MILLISECOND, 0); - assertFalse(DateUtils.isSameLocalTime(calc, cald), "LANG-677"); - - calb.set(2004, Calendar.JULY, 9, 11, 45, 0); - assertFalse(DateUtils.isSameLocalTime(cala, calb)); - } - - @Test - public void testIsSameLocalTime_CalNullNull() { - assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameLocalTime(null, null)); - } - - @Test - public void testIsSameLocalTime_CalNullNotNull() { - assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameLocalTime(null, Calendar.getInstance())); - } - - @Test - public void testIsSameLocalTime_CalNotNullNull() { - assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameLocalTime(Calendar.getInstance(), null)); - } - - //----------------------------------------------------------------------- - @Test - public void testParseDate() throws Exception { - final GregorianCalendar cal = new GregorianCalendar(1972, 11, 3); - String dateStr = "1972-12-03"; - final String[] parsers = new String[] {"yyyy'-'DDD", "yyyy'-'MM'-'dd", "yyyyMMdd"}; - Date date = DateUtils.parseDate(dateStr, parsers); - assertEquals(cal.getTime(), date); - - dateStr = "1972-338"; - date = DateUtils.parseDate(dateStr, parsers); - assertEquals(cal.getTime(), date); - - dateStr = "19721203"; - date = DateUtils.parseDate(dateStr, parsers); - assertEquals(cal.getTime(), date); - } - - @Test - public void testParseDate_NoDateString() { - final String[] parsers = new String[] {"yyyy'-'DDD", "yyyy'-'MM'-'dd", "yyyyMMdd"}; - assertThrows(ParseException.class, () -> DateUtils.parseDate("PURPLE", parsers)); - } - - @Test - public void testParseDate_InvalidDateString() { - final String[] parsers = new String[] {"yyyy'-'DDD", "yyyy'-'MM'-'dd", "yyyyMMdd"}; - assertThrows(ParseException.class, () -> DateUtils.parseDate("197212AB", parsers)); - } - - @Test - public void testParseDate_Null() { - final String[] parsers = new String[] {"yyyy'-'DDD", "yyyy'-'MM'-'dd", "yyyyMMdd"}; - assertThrows(IllegalArgumentException.class, () -> DateUtils.parseDate(null, parsers)); - } - - @Test - public void testParse_NullParsers() { - assertThrows(IllegalArgumentException.class, () -> DateUtils.parseDate("19721203", (String[]) null)); - } - - @Test - public void testParse_EmptyParsers() { - assertThrows(ParseException.class, () -> DateUtils.parseDate("19721203")); - } - - // LANG-486 - @Test - public void testParseDateWithLeniency() throws Exception { - final GregorianCalendar cal = new GregorianCalendar(1998, 6, 30); - final String dateStr = "02 942, 1996"; - final String[] parsers = new String[] {"MM DDD, yyyy"}; - - final Date date = DateUtils.parseDate(dateStr, parsers); - assertEquals(cal.getTime(), date); - - assertThrows(ParseException.class, () -> DateUtils.parseDateStrictly(dateStr, parsers)); - } - - //----------------------------------------------------------------------- - @Test - public void testAddYears() throws Exception { - Date result = DateUtils.addYears(BASE_DATE, 0); - assertNotSame(BASE_DATE, result); - assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); - assertDate(result, 2000, 6, 5, 4, 3, 2, 1); - - result = DateUtils.addYears(BASE_DATE, 1); - assertNotSame(BASE_DATE, result); - assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); - assertDate(result, 2001, 6, 5, 4, 3, 2, 1); - - result = DateUtils.addYears(BASE_DATE, -1); - assertNotSame(BASE_DATE, result); - assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); - assertDate(result, 1999, 6, 5, 4, 3, 2, 1); - } - - //----------------------------------------------------------------------- - @Test - public void testAddMonths() throws Exception { - Date result = DateUtils.addMonths(BASE_DATE, 0); - assertNotSame(BASE_DATE, result); - assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); - assertDate(result, 2000, 6, 5, 4, 3, 2, 1); - - result = DateUtils.addMonths(BASE_DATE, 1); - assertNotSame(BASE_DATE, result); - assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); - assertDate(result, 2000, 7, 5, 4, 3, 2, 1); - - result = DateUtils.addMonths(BASE_DATE, -1); - assertNotSame(BASE_DATE, result); - assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); - assertDate(result, 2000, 5, 5, 4, 3, 2, 1); - } - - //----------------------------------------------------------------------- - @Test - public void testAddWeeks() throws Exception { - Date result = DateUtils.addWeeks(BASE_DATE, 0); - assertNotSame(BASE_DATE, result); - assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); - assertDate(result, 2000, 6, 5, 4, 3, 2, 1); - - result = DateUtils.addWeeks(BASE_DATE, 1); - assertNotSame(BASE_DATE, result); - assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); - assertDate(result, 2000, 6, 12, 4, 3, 2, 1); - - result = DateUtils.addWeeks(BASE_DATE, -1); - assertNotSame(BASE_DATE, result); - assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); // july - assertDate(result, 2000, 5, 28, 4, 3, 2, 1); // june - } - //----------------------------------------------------------------------- @Test public void testAddDays() throws Exception { @@ -463,6 +253,25 @@ public void testAddHours() throws Exception { assertDate(result, 2000, 6, 5, 3, 3, 2, 1); } + //----------------------------------------------------------------------- + @Test + public void testAddMilliseconds() throws Exception { + Date result = DateUtils.addMilliseconds(BASE_DATE, 0); + assertNotSame(BASE_DATE, result); + assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); + assertDate(result, 2000, 6, 5, 4, 3, 2, 1); + + result = DateUtils.addMilliseconds(BASE_DATE, 1); + assertNotSame(BASE_DATE, result); + assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); + assertDate(result, 2000, 6, 5, 4, 3, 2, 2); + + result = DateUtils.addMilliseconds(BASE_DATE, -1); + assertNotSame(BASE_DATE, result); + assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); + assertDate(result, 2000, 6, 5, 4, 3, 2, 0); + } + //----------------------------------------------------------------------- @Test public void testAddMinutes() throws Exception { @@ -482,6 +291,25 @@ public void testAddMinutes() throws Exception { assertDate(result, 2000, 6, 5, 4, 2, 2, 1); } + //----------------------------------------------------------------------- + @Test + public void testAddMonths() throws Exception { + Date result = DateUtils.addMonths(BASE_DATE, 0); + assertNotSame(BASE_DATE, result); + assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); + assertDate(result, 2000, 6, 5, 4, 3, 2, 1); + + result = DateUtils.addMonths(BASE_DATE, 1); + assertNotSame(BASE_DATE, result); + assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); + assertDate(result, 2000, 7, 5, 4, 3, 2, 1); + + result = DateUtils.addMonths(BASE_DATE, -1); + assertNotSame(BASE_DATE, result); + assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); + assertDate(result, 2000, 5, 5, 4, 3, 2, 1); + } + //----------------------------------------------------------------------- @Test public void testAddSeconds() throws Exception { @@ -503,200 +331,589 @@ public void testAddSeconds() throws Exception { //----------------------------------------------------------------------- @Test - public void testAddMilliseconds() throws Exception { - Date result = DateUtils.addMilliseconds(BASE_DATE, 0); + public void testAddWeeks() throws Exception { + Date result = DateUtils.addWeeks(BASE_DATE, 0); assertNotSame(BASE_DATE, result); assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); assertDate(result, 2000, 6, 5, 4, 3, 2, 1); - result = DateUtils.addMilliseconds(BASE_DATE, 1); + result = DateUtils.addWeeks(BASE_DATE, 1); assertNotSame(BASE_DATE, result); assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); - assertDate(result, 2000, 6, 5, 4, 3, 2, 2); + assertDate(result, 2000, 6, 12, 4, 3, 2, 1); - result = DateUtils.addMilliseconds(BASE_DATE, -1); + result = DateUtils.addWeeks(BASE_DATE, -1); assertNotSame(BASE_DATE, result); - assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); - assertDate(result, 2000, 6, 5, 4, 3, 2, 0); + assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); // july + assertDate(result, 2000, 5, 28, 4, 3, 2, 1); // june } - // ----------------------------------------------------------------------- + //----------------------------------------------------------------------- @Test - public void testSetYears() throws Exception { - Date result = DateUtils.setYears(BASE_DATE, 2000); + public void testAddYears() throws Exception { + Date result = DateUtils.addYears(BASE_DATE, 0); assertNotSame(BASE_DATE, result); assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); assertDate(result, 2000, 6, 5, 4, 3, 2, 1); - result = DateUtils.setYears(BASE_DATE, 2008); + result = DateUtils.addYears(BASE_DATE, 1); assertNotSame(BASE_DATE, result); assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); - assertDate(result, 2008, 6, 5, 4, 3, 2, 1); + assertDate(result, 2001, 6, 5, 4, 3, 2, 1); - result = DateUtils.setYears(BASE_DATE, 2005); + result = DateUtils.addYears(BASE_DATE, -1); assertNotSame(BASE_DATE, result); assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); - assertDate(result, 2005, 6, 5, 4, 3, 2, 1); + assertDate(result, 1999, 6, 5, 4, 3, 2, 1); } - // ----------------------------------------------------------------------- + /** + * Tests various values with the ceiling method + * + * @throws java.lang.Exception so we don't have to catch it + */ @Test - public void testSetMonths() throws Exception { - Date result = DateUtils.setMonths(BASE_DATE, 5); - assertNotSame(BASE_DATE, result); - assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); - assertDate(result, 2000, 5, 5, 4, 3, 2, 1); + public void testCeil() throws Exception { + // test javadoc + assertEquals(dateTimeParser.parse("March 28, 2002 14:00:00.000"), + DateUtils.ceiling( + dateTimeParser.parse("March 28, 2002 13:45:01.231"), + Calendar.HOUR), + "ceiling javadoc-1 failed"); + assertEquals(dateTimeParser.parse("April 1, 2002 00:00:00.000"), + DateUtils.ceiling( + dateTimeParser.parse("March 28, 2002 13:45:01.231"), + Calendar.MONTH), + "ceiling javadoc-2 failed"); - result = DateUtils.setMonths(BASE_DATE, 1); - assertNotSame(BASE_DATE, result); - assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); - assertDate(result, 2000, 1, 5, 4, 3, 2, 1); + // tests public static Date ceiling(Date date, int field) + assertEquals(dateParser.parse("January 1, 2003"), + DateUtils.ceiling(date1, Calendar.YEAR), + "ceiling year-1 failed"); + assertEquals(dateParser.parse("January 1, 2002"), + DateUtils.ceiling(date2, Calendar.YEAR), + "ceiling year-2 failed"); + assertEquals(dateParser.parse("March 1, 2002"), + DateUtils.ceiling(date1, Calendar.MONTH), + "ceiling month-1 failed"); + assertEquals(dateParser.parse("December 1, 2001"), + DateUtils.ceiling(date2, Calendar.MONTH), + "ceiling month-2 failed"); + assertEquals(dateParser.parse("February 16, 2002"), + DateUtils.ceiling(date1, DateUtils.SEMI_MONTH), + "ceiling semimonth-1 failed"); + assertEquals(dateParser.parse("December 1, 2001"), + DateUtils.ceiling(date2, DateUtils.SEMI_MONTH), + "ceiling semimonth-2 failed"); + assertEquals(dateParser.parse("February 13, 2002"), + DateUtils.ceiling(date1, Calendar.DATE), + "ceiling date-1 failed"); + assertEquals(dateParser.parse("November 19, 2001"), + DateUtils.ceiling(date2, Calendar.DATE), + "ceiling date-2 failed"); + assertEquals(dateTimeParser.parse("February 12, 2002 13:00:00.000"), + DateUtils.ceiling(date1, Calendar.HOUR), + "ceiling hour-1 failed"); + assertEquals(dateTimeParser.parse("November 18, 2001 2:00:00.000"), + DateUtils.ceiling(date2, Calendar.HOUR), + "ceiling hour-2 failed"); + assertEquals(dateTimeParser.parse("February 12, 2002 12:35:00.000"), + DateUtils.ceiling(date1, Calendar.MINUTE), + "ceiling minute-1 failed"); + assertEquals(dateTimeParser.parse("November 18, 2001 1:24:00.000"), + DateUtils.ceiling(date2, Calendar.MINUTE), + "ceiling minute-2 failed"); + assertEquals(dateTimeParser.parse("February 12, 2002 12:34:57.000"), + DateUtils.ceiling(date1, Calendar.SECOND), + "ceiling second-1 failed"); + assertEquals(dateTimeParser.parse("November 18, 2001 1:23:12.000"), + DateUtils.ceiling(date2, Calendar.SECOND), + "ceiling second-2 failed"); + assertEquals(dateTimeParser.parse("February 3, 2002 12:00:00.000"), + DateUtils.ceiling(dateAmPm1, Calendar.AM_PM), + "ceiling ampm-1 failed"); + assertEquals(dateTimeParser.parse("February 3, 2002 12:00:00.000"), + DateUtils.ceiling(dateAmPm2, Calendar.AM_PM), + "ceiling ampm-2 failed"); + assertEquals(dateTimeParser.parse("February 4, 2002 00:00:00.000"), + DateUtils.ceiling(dateAmPm3, Calendar.AM_PM), + "ceiling ampm-3 failed"); + assertEquals(dateTimeParser.parse("February 4, 2002 00:00:00.000"), + DateUtils.ceiling(dateAmPm4, Calendar.AM_PM), + "ceiling ampm-4 failed"); - assertThrows( - IllegalArgumentException.class, - () -> DateUtils.setMonths(BASE_DATE, 12), - "DateUtils.setMonths did not throw an expected IllegalArgumentException."); - } + // tests public static Date ceiling(Object date, int field) + assertEquals(dateParser.parse("January 1, 2003"), + DateUtils.ceiling((Object) date1, Calendar.YEAR), + "ceiling year-1 failed"); + assertEquals(dateParser.parse("January 1, 2002"), + DateUtils.ceiling((Object) date2, Calendar.YEAR), + "ceiling year-2 failed"); + assertEquals(dateParser.parse("March 1, 2002"), + DateUtils.ceiling((Object) date1, Calendar.MONTH), + "ceiling month-1 failed"); + assertEquals(dateParser.parse("December 1, 2001"), + DateUtils.ceiling((Object) date2, Calendar.MONTH), + "ceiling month-2 failed"); + assertEquals(dateParser.parse("February 16, 2002"), + DateUtils.ceiling((Object) date1, DateUtils.SEMI_MONTH), + "ceiling semimonth-1 failed"); + assertEquals(dateParser.parse("December 1, 2001"), + DateUtils.ceiling((Object) date2, DateUtils.SEMI_MONTH), + "ceiling semimonth-2 failed"); + assertEquals(dateParser.parse("February 13, 2002"), + DateUtils.ceiling((Object) date1, Calendar.DATE), + "ceiling date-1 failed"); + assertEquals(dateParser.parse("November 19, 2001"), + DateUtils.ceiling((Object) date2, Calendar.DATE), + "ceiling date-2 failed"); + assertEquals(dateTimeParser.parse("February 12, 2002 13:00:00.000"), + DateUtils.ceiling((Object) date1, Calendar.HOUR), + "ceiling hour-1 failed"); + assertEquals(dateTimeParser.parse("November 18, 2001 2:00:00.000"), + DateUtils.ceiling((Object) date2, Calendar.HOUR), + "ceiling hour-2 failed"); + assertEquals(dateTimeParser.parse("February 12, 2002 12:35:00.000"), + DateUtils.ceiling((Object) date1, Calendar.MINUTE), + "ceiling minute-1 failed"); + assertEquals(dateTimeParser.parse("November 18, 2001 1:24:00.000"), + DateUtils.ceiling((Object) date2, Calendar.MINUTE), + "ceiling minute-2 failed"); + assertEquals(dateTimeParser.parse("February 12, 2002 12:34:57.000"), + DateUtils.ceiling((Object) date1, Calendar.SECOND), + "ceiling second-1 failed"); + assertEquals(dateTimeParser.parse("November 18, 2001 1:23:12.000"), + DateUtils.ceiling((Object) date2, Calendar.SECOND), + "ceiling second-2 failed"); + assertEquals(dateTimeParser.parse("February 3, 2002 12:00:00.000"), + DateUtils.ceiling((Object) dateAmPm1, Calendar.AM_PM), + "ceiling ampm-1 failed"); + assertEquals(dateTimeParser.parse("February 3, 2002 12:00:00.000"), + DateUtils.ceiling((Object) dateAmPm2, Calendar.AM_PM), + "ceiling ampm-2 failed"); + assertEquals(dateTimeParser.parse("February 4, 2002 00:00:00.000"), + DateUtils.ceiling((Object) dateAmPm3, Calendar.AM_PM), + "ceiling ampm-3 failed"); + assertEquals(dateTimeParser.parse("February 4, 2002 00:00:00.000"), + DateUtils.ceiling((Object) dateAmPm4, Calendar.AM_PM), + "ceiling ampm-4 failed"); - // ----------------------------------------------------------------------- - @Test - public void testSetDays() throws Exception { - Date result = DateUtils.setDays(BASE_DATE, 1); - assertNotSame(BASE_DATE, result); - assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); - assertDate(result, 2000, 6, 1, 4, 3, 2, 1); + assertEquals(dateTimeParser.parse("February 12, 2002 12:34:57.000"), + DateUtils.ceiling((Object) cal1, Calendar.SECOND), + "ceiling calendar second-1 failed"); + assertEquals(dateTimeParser.parse("November 18, 2001 1:23:12.000"), + DateUtils.ceiling((Object) cal2, Calendar.SECOND), + "ceiling calendar second-2 failed"); - result = DateUtils.setDays(BASE_DATE, 29); - assertNotSame(BASE_DATE, result); - assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); - assertDate(result, 2000, 6, 29, 4, 3, 2, 1); + assertEquals(dateTimeParser.parse("February 3, 2002 12:00:00.000"), + DateUtils.ceiling((Object) calAmPm1, Calendar.AM_PM), + "ceiling ampm-1 failed"); + assertEquals(dateTimeParser.parse("February 3, 2002 12:00:00.000"), + DateUtils.ceiling((Object) calAmPm2, Calendar.AM_PM), + "ceiling ampm-2 failed"); + assertEquals(dateTimeParser.parse("February 4, 2002 00:00:00.000"), + DateUtils.ceiling((Object) calAmPm3, Calendar.AM_PM), + "ceiling ampm-3 failed"); + assertEquals(dateTimeParser.parse("February 4, 2002 00:00:00.000"), + DateUtils.ceiling((Object) calAmPm4, Calendar.AM_PM), + "ceiling ampm-4 failed"); - assertThrows( - IllegalArgumentException.class, - () -> DateUtils.setDays(BASE_DATE, 32), - "DateUtils.setDays did not throw an expected IllegalArgumentException."); - } + assertThrows(NullPointerException.class, () -> DateUtils.ceiling((Date) null, Calendar.SECOND)); + assertThrows(IllegalArgumentException.class, () -> DateUtils.ceiling((Calendar) null, Calendar.SECOND)); + assertThrows(IllegalArgumentException.class, () -> DateUtils.ceiling((Object) null, Calendar.SECOND)); + assertThrows(ClassCastException.class, () -> DateUtils.ceiling("", Calendar.SECOND)); + assertThrows(IllegalArgumentException.class, () -> DateUtils.ceiling(date1, -9999)); - // ----------------------------------------------------------------------- - @Test - public void testSetHours() throws Exception { - Date result = DateUtils.setHours(BASE_DATE, 0); - assertNotSame(BASE_DATE, result); - assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); - assertDate(result, 2000, 6, 5, 0, 3, 2, 1); + // Fix for https://issues.apache.org/bugzilla/show_bug.cgi?id=25560 + // Test ceiling across the beginning of daylight saving time + try { + TimeZone.setDefault(zone); + dateTimeParser.setTimeZone(zone); - result = DateUtils.setHours(BASE_DATE, 23); - assertNotSame(BASE_DATE, result); - assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); - assertDate(result, 2000, 6, 5, 23, 3, 2, 1); + assertEquals(dateTimeParser.parse("March 31, 2003 00:00:00.000"), + DateUtils.ceiling(date4, Calendar.DATE), + "ceiling MET date across DST change-over"); + assertEquals(dateTimeParser.parse("March 31, 2003 00:00:00.000"), + DateUtils.ceiling((Object) cal4, Calendar.DATE), + "ceiling MET date across DST change-over"); + assertEquals(dateTimeParser.parse("March 31, 2003 00:00:00.000"), + DateUtils.ceiling(date5, Calendar.DATE), + "ceiling MET date across DST change-over"); + assertEquals(dateTimeParser.parse("March 31, 2003 00:00:00.000"), + DateUtils.ceiling((Object) cal5, Calendar.DATE), + "ceiling MET date across DST change-over"); + assertEquals(dateTimeParser.parse("March 31, 2003 00:00:00.000"), + DateUtils.ceiling(date6, Calendar.DATE), + "ceiling MET date across DST change-over"); + assertEquals(dateTimeParser.parse("March 31, 2003 00:00:00.000"), + DateUtils.ceiling((Object) cal6, Calendar.DATE), + "ceiling MET date across DST change-over"); + assertEquals(dateTimeParser.parse("March 31, 2003 00:00:00.000"), + DateUtils.ceiling(date7, Calendar.DATE), + "ceiling MET date across DST change-over"); + assertEquals(dateTimeParser.parse("March 31, 2003 00:00:00.000"), + DateUtils.ceiling((Object) cal7, Calendar.DATE), + "ceiling MET date across DST change-over"); - assertThrows( - IllegalArgumentException.class, - () -> DateUtils.setHours(BASE_DATE, 24), - "DateUtils.setHours did not throw an expected IllegalArgumentException."); - } + assertEquals(dateTimeParser.parse("March 30, 2003 03:00:00.000"), + DateUtils.ceiling(date4, Calendar.HOUR_OF_DAY), + "ceiling MET date across DST change-over"); + assertEquals(dateTimeParser.parse("March 30, 2003 03:00:00.000"), + DateUtils.ceiling((Object) cal4, Calendar.HOUR_OF_DAY), + "ceiling MET date across DST change-over"); + assertEquals(dateTimeParser.parse("March 30, 2003 03:00:00.000"), + DateUtils.ceiling(date5, Calendar.HOUR_OF_DAY), + "ceiling MET date across DST change-over"); + assertEquals(dateTimeParser.parse("March 30, 2003 03:00:00.000"), + DateUtils.ceiling((Object) cal5, Calendar.HOUR_OF_DAY), + "ceiling MET date across DST change-over"); + assertEquals(dateTimeParser.parse("March 30, 2003 04:00:00.000"), + DateUtils.ceiling(date6, Calendar.HOUR_OF_DAY), + "ceiling MET date across DST change-over"); + assertEquals(dateTimeParser.parse("March 30, 2003 04:00:00.000"), + DateUtils.ceiling((Object) cal6, Calendar.HOUR_OF_DAY), + "ceiling MET date across DST change-over"); + assertEquals(dateTimeParser.parse("March 30, 2003 04:00:00.000"), + DateUtils.ceiling(date7, Calendar.HOUR_OF_DAY), + "ceiling MET date across DST change-over"); + assertEquals(dateTimeParser.parse("March 30, 2003 04:00:00.000"), + DateUtils.ceiling((Object) cal7, Calendar.HOUR_OF_DAY), + "ceiling MET date across DST change-over"); - // ----------------------------------------------------------------------- - @Test - public void testSetMinutes() throws Exception { - Date result = DateUtils.setMinutes(BASE_DATE, 0); - assertNotSame(BASE_DATE, result); - assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); - assertDate(result, 2000, 6, 5, 4, 0, 2, 1); + } finally { + TimeZone.setDefault(defaultZone); + dateTimeParser.setTimeZone(defaultZone); + } - result = DateUtils.setMinutes(BASE_DATE, 59); - assertNotSame(BASE_DATE, result); - assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); - assertDate(result, 2000, 6, 5, 4, 59, 2, 1); - - assertThrows( - IllegalArgumentException.class, - () -> DateUtils.setMinutes(BASE_DATE, 60), - "DateUtils.setMinutes did not throw an expected IllegalArgumentException."); - } - - // ----------------------------------------------------------------------- - @Test - public void testSetSeconds() throws Exception { - Date result = DateUtils.setSeconds(BASE_DATE, 0); - assertNotSame(BASE_DATE, result); - assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); - assertDate(result, 2000, 6, 5, 4, 3, 0, 1); - - result = DateUtils.setSeconds(BASE_DATE, 59); - assertNotSame(BASE_DATE, result); - assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); - assertDate(result, 2000, 6, 5, 4, 3, 59, 1); - - assertThrows( - IllegalArgumentException.class, - () -> DateUtils.setSeconds(BASE_DATE, 60), - "DateUtils.setSeconds did not throw an expected IllegalArgumentException."); - } - - // ----------------------------------------------------------------------- - @Test - public void testSetMilliseconds() throws Exception { - Date result = DateUtils.setMilliseconds(BASE_DATE, 0); - assertNotSame(BASE_DATE, result); - assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); - assertDate(result, 2000, 6, 5, 4, 3, 2, 0); - - result = DateUtils.setMilliseconds(BASE_DATE, 999); - assertNotSame(BASE_DATE, result); - assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); - assertDate(result, 2000, 6, 5, 4, 3, 2, 999); - - assertThrows( - IllegalArgumentException.class, - () -> DateUtils.setMilliseconds(BASE_DATE, 1000), - "DateUtils.setMilliseconds did not throw an expected IllegalArgumentException."); - } - - //----------------------------------------------------------------------- - private void assertDate(final Date date, final int year, final int month, final int day, final int hour, final int min, final int sec, final int mil) { - final GregorianCalendar cal = new GregorianCalendar(); - cal.setTime(date); - assertEquals(year, cal.get(Calendar.YEAR)); - assertEquals(month, cal.get(Calendar.MONTH)); - assertEquals(day, cal.get(Calendar.DAY_OF_MONTH)); - assertEquals(hour, cal.get(Calendar.HOUR_OF_DAY)); - assertEquals(min, cal.get(Calendar.MINUTE)); - assertEquals(sec, cal.get(Calendar.SECOND)); - assertEquals(mil, cal.get(Calendar.MILLISECOND)); + // Bug 31395, large dates + final Date endOfTime = new Date(Long.MAX_VALUE); // fyi: Sun Aug 17 07:12:55 CET 292278994 -- 807 millis + final GregorianCalendar endCal = new GregorianCalendar(); + endCal.setTime(endOfTime); + assertThrows(ArithmeticException.class, () -> DateUtils.ceiling(endCal, Calendar.DATE)); + endCal.set(Calendar.YEAR, 280000001); + assertThrows(ArithmeticException.class, () -> DateUtils.ceiling(endCal, Calendar.DATE)); + endCal.set(Calendar.YEAR, 280000000); + final Calendar cal = DateUtils.ceiling(endCal, Calendar.DATE); + assertEquals(0, cal.get(Calendar.HOUR)); } //----------------------------------------------------------------------- @Test - public void testToCalendar() { - assertEquals(date1, DateUtils.toCalendar(date1).getTime(), "Failed to convert to a Calendar and back"); - assertThrows(NullPointerException.class, () -> DateUtils.toCalendar(null)); + public void testConstructor() { + assertNotNull(new DateUtils()); + final Constructor[] cons = DateUtils.class.getDeclaredConstructors(); + assertEquals(1, cons.length); + assertTrue(Modifier.isPublic(cons[0].getModifiers())); + assertTrue(Modifier.isPublic(DateUtils.class.getModifiers())); + assertFalse(Modifier.isFinal(DateUtils.class.getModifiers())); } //----------------------------------------------------------------------- @Test - public void testToCalendarWithDateNull() { - assertThrows(NullPointerException.class, () -> DateUtils.toCalendar(null, zone)); + public void testIsSameDay_Cal() { + final GregorianCalendar cala = new GregorianCalendar(2004, 6, 9, 13, 45); + final GregorianCalendar calb = new GregorianCalendar(2004, 6, 9, 13, 45); + assertTrue(DateUtils.isSameDay(cala, calb)); + calb.add(Calendar.DAY_OF_YEAR, 1); + assertFalse(DateUtils.isSameDay(cala, calb)); + cala.add(Calendar.DAY_OF_YEAR, 1); + assertTrue(DateUtils.isSameDay(cala, calb)); + calb.add(Calendar.YEAR, 1); + assertFalse(DateUtils.isSameDay(cala, calb)); + } + + @Test + public void testIsSameDay_CalNotNullNull() { + assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameDay(Calendar.getInstance(), null)); + } + + @Test + public void testIsSameDay_CalNullNotNull() { + assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameDay(null, Calendar.getInstance())); + } + + @Test + public void testIsSameDay_CalNullNull() { + assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameDay((Calendar) null, null)); } //----------------------------------------------------------------------- @Test - public void testToCalendarWithTimeZoneNull() { - assertThrows(NullPointerException.class, () -> DateUtils.toCalendar(date1, null)); + public void testIsSameDay_Date() { + Date datea = new GregorianCalendar(2004, 6, 9, 13, 45).getTime(); + Date dateb = new GregorianCalendar(2004, 6, 9, 13, 45).getTime(); + assertTrue(DateUtils.isSameDay(datea, dateb)); + dateb = new GregorianCalendar(2004, 6, 10, 13, 45).getTime(); + assertFalse(DateUtils.isSameDay(datea, dateb)); + datea = new GregorianCalendar(2004, 6, 10, 13, 45).getTime(); + assertTrue(DateUtils.isSameDay(datea, dateb)); + dateb = new GregorianCalendar(2005, 6, 10, 13, 45).getTime(); + assertFalse(DateUtils.isSameDay(datea, dateb)); + } + + @Test + public void testIsSameDay_DateNotNullNull() { + assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameDay(new Date(), null)); + } + + @Test + public void testIsSameDay_DateNullNotNull() { + assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameDay(null, new Date())); + } + + @Test + public void testIsSameDay_DateNullNull() { + assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameDay((Date) null, null)); } //----------------------------------------------------------------------- @Test - public void testToCalendarWithDateAndTimeZoneNotNull() { - final Calendar c = DateUtils.toCalendar(date2, defaultZone); - assertEquals(date2, c.getTime(), "Convert Date and TimeZone to a Calendar, but failed to get the Date back"); - assertEquals(defaultZone, c.getTimeZone(), "Convert Date and TimeZone to a Calendar, but failed to get the TimeZone back"); + public void testIsSameInstant_Cal() { + final GregorianCalendar cala = new GregorianCalendar(TimeZone.getTimeZone("GMT+1")); + final GregorianCalendar calb = new GregorianCalendar(TimeZone.getTimeZone("GMT-1")); + cala.set(2004, Calendar.JULY, 9, 13, 45, 0); + cala.set(Calendar.MILLISECOND, 0); + calb.set(2004, Calendar.JULY, 9, 13, 45, 0); + calb.set(Calendar.MILLISECOND, 0); + assertFalse(DateUtils.isSameInstant(cala, calb)); + + calb.set(2004, Calendar.JULY, 9, 11, 45, 0); + assertTrue(DateUtils.isSameInstant(cala, calb)); + } + + @Test + public void testIsSameInstant_CalNotNullNull() { + assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameInstant(Calendar.getInstance(), null)); + } + + @Test + public void testIsSameInstant_CalNullNotNull() { + assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameInstant(null, Calendar.getInstance())); + } + + @Test + public void testIsSameInstant_CalNullNull() { + assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameInstant((Calendar) null, null)); } //----------------------------------------------------------------------- @Test - public void testToCalendarWithDateAndTimeZoneNull() { - assertThrows(NullPointerException.class, () -> DateUtils.toCalendar(null, null)); + public void testIsSameInstant_Date() { + Date datea = new GregorianCalendar(2004, 6, 9, 13, 45).getTime(); + Date dateb = new GregorianCalendar(2004, 6, 9, 13, 45).getTime(); + assertTrue(DateUtils.isSameInstant(datea, dateb)); + dateb = new GregorianCalendar(2004, 6, 10, 13, 45).getTime(); + assertFalse(DateUtils.isSameInstant(datea, dateb)); + datea = new GregorianCalendar(2004, 6, 10, 13, 45).getTime(); + assertTrue(DateUtils.isSameInstant(datea, dateb)); + dateb = new GregorianCalendar(2005, 6, 10, 13, 45).getTime(); + assertFalse(DateUtils.isSameInstant(datea, dateb)); + } + + @Test + public void testIsSameInstant_DateNotNullNull() { + assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameInstant(new Date(), null)); + } + + @Test + public void testIsSameInstant_DateNullNotNull() { + assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameInstant(null, new Date())); + } + + @Test + public void testIsSameInstant_DateNullNull() { + assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameInstant((Date) null, null)); + } + + //----------------------------------------------------------------------- + @Test + public void testIsSameLocalTime_Cal() { + final GregorianCalendar cala = new GregorianCalendar(TimeZone.getTimeZone("GMT+1")); + final GregorianCalendar calb = new GregorianCalendar(TimeZone.getTimeZone("GMT-1")); + cala.set(2004, Calendar.JULY, 9, 13, 45, 0); + cala.set(Calendar.MILLISECOND, 0); + calb.set(2004, Calendar.JULY, 9, 13, 45, 0); + calb.set(Calendar.MILLISECOND, 0); + assertTrue(DateUtils.isSameLocalTime(cala, calb)); + + final Calendar calc = Calendar.getInstance(); + final Calendar cald = Calendar.getInstance(); + calc.set(2004, Calendar.JULY, 9, 4, 0, 0); + cald.set(2004, Calendar.JULY, 9, 16, 0, 0); + calc.set(Calendar.MILLISECOND, 0); + cald.set(Calendar.MILLISECOND, 0); + assertFalse(DateUtils.isSameLocalTime(calc, cald), "LANG-677"); + + calb.set(2004, Calendar.JULY, 9, 11, 45, 0); + assertFalse(DateUtils.isSameLocalTime(cala, calb)); + } + + @Test + public void testIsSameLocalTime_CalNotNullNull() { + assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameLocalTime(Calendar.getInstance(), null)); + } + + @Test + public void testIsSameLocalTime_CalNullNotNull() { + assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameLocalTime(null, Calendar.getInstance())); + } + + @Test + public void testIsSameLocalTime_CalNullNull() { + assertThrows(IllegalArgumentException.class, () -> DateUtils.isSameLocalTime(null, null)); + } + + /** + * Tests the iterator exceptions + */ + @Test + public void testIteratorEx() { + assertThrows(IllegalArgumentException.class, () -> DateUtils.iterator(Calendar.getInstance(), -9999)); + assertThrows + (NullPointerException.class, () -> DateUtils.iterator((Date) null, DateUtils.RANGE_WEEK_CENTER)); + assertThrows + (IllegalArgumentException.class, () -> DateUtils.iterator((Calendar) null, DateUtils.RANGE_WEEK_CENTER)); + assertThrows + (IllegalArgumentException.class, () -> DateUtils.iterator((Object) null, DateUtils.RANGE_WEEK_CENTER)); + assertThrows(ClassCastException.class, () -> DateUtils.iterator("", DateUtils.RANGE_WEEK_CENTER)); + } + + // https://issues.apache.org/jira/browse/LANG-530 + @SuppressWarnings("deprecation") + @Test + public void testLang530() throws ParseException { + final Date d = new Date(); + final String isoDateStr = DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(d); + final Date d2 = DateUtils.parseDate(isoDateStr, DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern()); + // the format loses milliseconds so have to reintroduce them + assertEquals(d.getTime(), d2.getTime() + d.getTime() % 1000, "Date not equal to itself ISO formatted and parsed"); + } + + @Test + public void testLANG799() throws ParseException { + DateUtils.parseDateStrictly("09 abril 2008 23:55:38 GMT", new Locale("es"), "dd MMM yyyy HH:mm:ss zzz"); + } + + // Parse English date with German Locale + @DefaultLocale(language = "de") + @Test + public void testLANG799_DE_FAIL() { + assertThrows(ParseException.class, () -> DateUtils.parseDate("Wed, 09 Apr 2008 23:55:38 GMT", "EEE, dd MMM yyyy HH:mm:ss zzz")); + } + + @DefaultLocale(language = "de") + @Test + public void testLANG799_DE_OK() throws ParseException { + DateUtils.parseDate("Mi, 09 Apr 2008 23:55:38 GMT", "EEE, dd MMM yyyy HH:mm:ss zzz"); + DateUtils.parseDateStrictly("Mi, 09 Apr 2008 23:55:38 GMT", "EEE, dd MMM yyyy HH:mm:ss zzz"); + } + + // Parse German date with English Locale + @DefaultLocale(language = "en") + @Test + public void testLANG799_EN_FAIL() { + assertThrows(ParseException.class, () -> DateUtils.parseDate("Mi, 09 Apr 2008 23:55:38 GMT", "EEE, dd MMM yyyy HH:mm:ss zzz")); + } + + @DefaultLocale(language = "en") + @Test + public void testLANG799_EN_OK() throws ParseException { + DateUtils.parseDate("Wed, 09 Apr 2008 23:55:38 GMT", "EEE, dd MMM yyyy HH:mm:ss zzz"); + DateUtils.parseDateStrictly("Wed, 09 Apr 2008 23:55:38 GMT", "EEE, dd MMM yyyy HH:mm:ss zzz"); + } + + // Parse German date with English Locale, specifying German Locale override + @DefaultLocale(language = "en") + @Test + public void testLANG799_EN_WITH_DE_LOCALE() throws ParseException { + DateUtils.parseDate("Mi, 09 Apr 2008 23:55:38 GMT", Locale.GERMAN, "EEE, dd MMM yyyy HH:mm:ss zzz"); + } + + /** + * Tests the calendar iterator for month-based ranges + * + * @throws java.lang.Exception so we don't have to catch it + */ + @Test + public void testMonthIterator() throws Exception { + Iterator it = DateUtils.iterator(date1, DateUtils.RANGE_MONTH_SUNDAY); + assertWeekIterator(it, + dateParser.parse("January 27, 2002"), + dateParser.parse("March 2, 2002")); + + it = DateUtils.iterator(date1, DateUtils.RANGE_MONTH_MONDAY); + assertWeekIterator(it, + dateParser.parse("January 28, 2002"), + dateParser.parse("March 3, 2002")); + + it = DateUtils.iterator(date2, DateUtils.RANGE_MONTH_SUNDAY); + assertWeekIterator(it, + dateParser.parse("October 28, 2001"), + dateParser.parse("December 1, 2001")); + + it = DateUtils.iterator(date2, DateUtils.RANGE_MONTH_MONDAY); + assertWeekIterator(it, + dateParser.parse("October 29, 2001"), + dateParser.parse("December 2, 2001")); + } + + @Test + public void testParse_EmptyParsers() { + assertThrows(ParseException.class, () -> DateUtils.parseDate("19721203")); + } + + @Test + public void testParse_NullParsers() { + assertThrows(IllegalArgumentException.class, () -> DateUtils.parseDate("19721203", (String[]) null)); + } + + //----------------------------------------------------------------------- + @Test + public void testParseDate() throws Exception { + final GregorianCalendar cal = new GregorianCalendar(1972, 11, 3); + String dateStr = "1972-12-03"; + final String[] parsers = new String[] {"yyyy'-'DDD", "yyyy'-'MM'-'dd", "yyyyMMdd"}; + Date date = DateUtils.parseDate(dateStr, parsers); + assertEquals(cal.getTime(), date); + + dateStr = "1972-338"; + date = DateUtils.parseDate(dateStr, parsers); + assertEquals(cal.getTime(), date); + + dateStr = "19721203"; + date = DateUtils.parseDate(dateStr, parsers); + assertEquals(cal.getTime(), date); + } + + @Test + public void testParseDate_InvalidDateString() { + final String[] parsers = new String[] {"yyyy'-'DDD", "yyyy'-'MM'-'dd", "yyyyMMdd"}; + assertThrows(ParseException.class, () -> DateUtils.parseDate("197212AB", parsers)); + } + + @Test + public void testParseDate_NoDateString() { + final String[] parsers = new String[] {"yyyy'-'DDD", "yyyy'-'MM'-'dd", "yyyyMMdd"}; + assertThrows(ParseException.class, () -> DateUtils.parseDate("PURPLE", parsers)); + } + + @Test + public void testParseDate_Null() { + final String[] parsers = new String[] {"yyyy'-'DDD", "yyyy'-'MM'-'dd", "yyyyMMdd"}; + assertThrows(IllegalArgumentException.class, () -> DateUtils.parseDate(null, parsers)); + } + + // LANG-486 + @Test + public void testParseDateWithLeniency() throws Exception { + final GregorianCalendar cal = new GregorianCalendar(1998, 6, 30); + final String dateStr = "02 942, 1996"; + final String[] parsers = new String[] {"MM DDD, yyyy"}; + + final Date date = DateUtils.parseDate(dateStr, parsers); + assertEquals(cal.getTime(), date); + + assertThrows(ParseException.class, () -> DateUtils.parseDateStrictly(dateStr, parsers)); } //----------------------------------------------------------------------- @@ -972,6 +1189,172 @@ public void testRoundLang346() throws Exception { "Hour Round Up Failed"); } + // ----------------------------------------------------------------------- + @Test + public void testSetDays() throws Exception { + Date result = DateUtils.setDays(BASE_DATE, 1); + assertNotSame(BASE_DATE, result); + assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); + assertDate(result, 2000, 6, 1, 4, 3, 2, 1); + + result = DateUtils.setDays(BASE_DATE, 29); + assertNotSame(BASE_DATE, result); + assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); + assertDate(result, 2000, 6, 29, 4, 3, 2, 1); + + assertThrows( + IllegalArgumentException.class, + () -> DateUtils.setDays(BASE_DATE, 32), + "DateUtils.setDays did not throw an expected IllegalArgumentException."); + } + + // ----------------------------------------------------------------------- + @Test + public void testSetHours() throws Exception { + Date result = DateUtils.setHours(BASE_DATE, 0); + assertNotSame(BASE_DATE, result); + assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); + assertDate(result, 2000, 6, 5, 0, 3, 2, 1); + + result = DateUtils.setHours(BASE_DATE, 23); + assertNotSame(BASE_DATE, result); + assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); + assertDate(result, 2000, 6, 5, 23, 3, 2, 1); + + assertThrows( + IllegalArgumentException.class, + () -> DateUtils.setHours(BASE_DATE, 24), + "DateUtils.setHours did not throw an expected IllegalArgumentException."); + } + + // ----------------------------------------------------------------------- + @Test + public void testSetMilliseconds() throws Exception { + Date result = DateUtils.setMilliseconds(BASE_DATE, 0); + assertNotSame(BASE_DATE, result); + assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); + assertDate(result, 2000, 6, 5, 4, 3, 2, 0); + + result = DateUtils.setMilliseconds(BASE_DATE, 999); + assertNotSame(BASE_DATE, result); + assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); + assertDate(result, 2000, 6, 5, 4, 3, 2, 999); + + assertThrows( + IllegalArgumentException.class, + () -> DateUtils.setMilliseconds(BASE_DATE, 1000), + "DateUtils.setMilliseconds did not throw an expected IllegalArgumentException."); + } + + // ----------------------------------------------------------------------- + @Test + public void testSetMinutes() throws Exception { + Date result = DateUtils.setMinutes(BASE_DATE, 0); + assertNotSame(BASE_DATE, result); + assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); + assertDate(result, 2000, 6, 5, 4, 0, 2, 1); + + result = DateUtils.setMinutes(BASE_DATE, 59); + assertNotSame(BASE_DATE, result); + assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); + assertDate(result, 2000, 6, 5, 4, 59, 2, 1); + + assertThrows( + IllegalArgumentException.class, + () -> DateUtils.setMinutes(BASE_DATE, 60), + "DateUtils.setMinutes did not throw an expected IllegalArgumentException."); + } + + // ----------------------------------------------------------------------- + @Test + public void testSetMonths() throws Exception { + Date result = DateUtils.setMonths(BASE_DATE, 5); + assertNotSame(BASE_DATE, result); + assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); + assertDate(result, 2000, 5, 5, 4, 3, 2, 1); + + result = DateUtils.setMonths(BASE_DATE, 1); + assertNotSame(BASE_DATE, result); + assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); + assertDate(result, 2000, 1, 5, 4, 3, 2, 1); + + assertThrows( + IllegalArgumentException.class, + () -> DateUtils.setMonths(BASE_DATE, 12), + "DateUtils.setMonths did not throw an expected IllegalArgumentException."); + } + + // ----------------------------------------------------------------------- + @Test + public void testSetSeconds() throws Exception { + Date result = DateUtils.setSeconds(BASE_DATE, 0); + assertNotSame(BASE_DATE, result); + assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); + assertDate(result, 2000, 6, 5, 4, 3, 0, 1); + + result = DateUtils.setSeconds(BASE_DATE, 59); + assertNotSame(BASE_DATE, result); + assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); + assertDate(result, 2000, 6, 5, 4, 3, 59, 1); + + assertThrows( + IllegalArgumentException.class, + () -> DateUtils.setSeconds(BASE_DATE, 60), + "DateUtils.setSeconds did not throw an expected IllegalArgumentException."); + } + + // ----------------------------------------------------------------------- + @Test + public void testSetYears() throws Exception { + Date result = DateUtils.setYears(BASE_DATE, 2000); + assertNotSame(BASE_DATE, result); + assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); + assertDate(result, 2000, 6, 5, 4, 3, 2, 1); + + result = DateUtils.setYears(BASE_DATE, 2008); + assertNotSame(BASE_DATE, result); + assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); + assertDate(result, 2008, 6, 5, 4, 3, 2, 1); + + result = DateUtils.setYears(BASE_DATE, 2005); + assertNotSame(BASE_DATE, result); + assertDate(BASE_DATE, 2000, 6, 5, 4, 3, 2, 1); + assertDate(result, 2005, 6, 5, 4, 3, 2, 1); + } + + //----------------------------------------------------------------------- + @Test + public void testToCalendar() { + assertEquals(date1, DateUtils.toCalendar(date1).getTime(), "Failed to convert to a Calendar and back"); + assertThrows(NullPointerException.class, () -> DateUtils.toCalendar(null)); + } + + //----------------------------------------------------------------------- + @Test + public void testToCalendarWithDateAndTimeZoneNotNull() { + final Calendar c = DateUtils.toCalendar(date2, defaultZone); + assertEquals(date2, c.getTime(), "Convert Date and TimeZone to a Calendar, but failed to get the Date back"); + assertEquals(defaultZone, c.getTimeZone(), "Convert Date and TimeZone to a Calendar, but failed to get the TimeZone back"); + } + + //----------------------------------------------------------------------- + @Test + public void testToCalendarWithDateAndTimeZoneNull() { + assertThrows(NullPointerException.class, () -> DateUtils.toCalendar(null, null)); + } + + //----------------------------------------------------------------------- + @Test + public void testToCalendarWithDateNull() { + assertThrows(NullPointerException.class, () -> DateUtils.toCalendar(null, zone)); + } + + //----------------------------------------------------------------------- + @Test + public void testToCalendarWithTimeZoneNull() { + assertThrows(NullPointerException.class, () -> DateUtils.toCalendar(date1, null)); + } + /** * Tests various values with the trunc method * @@ -1227,262 +1610,6 @@ public void testTruncateLang59() { } } - // https://issues.apache.org/jira/browse/LANG-530 - @SuppressWarnings("deprecation") - @Test - public void testLang530() throws ParseException { - final Date d = new Date(); - final String isoDateStr = DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(d); - final Date d2 = DateUtils.parseDate(isoDateStr, DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern()); - // the format loses milliseconds so have to reintroduce them - assertEquals(d.getTime(), d2.getTime() + d.getTime() % 1000, "Date not equal to itself ISO formatted and parsed"); - } - - /** - * Tests various values with the ceiling method - * - * @throws java.lang.Exception so we don't have to catch it - */ - @Test - public void testCeil() throws Exception { - // test javadoc - assertEquals(dateTimeParser.parse("March 28, 2002 14:00:00.000"), - DateUtils.ceiling( - dateTimeParser.parse("March 28, 2002 13:45:01.231"), - Calendar.HOUR), - "ceiling javadoc-1 failed"); - assertEquals(dateTimeParser.parse("April 1, 2002 00:00:00.000"), - DateUtils.ceiling( - dateTimeParser.parse("March 28, 2002 13:45:01.231"), - Calendar.MONTH), - "ceiling javadoc-2 failed"); - - // tests public static Date ceiling(Date date, int field) - assertEquals(dateParser.parse("January 1, 2003"), - DateUtils.ceiling(date1, Calendar.YEAR), - "ceiling year-1 failed"); - assertEquals(dateParser.parse("January 1, 2002"), - DateUtils.ceiling(date2, Calendar.YEAR), - "ceiling year-2 failed"); - assertEquals(dateParser.parse("March 1, 2002"), - DateUtils.ceiling(date1, Calendar.MONTH), - "ceiling month-1 failed"); - assertEquals(dateParser.parse("December 1, 2001"), - DateUtils.ceiling(date2, Calendar.MONTH), - "ceiling month-2 failed"); - assertEquals(dateParser.parse("February 16, 2002"), - DateUtils.ceiling(date1, DateUtils.SEMI_MONTH), - "ceiling semimonth-1 failed"); - assertEquals(dateParser.parse("December 1, 2001"), - DateUtils.ceiling(date2, DateUtils.SEMI_MONTH), - "ceiling semimonth-2 failed"); - assertEquals(dateParser.parse("February 13, 2002"), - DateUtils.ceiling(date1, Calendar.DATE), - "ceiling date-1 failed"); - assertEquals(dateParser.parse("November 19, 2001"), - DateUtils.ceiling(date2, Calendar.DATE), - "ceiling date-2 failed"); - assertEquals(dateTimeParser.parse("February 12, 2002 13:00:00.000"), - DateUtils.ceiling(date1, Calendar.HOUR), - "ceiling hour-1 failed"); - assertEquals(dateTimeParser.parse("November 18, 2001 2:00:00.000"), - DateUtils.ceiling(date2, Calendar.HOUR), - "ceiling hour-2 failed"); - assertEquals(dateTimeParser.parse("February 12, 2002 12:35:00.000"), - DateUtils.ceiling(date1, Calendar.MINUTE), - "ceiling minute-1 failed"); - assertEquals(dateTimeParser.parse("November 18, 2001 1:24:00.000"), - DateUtils.ceiling(date2, Calendar.MINUTE), - "ceiling minute-2 failed"); - assertEquals(dateTimeParser.parse("February 12, 2002 12:34:57.000"), - DateUtils.ceiling(date1, Calendar.SECOND), - "ceiling second-1 failed"); - assertEquals(dateTimeParser.parse("November 18, 2001 1:23:12.000"), - DateUtils.ceiling(date2, Calendar.SECOND), - "ceiling second-2 failed"); - assertEquals(dateTimeParser.parse("February 3, 2002 12:00:00.000"), - DateUtils.ceiling(dateAmPm1, Calendar.AM_PM), - "ceiling ampm-1 failed"); - assertEquals(dateTimeParser.parse("February 3, 2002 12:00:00.000"), - DateUtils.ceiling(dateAmPm2, Calendar.AM_PM), - "ceiling ampm-2 failed"); - assertEquals(dateTimeParser.parse("February 4, 2002 00:00:00.000"), - DateUtils.ceiling(dateAmPm3, Calendar.AM_PM), - "ceiling ampm-3 failed"); - assertEquals(dateTimeParser.parse("February 4, 2002 00:00:00.000"), - DateUtils.ceiling(dateAmPm4, Calendar.AM_PM), - "ceiling ampm-4 failed"); - - // tests public static Date ceiling(Object date, int field) - assertEquals(dateParser.parse("January 1, 2003"), - DateUtils.ceiling((Object) date1, Calendar.YEAR), - "ceiling year-1 failed"); - assertEquals(dateParser.parse("January 1, 2002"), - DateUtils.ceiling((Object) date2, Calendar.YEAR), - "ceiling year-2 failed"); - assertEquals(dateParser.parse("March 1, 2002"), - DateUtils.ceiling((Object) date1, Calendar.MONTH), - "ceiling month-1 failed"); - assertEquals(dateParser.parse("December 1, 2001"), - DateUtils.ceiling((Object) date2, Calendar.MONTH), - "ceiling month-2 failed"); - assertEquals(dateParser.parse("February 16, 2002"), - DateUtils.ceiling((Object) date1, DateUtils.SEMI_MONTH), - "ceiling semimonth-1 failed"); - assertEquals(dateParser.parse("December 1, 2001"), - DateUtils.ceiling((Object) date2, DateUtils.SEMI_MONTH), - "ceiling semimonth-2 failed"); - assertEquals(dateParser.parse("February 13, 2002"), - DateUtils.ceiling((Object) date1, Calendar.DATE), - "ceiling date-1 failed"); - assertEquals(dateParser.parse("November 19, 2001"), - DateUtils.ceiling((Object) date2, Calendar.DATE), - "ceiling date-2 failed"); - assertEquals(dateTimeParser.parse("February 12, 2002 13:00:00.000"), - DateUtils.ceiling((Object) date1, Calendar.HOUR), - "ceiling hour-1 failed"); - assertEquals(dateTimeParser.parse("November 18, 2001 2:00:00.000"), - DateUtils.ceiling((Object) date2, Calendar.HOUR), - "ceiling hour-2 failed"); - assertEquals(dateTimeParser.parse("February 12, 2002 12:35:00.000"), - DateUtils.ceiling((Object) date1, Calendar.MINUTE), - "ceiling minute-1 failed"); - assertEquals(dateTimeParser.parse("November 18, 2001 1:24:00.000"), - DateUtils.ceiling((Object) date2, Calendar.MINUTE), - "ceiling minute-2 failed"); - assertEquals(dateTimeParser.parse("February 12, 2002 12:34:57.000"), - DateUtils.ceiling((Object) date1, Calendar.SECOND), - "ceiling second-1 failed"); - assertEquals(dateTimeParser.parse("November 18, 2001 1:23:12.000"), - DateUtils.ceiling((Object) date2, Calendar.SECOND), - "ceiling second-2 failed"); - assertEquals(dateTimeParser.parse("February 3, 2002 12:00:00.000"), - DateUtils.ceiling((Object) dateAmPm1, Calendar.AM_PM), - "ceiling ampm-1 failed"); - assertEquals(dateTimeParser.parse("February 3, 2002 12:00:00.000"), - DateUtils.ceiling((Object) dateAmPm2, Calendar.AM_PM), - "ceiling ampm-2 failed"); - assertEquals(dateTimeParser.parse("February 4, 2002 00:00:00.000"), - DateUtils.ceiling((Object) dateAmPm3, Calendar.AM_PM), - "ceiling ampm-3 failed"); - assertEquals(dateTimeParser.parse("February 4, 2002 00:00:00.000"), - DateUtils.ceiling((Object) dateAmPm4, Calendar.AM_PM), - "ceiling ampm-4 failed"); - - assertEquals(dateTimeParser.parse("February 12, 2002 12:34:57.000"), - DateUtils.ceiling((Object) cal1, Calendar.SECOND), - "ceiling calendar second-1 failed"); - assertEquals(dateTimeParser.parse("November 18, 2001 1:23:12.000"), - DateUtils.ceiling((Object) cal2, Calendar.SECOND), - "ceiling calendar second-2 failed"); - - assertEquals(dateTimeParser.parse("February 3, 2002 12:00:00.000"), - DateUtils.ceiling((Object) calAmPm1, Calendar.AM_PM), - "ceiling ampm-1 failed"); - assertEquals(dateTimeParser.parse("February 3, 2002 12:00:00.000"), - DateUtils.ceiling((Object) calAmPm2, Calendar.AM_PM), - "ceiling ampm-2 failed"); - assertEquals(dateTimeParser.parse("February 4, 2002 00:00:00.000"), - DateUtils.ceiling((Object) calAmPm3, Calendar.AM_PM), - "ceiling ampm-3 failed"); - assertEquals(dateTimeParser.parse("February 4, 2002 00:00:00.000"), - DateUtils.ceiling((Object) calAmPm4, Calendar.AM_PM), - "ceiling ampm-4 failed"); - - assertThrows(NullPointerException.class, () -> DateUtils.ceiling((Date) null, Calendar.SECOND)); - assertThrows(IllegalArgumentException.class, () -> DateUtils.ceiling((Calendar) null, Calendar.SECOND)); - assertThrows(IllegalArgumentException.class, () -> DateUtils.ceiling((Object) null, Calendar.SECOND)); - assertThrows(ClassCastException.class, () -> DateUtils.ceiling("", Calendar.SECOND)); - assertThrows(IllegalArgumentException.class, () -> DateUtils.ceiling(date1, -9999)); - - // Fix for https://issues.apache.org/bugzilla/show_bug.cgi?id=25560 - // Test ceiling across the beginning of daylight saving time - try { - TimeZone.setDefault(zone); - dateTimeParser.setTimeZone(zone); - - assertEquals(dateTimeParser.parse("March 31, 2003 00:00:00.000"), - DateUtils.ceiling(date4, Calendar.DATE), - "ceiling MET date across DST change-over"); - assertEquals(dateTimeParser.parse("March 31, 2003 00:00:00.000"), - DateUtils.ceiling((Object) cal4, Calendar.DATE), - "ceiling MET date across DST change-over"); - assertEquals(dateTimeParser.parse("March 31, 2003 00:00:00.000"), - DateUtils.ceiling(date5, Calendar.DATE), - "ceiling MET date across DST change-over"); - assertEquals(dateTimeParser.parse("March 31, 2003 00:00:00.000"), - DateUtils.ceiling((Object) cal5, Calendar.DATE), - "ceiling MET date across DST change-over"); - assertEquals(dateTimeParser.parse("March 31, 2003 00:00:00.000"), - DateUtils.ceiling(date6, Calendar.DATE), - "ceiling MET date across DST change-over"); - assertEquals(dateTimeParser.parse("March 31, 2003 00:00:00.000"), - DateUtils.ceiling((Object) cal6, Calendar.DATE), - "ceiling MET date across DST change-over"); - assertEquals(dateTimeParser.parse("March 31, 2003 00:00:00.000"), - DateUtils.ceiling(date7, Calendar.DATE), - "ceiling MET date across DST change-over"); - assertEquals(dateTimeParser.parse("March 31, 2003 00:00:00.000"), - DateUtils.ceiling((Object) cal7, Calendar.DATE), - "ceiling MET date across DST change-over"); - - assertEquals(dateTimeParser.parse("March 30, 2003 03:00:00.000"), - DateUtils.ceiling(date4, Calendar.HOUR_OF_DAY), - "ceiling MET date across DST change-over"); - assertEquals(dateTimeParser.parse("March 30, 2003 03:00:00.000"), - DateUtils.ceiling((Object) cal4, Calendar.HOUR_OF_DAY), - "ceiling MET date across DST change-over"); - assertEquals(dateTimeParser.parse("March 30, 2003 03:00:00.000"), - DateUtils.ceiling(date5, Calendar.HOUR_OF_DAY), - "ceiling MET date across DST change-over"); - assertEquals(dateTimeParser.parse("March 30, 2003 03:00:00.000"), - DateUtils.ceiling((Object) cal5, Calendar.HOUR_OF_DAY), - "ceiling MET date across DST change-over"); - assertEquals(dateTimeParser.parse("March 30, 2003 04:00:00.000"), - DateUtils.ceiling(date6, Calendar.HOUR_OF_DAY), - "ceiling MET date across DST change-over"); - assertEquals(dateTimeParser.parse("March 30, 2003 04:00:00.000"), - DateUtils.ceiling((Object) cal6, Calendar.HOUR_OF_DAY), - "ceiling MET date across DST change-over"); - assertEquals(dateTimeParser.parse("March 30, 2003 04:00:00.000"), - DateUtils.ceiling(date7, Calendar.HOUR_OF_DAY), - "ceiling MET date across DST change-over"); - assertEquals(dateTimeParser.parse("March 30, 2003 04:00:00.000"), - DateUtils.ceiling((Object) cal7, Calendar.HOUR_OF_DAY), - "ceiling MET date across DST change-over"); - - } finally { - TimeZone.setDefault(defaultZone); - dateTimeParser.setTimeZone(defaultZone); - } - - // Bug 31395, large dates - final Date endOfTime = new Date(Long.MAX_VALUE); // fyi: Sun Aug 17 07:12:55 CET 292278994 -- 807 millis - final GregorianCalendar endCal = new GregorianCalendar(); - endCal.setTime(endOfTime); - assertThrows(ArithmeticException.class, () -> DateUtils.ceiling(endCal, Calendar.DATE)); - endCal.set(Calendar.YEAR, 280000001); - assertThrows(ArithmeticException.class, () -> DateUtils.ceiling(endCal, Calendar.DATE)); - endCal.set(Calendar.YEAR, 280000000); - final Calendar cal = DateUtils.ceiling(endCal, Calendar.DATE); - assertEquals(0, cal.get(Calendar.HOUR)); - } - - /** - * Tests the iterator exceptions - */ - @Test - public void testIteratorEx() { - assertThrows(IllegalArgumentException.class, () -> DateUtils.iterator(Calendar.getInstance(), -9999)); - assertThrows - (NullPointerException.class, () -> DateUtils.iterator((Date) null, DateUtils.RANGE_WEEK_CENTER)); - assertThrows - (IllegalArgumentException.class, () -> DateUtils.iterator((Calendar) null, DateUtils.RANGE_WEEK_CENTER)); - assertThrows - (IllegalArgumentException.class, () -> DateUtils.iterator((Object) null, DateUtils.RANGE_WEEK_CENTER)); - assertThrows(ClassCastException.class, () -> DateUtils.iterator("", DateUtils.RANGE_WEEK_CENTER)); - } - /** * Tests the calendar iterator for week ranges */ @@ -1524,132 +1651,5 @@ public void testWeekIterator() { now.add(Calendar.DATE, 1); } } - - /** - * Tests the calendar iterator for month-based ranges - * - * @throws java.lang.Exception so we don't have to catch it - */ - @Test - public void testMonthIterator() throws Exception { - Iterator it = DateUtils.iterator(date1, DateUtils.RANGE_MONTH_SUNDAY); - assertWeekIterator(it, - dateParser.parse("January 27, 2002"), - dateParser.parse("March 2, 2002")); - - it = DateUtils.iterator(date1, DateUtils.RANGE_MONTH_MONDAY); - assertWeekIterator(it, - dateParser.parse("January 28, 2002"), - dateParser.parse("March 3, 2002")); - - it = DateUtils.iterator(date2, DateUtils.RANGE_MONTH_SUNDAY); - assertWeekIterator(it, - dateParser.parse("October 28, 2001"), - dateParser.parse("December 1, 2001")); - - it = DateUtils.iterator(date2, DateUtils.RANGE_MONTH_MONDAY); - assertWeekIterator(it, - dateParser.parse("October 29, 2001"), - dateParser.parse("December 2, 2001")); - } - - @DefaultLocale(language = "en") - @Test - public void testLANG799_EN_OK() throws ParseException { - DateUtils.parseDate("Wed, 09 Apr 2008 23:55:38 GMT", "EEE, dd MMM yyyy HH:mm:ss zzz"); - DateUtils.parseDateStrictly("Wed, 09 Apr 2008 23:55:38 GMT", "EEE, dd MMM yyyy HH:mm:ss zzz"); - } - - // Parse German date with English Locale - @DefaultLocale(language = "en") - @Test - public void testLANG799_EN_FAIL() { - assertThrows(ParseException.class, () -> DateUtils.parseDate("Mi, 09 Apr 2008 23:55:38 GMT", "EEE, dd MMM yyyy HH:mm:ss zzz")); - } - - @DefaultLocale(language = "de") - @Test - public void testLANG799_DE_OK() throws ParseException { - DateUtils.parseDate("Mi, 09 Apr 2008 23:55:38 GMT", "EEE, dd MMM yyyy HH:mm:ss zzz"); - DateUtils.parseDateStrictly("Mi, 09 Apr 2008 23:55:38 GMT", "EEE, dd MMM yyyy HH:mm:ss zzz"); - } - - // Parse English date with German Locale - @DefaultLocale(language = "de") - @Test - public void testLANG799_DE_FAIL() { - assertThrows(ParseException.class, () -> DateUtils.parseDate("Wed, 09 Apr 2008 23:55:38 GMT", "EEE, dd MMM yyyy HH:mm:ss zzz")); - } - - // Parse German date with English Locale, specifying German Locale override - @DefaultLocale(language = "en") - @Test - public void testLANG799_EN_WITH_DE_LOCALE() throws ParseException { - DateUtils.parseDate("Mi, 09 Apr 2008 23:55:38 GMT", Locale.GERMAN, "EEE, dd MMM yyyy HH:mm:ss zzz"); - } - - /** - * This checks that this is a 7 element iterator of Calendar objects - * that are dates (no time), and exactly 1 day spaced after each other. - */ - private static void assertWeekIterator(final Iterator it, final Calendar start) { - final Calendar end = (Calendar) start.clone(); - end.add(Calendar.DATE, 6); - - assertWeekIterator(it, start, end); - } - - /** - * Convenience method for when working with Date objects - */ - private static void assertWeekIterator(final Iterator it, final Date start, final Date end) { - final Calendar calStart = Calendar.getInstance(); - calStart.setTime(start); - final Calendar calEnd = Calendar.getInstance(); - calEnd.setTime(end); - - assertWeekIterator(it, calStart, calEnd); - } - - /** - * This checks that this is a 7 divisble iterator of Calendar objects - * that are dates (no time), and exactly 1 day spaced after each other - * (in addition to the proper start and stop dates) - */ - private static void assertWeekIterator(final Iterator it, final Calendar start, final Calendar end) { - Calendar cal = (Calendar) it.next(); - assertCalendarsEquals("", start, cal, 0); - Calendar last = null; - int count = 1; - while (it.hasNext()) { - //Check this is just a date (no time component) - assertCalendarsEquals("", cal, DateUtils.truncate(cal, Calendar.DATE), 0); - - last = cal; - cal = (Calendar) it.next(); - count++; - - //Check that this is one day more than the last date - last.add(Calendar.DATE, 1); - assertCalendarsEquals("", last, cal, 0); - } - - assertFalse(count % 7 != 0, "There were " + count + " days in this iterator"); - assertCalendarsEquals("", end, cal, 0); - } - - /** - * Used to check that Calendar objects are close enough - * delta is in milliseconds - */ - private static void assertCalendarsEquals(final String message, final Calendar cal1, final Calendar cal2, final long delta) { - assertFalse(Math.abs(cal1.getTime().getTime() - cal2.getTime().getTime()) > delta, - message + " expected " + cal1.getTime() + " but got " + cal2.getTime()); - } - - @Test - public void testLANG799() throws ParseException { - DateUtils.parseDateStrictly("09 abril 2008 23:55:38 GMT", new Locale("es"), "dd MMM yyyy HH:mm:ss zzz"); - } } diff --git a/src/test/java/org/apache/commons/lang3/time/DurationFormatUtilsTest.java b/src/test/java/org/apache/commons/lang3/time/DurationFormatUtilsTest.java index 6c1b2f1ba..f29ba6388 100644 --- a/src/test/java/org/apache/commons/lang3/time/DurationFormatUtilsTest.java +++ b/src/test/java/org/apache/commons/lang3/time/DurationFormatUtilsTest.java @@ -37,6 +37,52 @@ */ public class DurationFormatUtilsTest { + private static final int FOUR_YEARS = 365 * 3 + 366; + + private void assertEqualDuration(final String expected, final int[] start, final int[] end, final String format) { + assertEqualDuration(null, expected, start, end, format); + } + + private void assertEqualDuration(final String message, final String expected, final int[] start, final int[] end, final String format) { + final Calendar cal1 = Calendar.getInstance(); + cal1.set(start[0], start[1], start[2], start[3], start[4], start[5]); + cal1.set(Calendar.MILLISECOND, 0); + final Calendar cal2 = Calendar.getInstance(); + cal2.set(end[0], end[1], end[2], end[3], end[4], end[5]); + cal2.set(Calendar.MILLISECOND, 0); + final long milli1 = cal1.getTime().getTime(); + final long milli2 = cal2.getTime().getTime(); + final String result = DurationFormatUtils.formatPeriod(milli1, milli2, format); + if (message == null) { + assertEquals(expected, result); + } else { + assertEquals(expected, result, message); + } + } + + private void bruteForce(final int year, final int month, final int day, final String format, final int calendarType) { + final String msg = year + "-" + month + "-" + day + " to "; + final Calendar c = Calendar.getInstance(); + c.set(year, month, day, 0, 0, 0); + final int[] array1 = new int[] { year, month, day, 0, 0, 0 }; + final int[] array2 = new int[] { year, month, day, 0, 0, 0 }; + for (int i=0; i < FOUR_YEARS; i++) { + array2[0] = c.get(Calendar.YEAR); + array2[1] = c.get(Calendar.MONTH); + array2[2] = c.get(Calendar.DAY_OF_MONTH); + final String tmpMsg = msg + array2[0] + "-" + array2[1] + "-" + array2[2] + " at "; + assertEqualDuration( tmpMsg + i, Integer.toString(i), array1, array2, format ); + c.add(calendarType, 1); + } + } + + // https://issues.apache.org/bugzilla/show_bug.cgi?id=38401 + @Test + public void testBugzilla38401() { + assertEqualDuration( "0000/00/30 16:00:00 000", new int[] { 2006, 0, 26, 18, 47, 34 }, + new int[] { 2006, 1, 26, 10, 47, 34 }, "yyyy/MM/dd HH:mm:ss SSS"); + } + // ----------------------------------------------------------------------- @Test public void testConstructor() { @@ -48,404 +94,16 @@ public void testConstructor() { assertFalse(Modifier.isFinal(DurationFormatUtils.class.getModifiers())); } - // ----------------------------------------------------------------------- @Test - public void testFormatDurationWords() { - String text; + public void testDurationsByBruteForce() { + bruteForce(2006, 0, 1, "d", Calendar.DAY_OF_MONTH); + bruteForce(2006, 0, 2, "d", Calendar.DAY_OF_MONTH); + bruteForce(2007, 1, 2, "d", Calendar.DAY_OF_MONTH); + bruteForce(2004, 1, 29, "d", Calendar.DAY_OF_MONTH); + bruteForce(1996, 1, 29, "d", Calendar.DAY_OF_MONTH); - text = DurationFormatUtils.formatDurationWords(50 * 1000, true, false); - assertEquals("50 seconds", text); - text = DurationFormatUtils.formatDurationWords(65 * 1000, true, false); - assertEquals("1 minute 5 seconds", text); - text = DurationFormatUtils.formatDurationWords(120 * 1000, true, false); - assertEquals("2 minutes 0 seconds", text); - text = DurationFormatUtils.formatDurationWords(121 * 1000, true, false); - assertEquals("2 minutes 1 second", text); - text = DurationFormatUtils.formatDurationWords(72 * 60 * 1000, true, false); - assertEquals("1 hour 12 minutes 0 seconds", text); - text = DurationFormatUtils.formatDurationWords(24 * 60 * 60 * 1000, true, false); - assertEquals("1 day 0 hours 0 minutes 0 seconds", text); - - text = DurationFormatUtils.formatDurationWords(50 * 1000, true, true); - assertEquals("50 seconds", text); - text = DurationFormatUtils.formatDurationWords(65 * 1000, true, true); - assertEquals("1 minute 5 seconds", text); - text = DurationFormatUtils.formatDurationWords(120 * 1000, true, true); - assertEquals("2 minutes", text); - text = DurationFormatUtils.formatDurationWords(121 * 1000, true, true); - assertEquals("2 minutes 1 second", text); - text = DurationFormatUtils.formatDurationWords(72 * 60 * 1000, true, true); - assertEquals("1 hour 12 minutes", text); - text = DurationFormatUtils.formatDurationWords(24 * 60 * 60 * 1000, true, true); - assertEquals("1 day", text); - - text = DurationFormatUtils.formatDurationWords(50 * 1000, false, true); - assertEquals("0 days 0 hours 0 minutes 50 seconds", text); - text = DurationFormatUtils.formatDurationWords(65 * 1000, false, true); - assertEquals("0 days 0 hours 1 minute 5 seconds", text); - text = DurationFormatUtils.formatDurationWords(120 * 1000, false, true); - assertEquals("0 days 0 hours 2 minutes", text); - text = DurationFormatUtils.formatDurationWords(121 * 1000, false, true); - assertEquals("0 days 0 hours 2 minutes 1 second", text); - text = DurationFormatUtils.formatDurationWords(72 * 60 * 1000, false, true); - assertEquals("0 days 1 hour 12 minutes", text); - text = DurationFormatUtils.formatDurationWords(24 * 60 * 60 * 1000, false, true); - assertEquals("1 day", text); - - text = DurationFormatUtils.formatDurationWords(50 * 1000, false, false); - assertEquals("0 days 0 hours 0 minutes 50 seconds", text); - text = DurationFormatUtils.formatDurationWords(65 * 1000, false, false); - assertEquals("0 days 0 hours 1 minute 5 seconds", text); - text = DurationFormatUtils.formatDurationWords(120 * 1000, false, false); - assertEquals("0 days 0 hours 2 minutes 0 seconds", text); - text = DurationFormatUtils.formatDurationWords(121 * 1000, false, false); - assertEquals("0 days 0 hours 2 minutes 1 second", text); - text = DurationFormatUtils.formatDurationWords(72 * 60 * 1000, false, false); - assertEquals("0 days 1 hour 12 minutes 0 seconds", text); - text = DurationFormatUtils.formatDurationWords(24 * 60 * 60 * 1000 + 72 * 60 * 1000, false, false); - assertEquals("1 day 1 hour 12 minutes 0 seconds", text); - text = DurationFormatUtils.formatDurationWords(2 * 24 * 60 * 60 * 1000 + 72 * 60 * 1000, false, false); - assertEquals("2 days 1 hour 12 minutes 0 seconds", text); - for (int i = 2; i < 31; i++) { - text = DurationFormatUtils.formatDurationWords(i * 24 * 60 * 60 * 1000L, false, false); - assertEquals(i + " days 0 hours 0 minutes 0 seconds", text); - } - } - - /** - * Tests that "1 <unit>s" gets converted to "1 <unit>" but that "11 <unit>s" is left alone. - */ - @Test - public void testFormatDurationPluralWords() { - final long oneSecond = 1000; - final long oneMinute = oneSecond * 60; - final long oneHour = oneMinute * 60; - final long oneDay = oneHour * 24; - String text; - - text = DurationFormatUtils.formatDurationWords(oneSecond, false, false); - assertEquals("0 days 0 hours 0 minutes 1 second", text); - text = DurationFormatUtils.formatDurationWords(oneSecond * 2, false, false); - assertEquals("0 days 0 hours 0 minutes 2 seconds", text); - text = DurationFormatUtils.formatDurationWords(oneSecond * 11, false, false); - assertEquals("0 days 0 hours 0 minutes 11 seconds", text); - - text = DurationFormatUtils.formatDurationWords(oneMinute, false, false); - assertEquals("0 days 0 hours 1 minute 0 seconds", text); - text = DurationFormatUtils.formatDurationWords(oneMinute * 2, false, false); - assertEquals("0 days 0 hours 2 minutes 0 seconds", text); - text = DurationFormatUtils.formatDurationWords(oneMinute * 11, false, false); - assertEquals("0 days 0 hours 11 minutes 0 seconds", text); - text = DurationFormatUtils.formatDurationWords(oneMinute + oneSecond, false, false); - assertEquals("0 days 0 hours 1 minute 1 second", text); - - text = DurationFormatUtils.formatDurationWords(oneHour, false, false); - assertEquals("0 days 1 hour 0 minutes 0 seconds", text); - text = DurationFormatUtils.formatDurationWords(oneHour * 2, false, false); - assertEquals("0 days 2 hours 0 minutes 0 seconds", text); - text = DurationFormatUtils.formatDurationWords(oneHour * 11, false, false); - assertEquals("0 days 11 hours 0 minutes 0 seconds", text); - text = DurationFormatUtils.formatDurationWords(oneHour + oneMinute + oneSecond, false, false); - assertEquals("0 days 1 hour 1 minute 1 second", text); - - text = DurationFormatUtils.formatDurationWords(oneDay, false, false); - assertEquals("1 day 0 hours 0 minutes 0 seconds", text); - text = DurationFormatUtils.formatDurationWords(oneDay * 2, false, false); - assertEquals("2 days 0 hours 0 minutes 0 seconds", text); - text = DurationFormatUtils.formatDurationWords(oneDay * 11, false, false); - assertEquals("11 days 0 hours 0 minutes 0 seconds", text); - text = DurationFormatUtils.formatDurationWords(oneDay + oneHour + oneMinute + oneSecond, false, false); - assertEquals("1 day 1 hour 1 minute 1 second", text); - } - - @Test - public void testFormatNegativeDurationWords() { - assertThrows(IllegalArgumentException.class, () -> DurationFormatUtils.formatDurationWords(-5000, true, true)); - } - - @Test - public void testFormatDurationHMS() { - long time = 0; - assertEquals("00:00:00.000", DurationFormatUtils.formatDurationHMS(time)); - - time = 1; - assertEquals("00:00:00.001", DurationFormatUtils.formatDurationHMS(time)); - - time = 15; - assertEquals("00:00:00.015", DurationFormatUtils.formatDurationHMS(time)); - - time = 165; - assertEquals("00:00:00.165", DurationFormatUtils.formatDurationHMS(time)); - - time = 1675; - assertEquals("00:00:01.675", DurationFormatUtils.formatDurationHMS(time)); - - time = 13465; - assertEquals("00:00:13.465", DurationFormatUtils.formatDurationHMS(time)); - - time = 72789; - assertEquals("00:01:12.789", DurationFormatUtils.formatDurationHMS(time)); - - time = 12789 + 32 * 60000; - assertEquals("00:32:12.789", DurationFormatUtils.formatDurationHMS(time)); - - time = 12789 + 62 * 60000; - assertEquals("01:02:12.789", DurationFormatUtils.formatDurationHMS(time)); - } - - @Test - public void testFormatNegativeDurationHMS() { - assertThrows(IllegalArgumentException.class, () -> DurationFormatUtils.formatDurationHMS(-5000)); - } - - @Test - public void testFormatDurationISO() { - assertEquals("P0Y0M0DT0H0M0.000S", DurationFormatUtils.formatDurationISO(0L)); - assertEquals("P0Y0M0DT0H0M0.001S", DurationFormatUtils.formatDurationISO(1L)); - assertEquals("P0Y0M0DT0H0M0.010S", DurationFormatUtils.formatDurationISO(10L)); - assertEquals("P0Y0M0DT0H0M0.100S", DurationFormatUtils.formatDurationISO(100L)); - assertEquals("P0Y0M0DT0H1M15.321S", DurationFormatUtils.formatDurationISO(75321L)); - } - - @Test - public void testFormatNegativeDurationISO() { - assertThrows(IllegalArgumentException.class, () -> DurationFormatUtils.formatDurationISO(-5000)); - } - - @Test - public void testFormatDuration() { - long duration = 0; - assertEquals("0", DurationFormatUtils.formatDuration(duration, "y")); - assertEquals("0", DurationFormatUtils.formatDuration(duration, "M")); - assertEquals("0", DurationFormatUtils.formatDuration(duration, "d")); - assertEquals("0", DurationFormatUtils.formatDuration(duration, "H")); - assertEquals("0", DurationFormatUtils.formatDuration(duration, "m")); - assertEquals("0", DurationFormatUtils.formatDuration(duration, "s")); - assertEquals("0", DurationFormatUtils.formatDuration(duration, "S")); - assertEquals("0000", DurationFormatUtils.formatDuration(duration, "SSSS")); - assertEquals("0000", DurationFormatUtils.formatDuration(duration, "yyyy")); - assertEquals("0000", DurationFormatUtils.formatDuration(duration, "yyMM")); - - duration = 60 * 1000; - assertEquals("0", DurationFormatUtils.formatDuration(duration, "y")); - assertEquals("0", DurationFormatUtils.formatDuration(duration, "M")); - assertEquals("0", DurationFormatUtils.formatDuration(duration, "d")); - assertEquals("0", DurationFormatUtils.formatDuration(duration, "H")); - assertEquals("1", DurationFormatUtils.formatDuration(duration, "m")); - assertEquals("60", DurationFormatUtils.formatDuration(duration, "s")); - assertEquals("60000", DurationFormatUtils.formatDuration(duration, "S")); - assertEquals("01:00", DurationFormatUtils.formatDuration(duration, "mm:ss")); - - final Calendar base = Calendar.getInstance(); - base.set(2000, Calendar.JANUARY, 1, 0, 0, 0); - base.set(Calendar.MILLISECOND, 0); - - final Calendar cal = Calendar.getInstance(); - cal.set(2003, Calendar.FEBRUARY, 1, 0, 0, 0); - cal.set(Calendar.MILLISECOND, 0); - duration = cal.getTime().getTime() - base.getTime().getTime(); // duration from 2000-01-01 to cal - // don't use 1970 in test as time zones were less reliable in 1970 than now - // remember that duration formatting ignores time zones, working on strict hour lengths - final int days = 366 + 365 + 365 + 31; - assertEquals("0 0 " + days, DurationFormatUtils.formatDuration(duration, "y M d")); - } - - @Test - public void testFormatNegativeDuration() { - assertThrows(IllegalArgumentException.class, () -> DurationFormatUtils.formatDuration(-5000, "S", true)); - } - - @SuppressWarnings("deprecation") - @Test - public void testFormatPeriodISO() { - final TimeZone timeZone = TimeZone.getTimeZone("GMT-3"); - final Calendar base = Calendar.getInstance(timeZone); - base.set(1970, Calendar.JANUARY, 1, 0, 0, 0); - base.set(Calendar.MILLISECOND, 0); - - final Calendar cal = Calendar.getInstance(timeZone); - cal.set(2002, Calendar.FEBRUARY, 23, 9, 11, 12); - cal.set(Calendar.MILLISECOND, 1); - String text; - // repeat a test from testDateTimeISO to compare extended and not extended. - text = DateFormatUtils.format(cal, DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern(), timeZone); - assertEquals("2002-02-23T09:11:12-03:00", text); - // test fixture is the same as above, but now with extended format. - text = DurationFormatUtils.formatPeriod(base.getTime().getTime(), cal.getTime().getTime(), - DurationFormatUtils.ISO_EXTENDED_FORMAT_PATTERN, false, timeZone); - assertEquals("P32Y1M22DT9H11M12.001S", text); - // test fixture from example in http://www.w3.org/TR/xmlschema-2/#duration - cal.set(1971, Calendar.FEBRUARY, 3, 10, 30, 0); - cal.set(Calendar.MILLISECOND, 0); - text = DurationFormatUtils.formatPeriod(base.getTime().getTime(), cal.getTime().getTime(), - DurationFormatUtils.ISO_EXTENDED_FORMAT_PATTERN, false, timeZone); - assertEquals("P1Y1M2DT10H30M0.000S", text); - // want a way to say 'don't print the seconds in format()' or other fields for that matter: - // assertEquals("P1Y2M3DT10H30M", text); - } - - @Test - public void testFormatPeriodISOStartGreaterEnd() { - assertThrows(IllegalArgumentException.class, () -> DurationFormatUtils.formatPeriodISO(5000, 2000)); - } - - @Test - public void testFormatPeriodISOMethod() { - assertEquals("P0Y0M0DT0H0M0.000S", DurationFormatUtils.formatPeriodISO(0L, 0L)); - assertEquals("P0Y0M0DT0H0M1.000S", DurationFormatUtils.formatPeriodISO(0L, 1000L)); - assertEquals("P0Y0M0DT0H1M1.000S", DurationFormatUtils.formatPeriodISO(0L, 61000L)); - } - - @Test - public void testFormatPeriod() { - final Calendar cal1970 = Calendar.getInstance(); - cal1970.set(1970, Calendar.JANUARY, 1, 0, 0, 0); - cal1970.set(Calendar.MILLISECOND, 0); - final long time1970 = cal1970.getTime().getTime(); - - assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time1970, "y")); - assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time1970, "M")); - assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time1970, "d")); - assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time1970, "H")); - assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time1970, "m")); - assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time1970, "s")); - assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time1970, "S")); - assertEquals("0000", DurationFormatUtils.formatPeriod(time1970, time1970, "SSSS")); - assertEquals("0000", DurationFormatUtils.formatPeriod(time1970, time1970, "yyyy")); - assertEquals("0000", DurationFormatUtils.formatPeriod(time1970, time1970, "yyMM")); - - long time = time1970 + 60 * 1000; - assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time, "y")); - assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time, "M")); - assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time, "d")); - assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time, "H")); - assertEquals("1", DurationFormatUtils.formatPeriod(time1970, time, "m")); - assertEquals("60", DurationFormatUtils.formatPeriod(time1970, time, "s")); - assertEquals("60000", DurationFormatUtils.formatPeriod(time1970, time, "S")); - assertEquals("01:00", DurationFormatUtils.formatPeriod(time1970, time, "mm:ss")); - - final Calendar cal = Calendar.getInstance(); - cal.set(1973, Calendar.JULY, 1, 0, 0, 0); - cal.set(Calendar.MILLISECOND, 0); - time = cal.getTime().getTime(); - assertEquals("36", DurationFormatUtils.formatPeriod(time1970, time, "yM")); - assertEquals("3 years 6 months", DurationFormatUtils.formatPeriod(time1970, time, "y' years 'M' months'")); - assertEquals("03/06", DurationFormatUtils.formatPeriod(time1970, time, "yy/MM")); - - cal.set(1973, Calendar.NOVEMBER, 1, 0, 0, 0); - cal.set(Calendar.MILLISECOND, 0); - time = cal.getTime().getTime(); - assertEquals("310", DurationFormatUtils.formatPeriod(time1970, time, "yM")); - assertEquals("3 years 10 months", DurationFormatUtils.formatPeriod(time1970, time, "y' years 'M' months'")); - assertEquals("03/10", DurationFormatUtils.formatPeriod(time1970, time, "yy/MM")); - - cal.set(1974, Calendar.JANUARY, 1, 0, 0, 0); - cal.set(Calendar.MILLISECOND, 0); - time = cal.getTime().getTime(); - assertEquals("40", DurationFormatUtils.formatPeriod(time1970, time, "yM")); - assertEquals("4 years 0 months", DurationFormatUtils.formatPeriod(time1970, time, "y' years 'M' months'")); - assertEquals("04/00", DurationFormatUtils.formatPeriod(time1970, time, "yy/MM")); - assertEquals("48", DurationFormatUtils.formatPeriod(time1970, time, "M")); - assertEquals("48", DurationFormatUtils.formatPeriod(time1970, time, "MM")); - assertEquals("048", DurationFormatUtils.formatPeriod(time1970, time, "MMM")); - } - - @Test - public void testFormatPeriodeStartGreaterEnd() { - assertThrows(IllegalArgumentException.class, () -> DurationFormatUtils.formatPeriod(5000, 2500, "yy/MM")); - } - - @Test - public void testLexx() { - // tests each constant - assertArrayEquals(new DurationFormatUtils.Token[]{ - new DurationFormatUtils.Token(DurationFormatUtils.y, 1), - new DurationFormatUtils.Token(DurationFormatUtils.M, 1), - new DurationFormatUtils.Token(DurationFormatUtils.d, 1), - new DurationFormatUtils.Token(DurationFormatUtils.H, 1), - new DurationFormatUtils.Token(DurationFormatUtils.m, 1), - new DurationFormatUtils.Token(DurationFormatUtils.s, 1), - new DurationFormatUtils.Token(DurationFormatUtils.S, 1)}, DurationFormatUtils.lexx("yMdHmsS")); - - // tests the ISO 8601-like - assertArrayEquals(new DurationFormatUtils.Token[]{ - new DurationFormatUtils.Token(DurationFormatUtils.H, 2), - new DurationFormatUtils.Token(new StringBuilder(":"), 1), - new DurationFormatUtils.Token(DurationFormatUtils.m, 2), - new DurationFormatUtils.Token(new StringBuilder(":"), 1), - new DurationFormatUtils.Token(DurationFormatUtils.s, 2), - new DurationFormatUtils.Token(new StringBuilder("."), 1), - new DurationFormatUtils.Token(DurationFormatUtils.S, 3)}, DurationFormatUtils.lexx("HH:mm:ss.SSS")); - - // test the iso extended format - assertArrayEquals(new DurationFormatUtils.Token[]{ - new DurationFormatUtils.Token(new StringBuilder("P"), 1), - new DurationFormatUtils.Token(DurationFormatUtils.y, 4), - new DurationFormatUtils.Token(new StringBuilder("Y"), 1), - new DurationFormatUtils.Token(DurationFormatUtils.M, 1), - new DurationFormatUtils.Token(new StringBuilder("M"), 1), - new DurationFormatUtils.Token(DurationFormatUtils.d, 1), - new DurationFormatUtils.Token(new StringBuilder("DT"), 1), - new DurationFormatUtils.Token(DurationFormatUtils.H, 1), - new DurationFormatUtils.Token(new StringBuilder("H"), 1), - new DurationFormatUtils.Token(DurationFormatUtils.m, 1), - new DurationFormatUtils.Token(new StringBuilder("M"), 1), - new DurationFormatUtils.Token(DurationFormatUtils.s, 1), - new DurationFormatUtils.Token(new StringBuilder("."), 1), - new DurationFormatUtils.Token(DurationFormatUtils.S, 3), - new DurationFormatUtils.Token(new StringBuilder("S"), 1)}, DurationFormatUtils - .lexx(DurationFormatUtils.ISO_EXTENDED_FORMAT_PATTERN)); - - // test failures in equals - final DurationFormatUtils.Token token = new DurationFormatUtils.Token(DurationFormatUtils.y, 4); - assertNotEquals(token, new Object(), "Token equal to non-Token class. "); - assertNotEquals(token, new DurationFormatUtils.Token(new Object()), "Token equal to Token with wrong value class. "); - assertNotEquals(token, new DurationFormatUtils.Token(DurationFormatUtils.y, 1), "Token equal to Token with different count. "); - final DurationFormatUtils.Token numToken = new DurationFormatUtils.Token(Integer.valueOf(1), 4); - assertEquals(numToken, numToken, "Token with Number value not equal to itself. "); - } - - - // https://issues.apache.org/bugzilla/show_bug.cgi?id=38401 - @Test - public void testBugzilla38401() { - assertEqualDuration( "0000/00/30 16:00:00 000", new int[] { 2006, 0, 26, 18, 47, 34 }, - new int[] { 2006, 1, 26, 10, 47, 34 }, "yyyy/MM/dd HH:mm:ss SSS"); - } - - // https://issues.apache.org/jira/browse/LANG-281 - @Test - public void testJiraLang281() { - assertEqualDuration( "09", new int[] { 2005, 11, 31, 0, 0, 0 }, - new int[] { 2006, 9, 6, 0, 0, 0 }, "MM"); - } - - @Test - public void testLANG815() { - final Calendar calendar = Calendar.getInstance(); - calendar.set(2012, Calendar.JULY, 30, 0, 0, 0); - final long startMillis = calendar.getTimeInMillis(); - - calendar.set(2012, Calendar.SEPTEMBER, 8); - final long endMillis = calendar.getTimeInMillis(); - - assertEquals("1 9", DurationFormatUtils.formatPeriod(startMillis, endMillis, "M d")); - } - - // Testing the under a day range in DurationFormatUtils.formatPeriod - @Test - public void testLowDurations() { - for (int hr=0; hr < 24; hr++) { - for (int min=0; min < 60; min++) { - for (int sec=0; sec < 60; sec++) { - assertEqualDuration( hr + ":" + min + ":" + sec, - new int[] { 2000, 0, 1, 0, 0, 0, 0 }, - new int[] { 2000, 0, 1, hr, min, sec }, - "H:m:s" - ); - } - } - } + bruteForce(1969, 1, 28, "M", Calendar.MONTH); // tests for 48 years + //bruteForce(1996, 1, 29, "M", Calendar.MONTH); // this will fail } // Attempting to test edge cases in DurationFormatUtils.formatPeriod @@ -542,13 +200,335 @@ public void testEdgeDurations() { } @Test - public void testLANG984() { // Long durations - assertEquals("0", DurationFormatUtils.formatDuration(0, "S")); - assertEquals(Integer.toString(Integer.MAX_VALUE), DurationFormatUtils.formatDuration(Integer.MAX_VALUE, "S")); - long maxIntPlus=Integer.MAX_VALUE; - maxIntPlus++; - assertEquals(Long.toString(maxIntPlus), DurationFormatUtils.formatDuration(maxIntPlus, "S")); - assertEquals(Long.toString(Long.MAX_VALUE), DurationFormatUtils.formatDuration(Long.MAX_VALUE, "S")); + public void testFormatDuration() { + long duration = 0; + assertEquals("0", DurationFormatUtils.formatDuration(duration, "y")); + assertEquals("0", DurationFormatUtils.formatDuration(duration, "M")); + assertEquals("0", DurationFormatUtils.formatDuration(duration, "d")); + assertEquals("0", DurationFormatUtils.formatDuration(duration, "H")); + assertEquals("0", DurationFormatUtils.formatDuration(duration, "m")); + assertEquals("0", DurationFormatUtils.formatDuration(duration, "s")); + assertEquals("0", DurationFormatUtils.formatDuration(duration, "S")); + assertEquals("0000", DurationFormatUtils.formatDuration(duration, "SSSS")); + assertEquals("0000", DurationFormatUtils.formatDuration(duration, "yyyy")); + assertEquals("0000", DurationFormatUtils.formatDuration(duration, "yyMM")); + + duration = 60 * 1000; + assertEquals("0", DurationFormatUtils.formatDuration(duration, "y")); + assertEquals("0", DurationFormatUtils.formatDuration(duration, "M")); + assertEquals("0", DurationFormatUtils.formatDuration(duration, "d")); + assertEquals("0", DurationFormatUtils.formatDuration(duration, "H")); + assertEquals("1", DurationFormatUtils.formatDuration(duration, "m")); + assertEquals("60", DurationFormatUtils.formatDuration(duration, "s")); + assertEquals("60000", DurationFormatUtils.formatDuration(duration, "S")); + assertEquals("01:00", DurationFormatUtils.formatDuration(duration, "mm:ss")); + + final Calendar base = Calendar.getInstance(); + base.set(2000, Calendar.JANUARY, 1, 0, 0, 0); + base.set(Calendar.MILLISECOND, 0); + + final Calendar cal = Calendar.getInstance(); + cal.set(2003, Calendar.FEBRUARY, 1, 0, 0, 0); + cal.set(Calendar.MILLISECOND, 0); + duration = cal.getTime().getTime() - base.getTime().getTime(); // duration from 2000-01-01 to cal + // don't use 1970 in test as time zones were less reliable in 1970 than now + // remember that duration formatting ignores time zones, working on strict hour lengths + final int days = 366 + 365 + 365 + 31; + assertEquals("0 0 " + days, DurationFormatUtils.formatDuration(duration, "y M d")); + } + + @Test + public void testFormatDurationHMS() { + long time = 0; + assertEquals("00:00:00.000", DurationFormatUtils.formatDurationHMS(time)); + + time = 1; + assertEquals("00:00:00.001", DurationFormatUtils.formatDurationHMS(time)); + + time = 15; + assertEquals("00:00:00.015", DurationFormatUtils.formatDurationHMS(time)); + + time = 165; + assertEquals("00:00:00.165", DurationFormatUtils.formatDurationHMS(time)); + + time = 1675; + assertEquals("00:00:01.675", DurationFormatUtils.formatDurationHMS(time)); + + time = 13465; + assertEquals("00:00:13.465", DurationFormatUtils.formatDurationHMS(time)); + + time = 72789; + assertEquals("00:01:12.789", DurationFormatUtils.formatDurationHMS(time)); + + time = 12789 + 32 * 60000; + assertEquals("00:32:12.789", DurationFormatUtils.formatDurationHMS(time)); + + time = 12789 + 62 * 60000; + assertEquals("01:02:12.789", DurationFormatUtils.formatDurationHMS(time)); + } + + @Test + public void testFormatDurationISO() { + assertEquals("P0Y0M0DT0H0M0.000S", DurationFormatUtils.formatDurationISO(0L)); + assertEquals("P0Y0M0DT0H0M0.001S", DurationFormatUtils.formatDurationISO(1L)); + assertEquals("P0Y0M0DT0H0M0.010S", DurationFormatUtils.formatDurationISO(10L)); + assertEquals("P0Y0M0DT0H0M0.100S", DurationFormatUtils.formatDurationISO(100L)); + assertEquals("P0Y0M0DT0H1M15.321S", DurationFormatUtils.formatDurationISO(75321L)); + } + + /** + * Tests that "1 <unit>s" gets converted to "1 <unit>" but that "11 <unit>s" is left alone. + */ + @Test + public void testFormatDurationPluralWords() { + final long oneSecond = 1000; + final long oneMinute = oneSecond * 60; + final long oneHour = oneMinute * 60; + final long oneDay = oneHour * 24; + String text; + + text = DurationFormatUtils.formatDurationWords(oneSecond, false, false); + assertEquals("0 days 0 hours 0 minutes 1 second", text); + text = DurationFormatUtils.formatDurationWords(oneSecond * 2, false, false); + assertEquals("0 days 0 hours 0 minutes 2 seconds", text); + text = DurationFormatUtils.formatDurationWords(oneSecond * 11, false, false); + assertEquals("0 days 0 hours 0 minutes 11 seconds", text); + + text = DurationFormatUtils.formatDurationWords(oneMinute, false, false); + assertEquals("0 days 0 hours 1 minute 0 seconds", text); + text = DurationFormatUtils.formatDurationWords(oneMinute * 2, false, false); + assertEquals("0 days 0 hours 2 minutes 0 seconds", text); + text = DurationFormatUtils.formatDurationWords(oneMinute * 11, false, false); + assertEquals("0 days 0 hours 11 minutes 0 seconds", text); + text = DurationFormatUtils.formatDurationWords(oneMinute + oneSecond, false, false); + assertEquals("0 days 0 hours 1 minute 1 second", text); + + text = DurationFormatUtils.formatDurationWords(oneHour, false, false); + assertEquals("0 days 1 hour 0 minutes 0 seconds", text); + text = DurationFormatUtils.formatDurationWords(oneHour * 2, false, false); + assertEquals("0 days 2 hours 0 minutes 0 seconds", text); + text = DurationFormatUtils.formatDurationWords(oneHour * 11, false, false); + assertEquals("0 days 11 hours 0 minutes 0 seconds", text); + text = DurationFormatUtils.formatDurationWords(oneHour + oneMinute + oneSecond, false, false); + assertEquals("0 days 1 hour 1 minute 1 second", text); + + text = DurationFormatUtils.formatDurationWords(oneDay, false, false); + assertEquals("1 day 0 hours 0 minutes 0 seconds", text); + text = DurationFormatUtils.formatDurationWords(oneDay * 2, false, false); + assertEquals("2 days 0 hours 0 minutes 0 seconds", text); + text = DurationFormatUtils.formatDurationWords(oneDay * 11, false, false); + assertEquals("11 days 0 hours 0 minutes 0 seconds", text); + text = DurationFormatUtils.formatDurationWords(oneDay + oneHour + oneMinute + oneSecond, false, false); + assertEquals("1 day 1 hour 1 minute 1 second", text); + } + + // ----------------------------------------------------------------------- + @Test + public void testFormatDurationWords() { + String text; + + text = DurationFormatUtils.formatDurationWords(50 * 1000, true, false); + assertEquals("50 seconds", text); + text = DurationFormatUtils.formatDurationWords(65 * 1000, true, false); + assertEquals("1 minute 5 seconds", text); + text = DurationFormatUtils.formatDurationWords(120 * 1000, true, false); + assertEquals("2 minutes 0 seconds", text); + text = DurationFormatUtils.formatDurationWords(121 * 1000, true, false); + assertEquals("2 minutes 1 second", text); + text = DurationFormatUtils.formatDurationWords(72 * 60 * 1000, true, false); + assertEquals("1 hour 12 minutes 0 seconds", text); + text = DurationFormatUtils.formatDurationWords(24 * 60 * 60 * 1000, true, false); + assertEquals("1 day 0 hours 0 minutes 0 seconds", text); + + text = DurationFormatUtils.formatDurationWords(50 * 1000, true, true); + assertEquals("50 seconds", text); + text = DurationFormatUtils.formatDurationWords(65 * 1000, true, true); + assertEquals("1 minute 5 seconds", text); + text = DurationFormatUtils.formatDurationWords(120 * 1000, true, true); + assertEquals("2 minutes", text); + text = DurationFormatUtils.formatDurationWords(121 * 1000, true, true); + assertEquals("2 minutes 1 second", text); + text = DurationFormatUtils.formatDurationWords(72 * 60 * 1000, true, true); + assertEquals("1 hour 12 minutes", text); + text = DurationFormatUtils.formatDurationWords(24 * 60 * 60 * 1000, true, true); + assertEquals("1 day", text); + + text = DurationFormatUtils.formatDurationWords(50 * 1000, false, true); + assertEquals("0 days 0 hours 0 minutes 50 seconds", text); + text = DurationFormatUtils.formatDurationWords(65 * 1000, false, true); + assertEquals("0 days 0 hours 1 minute 5 seconds", text); + text = DurationFormatUtils.formatDurationWords(120 * 1000, false, true); + assertEquals("0 days 0 hours 2 minutes", text); + text = DurationFormatUtils.formatDurationWords(121 * 1000, false, true); + assertEquals("0 days 0 hours 2 minutes 1 second", text); + text = DurationFormatUtils.formatDurationWords(72 * 60 * 1000, false, true); + assertEquals("0 days 1 hour 12 minutes", text); + text = DurationFormatUtils.formatDurationWords(24 * 60 * 60 * 1000, false, true); + assertEquals("1 day", text); + + text = DurationFormatUtils.formatDurationWords(50 * 1000, false, false); + assertEquals("0 days 0 hours 0 minutes 50 seconds", text); + text = DurationFormatUtils.formatDurationWords(65 * 1000, false, false); + assertEquals("0 days 0 hours 1 minute 5 seconds", text); + text = DurationFormatUtils.formatDurationWords(120 * 1000, false, false); + assertEquals("0 days 0 hours 2 minutes 0 seconds", text); + text = DurationFormatUtils.formatDurationWords(121 * 1000, false, false); + assertEquals("0 days 0 hours 2 minutes 1 second", text); + text = DurationFormatUtils.formatDurationWords(72 * 60 * 1000, false, false); + assertEquals("0 days 1 hour 12 minutes 0 seconds", text); + text = DurationFormatUtils.formatDurationWords(24 * 60 * 60 * 1000 + 72 * 60 * 1000, false, false); + assertEquals("1 day 1 hour 12 minutes 0 seconds", text); + text = DurationFormatUtils.formatDurationWords(2 * 24 * 60 * 60 * 1000 + 72 * 60 * 1000, false, false); + assertEquals("2 days 1 hour 12 minutes 0 seconds", text); + for (int i = 2; i < 31; i++) { + text = DurationFormatUtils.formatDurationWords(i * 24 * 60 * 60 * 1000L, false, false); + assertEquals(i + " days 0 hours 0 minutes 0 seconds", text); + } + } + + @Test + public void testFormatNegativeDuration() { + assertThrows(IllegalArgumentException.class, () -> DurationFormatUtils.formatDuration(-5000, "S", true)); + } + + @Test + public void testFormatNegativeDurationHMS() { + assertThrows(IllegalArgumentException.class, () -> DurationFormatUtils.formatDurationHMS(-5000)); + } + + @Test + public void testFormatNegativeDurationISO() { + assertThrows(IllegalArgumentException.class, () -> DurationFormatUtils.formatDurationISO(-5000)); + } + + + @Test + public void testFormatNegativeDurationWords() { + assertThrows(IllegalArgumentException.class, () -> DurationFormatUtils.formatDurationWords(-5000, true, true)); + } + + @Test + public void testFormatPeriod() { + final Calendar cal1970 = Calendar.getInstance(); + cal1970.set(1970, Calendar.JANUARY, 1, 0, 0, 0); + cal1970.set(Calendar.MILLISECOND, 0); + final long time1970 = cal1970.getTime().getTime(); + + assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time1970, "y")); + assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time1970, "M")); + assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time1970, "d")); + assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time1970, "H")); + assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time1970, "m")); + assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time1970, "s")); + assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time1970, "S")); + assertEquals("0000", DurationFormatUtils.formatPeriod(time1970, time1970, "SSSS")); + assertEquals("0000", DurationFormatUtils.formatPeriod(time1970, time1970, "yyyy")); + assertEquals("0000", DurationFormatUtils.formatPeriod(time1970, time1970, "yyMM")); + + long time = time1970 + 60 * 1000; + assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time, "y")); + assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time, "M")); + assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time, "d")); + assertEquals("0", DurationFormatUtils.formatPeriod(time1970, time, "H")); + assertEquals("1", DurationFormatUtils.formatPeriod(time1970, time, "m")); + assertEquals("60", DurationFormatUtils.formatPeriod(time1970, time, "s")); + assertEquals("60000", DurationFormatUtils.formatPeriod(time1970, time, "S")); + assertEquals("01:00", DurationFormatUtils.formatPeriod(time1970, time, "mm:ss")); + + final Calendar cal = Calendar.getInstance(); + cal.set(1973, Calendar.JULY, 1, 0, 0, 0); + cal.set(Calendar.MILLISECOND, 0); + time = cal.getTime().getTime(); + assertEquals("36", DurationFormatUtils.formatPeriod(time1970, time, "yM")); + assertEquals("3 years 6 months", DurationFormatUtils.formatPeriod(time1970, time, "y' years 'M' months'")); + assertEquals("03/06", DurationFormatUtils.formatPeriod(time1970, time, "yy/MM")); + + cal.set(1973, Calendar.NOVEMBER, 1, 0, 0, 0); + cal.set(Calendar.MILLISECOND, 0); + time = cal.getTime().getTime(); + assertEquals("310", DurationFormatUtils.formatPeriod(time1970, time, "yM")); + assertEquals("3 years 10 months", DurationFormatUtils.formatPeriod(time1970, time, "y' years 'M' months'")); + assertEquals("03/10", DurationFormatUtils.formatPeriod(time1970, time, "yy/MM")); + + cal.set(1974, Calendar.JANUARY, 1, 0, 0, 0); + cal.set(Calendar.MILLISECOND, 0); + time = cal.getTime().getTime(); + assertEquals("40", DurationFormatUtils.formatPeriod(time1970, time, "yM")); + assertEquals("4 years 0 months", DurationFormatUtils.formatPeriod(time1970, time, "y' years 'M' months'")); + assertEquals("04/00", DurationFormatUtils.formatPeriod(time1970, time, "yy/MM")); + assertEquals("48", DurationFormatUtils.formatPeriod(time1970, time, "M")); + assertEquals("48", DurationFormatUtils.formatPeriod(time1970, time, "MM")); + assertEquals("048", DurationFormatUtils.formatPeriod(time1970, time, "MMM")); + } + + @Test + public void testFormatPeriodeStartGreaterEnd() { + assertThrows(IllegalArgumentException.class, () -> DurationFormatUtils.formatPeriod(5000, 2500, "yy/MM")); + } + + @SuppressWarnings("deprecation") + @Test + public void testFormatPeriodISO() { + final TimeZone timeZone = TimeZone.getTimeZone("GMT-3"); + final Calendar base = Calendar.getInstance(timeZone); + base.set(1970, Calendar.JANUARY, 1, 0, 0, 0); + base.set(Calendar.MILLISECOND, 0); + + final Calendar cal = Calendar.getInstance(timeZone); + cal.set(2002, Calendar.FEBRUARY, 23, 9, 11, 12); + cal.set(Calendar.MILLISECOND, 1); + String text; + // repeat a test from testDateTimeISO to compare extended and not extended. + text = DateFormatUtils.format(cal, DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern(), timeZone); + assertEquals("2002-02-23T09:11:12-03:00", text); + // test fixture is the same as above, but now with extended format. + text = DurationFormatUtils.formatPeriod(base.getTime().getTime(), cal.getTime().getTime(), + DurationFormatUtils.ISO_EXTENDED_FORMAT_PATTERN, false, timeZone); + assertEquals("P32Y1M22DT9H11M12.001S", text); + // test fixture from example in http://www.w3.org/TR/xmlschema-2/#duration + cal.set(1971, Calendar.FEBRUARY, 3, 10, 30, 0); + cal.set(Calendar.MILLISECOND, 0); + text = DurationFormatUtils.formatPeriod(base.getTime().getTime(), cal.getTime().getTime(), + DurationFormatUtils.ISO_EXTENDED_FORMAT_PATTERN, false, timeZone); + assertEquals("P1Y1M2DT10H30M0.000S", text); + // want a way to say 'don't print the seconds in format()' or other fields for that matter: + // assertEquals("P1Y2M3DT10H30M", text); + } + + @Test + public void testFormatPeriodISOMethod() { + assertEquals("P0Y0M0DT0H0M0.000S", DurationFormatUtils.formatPeriodISO(0L, 0L)); + assertEquals("P0Y0M0DT0H0M1.000S", DurationFormatUtils.formatPeriodISO(0L, 1000L)); + assertEquals("P0Y0M0DT0H1M1.000S", DurationFormatUtils.formatPeriodISO(0L, 61000L)); + } + + @Test + public void testFormatPeriodISOStartGreaterEnd() { + assertThrows(IllegalArgumentException.class, () -> DurationFormatUtils.formatPeriodISO(5000, 2000)); + } + + // https://issues.apache.org/jira/browse/LANG-281 + @Test + public void testJiraLang281() { + assertEqualDuration( "09", new int[] { 2005, 11, 31, 0, 0, 0 }, + new int[] { 2006, 9, 6, 0, 0, 0 }, "MM"); + } + + @Test + public void testLANG815() { + final Calendar calendar = Calendar.getInstance(); + calendar.set(2012, Calendar.JULY, 30, 0, 0, 0); + final long startMillis = calendar.getTimeInMillis(); + + calendar.set(2012, Calendar.SEPTEMBER, 8); + final long endMillis = calendar.getTimeInMillis(); + + assertEquals("1 9", DurationFormatUtils.formatPeriod(startMillis, endMillis, "M d")); + } + + @Test + public void testLANG981() { // unmatched quote char in lexx + assertThrows(IllegalArgumentException.class, () -> DurationFormatUtils.lexx("'yMdHms''S")); } @Test @@ -563,25 +543,6 @@ public void testLANG982() { // More than 3 millisecond digits following a second assertEquals("1 01999", DurationFormatUtils.formatDuration(61999, "m SSSSS")); } - @Test - public void testDurationsByBruteForce() { - bruteForce(2006, 0, 1, "d", Calendar.DAY_OF_MONTH); - bruteForce(2006, 0, 2, "d", Calendar.DAY_OF_MONTH); - bruteForce(2007, 1, 2, "d", Calendar.DAY_OF_MONTH); - bruteForce(2004, 1, 29, "d", Calendar.DAY_OF_MONTH); - bruteForce(1996, 1, 29, "d", Calendar.DAY_OF_MONTH); - - bruteForce(1969, 1, 28, "M", Calendar.MONTH); // tests for 48 years - //bruteForce(1996, 1, 29, "M", Calendar.MONTH); // this will fail - } - - @Test - public void testLANG981() { // unmatched quote char in lexx - assertThrows(IllegalArgumentException.class, () -> DurationFormatUtils.lexx("'yMdHms''S")); - } - - private static final int FOUR_YEARS = 365 * 3 + 366; - // Takes a minute to run, so generally turned off // public void testBrutally() { // Calendar c = Calendar.getInstance(); @@ -592,39 +553,78 @@ public void testLANG981() { // unmatched quote char in lexx // } // } - private void bruteForce(final int year, final int month, final int day, final String format, final int calendarType) { - final String msg = year + "-" + month + "-" + day + " to "; - final Calendar c = Calendar.getInstance(); - c.set(year, month, day, 0, 0, 0); - final int[] array1 = new int[] { year, month, day, 0, 0, 0 }; - final int[] array2 = new int[] { year, month, day, 0, 0, 0 }; - for (int i=0; i < FOUR_YEARS; i++) { - array2[0] = c.get(Calendar.YEAR); - array2[1] = c.get(Calendar.MONTH); - array2[2] = c.get(Calendar.DAY_OF_MONTH); - final String tmpMsg = msg + array2[0] + "-" + array2[1] + "-" + array2[2] + " at "; - assertEqualDuration( tmpMsg + i, Integer.toString(i), array1, array2, format ); - c.add(calendarType, 1); - } + @Test + public void testLANG984() { // Long durations + assertEquals("0", DurationFormatUtils.formatDuration(0, "S")); + assertEquals(Integer.toString(Integer.MAX_VALUE), DurationFormatUtils.formatDuration(Integer.MAX_VALUE, "S")); + long maxIntPlus=Integer.MAX_VALUE; + maxIntPlus++; + assertEquals(Long.toString(maxIntPlus), DurationFormatUtils.formatDuration(maxIntPlus, "S")); + assertEquals(Long.toString(Long.MAX_VALUE), DurationFormatUtils.formatDuration(Long.MAX_VALUE, "S")); } - private void assertEqualDuration(final String expected, final int[] start, final int[] end, final String format) { - assertEqualDuration(null, expected, start, end, format); + @Test + public void testLexx() { + // tests each constant + assertArrayEquals(new DurationFormatUtils.Token[]{ + new DurationFormatUtils.Token(DurationFormatUtils.y, 1), + new DurationFormatUtils.Token(DurationFormatUtils.M, 1), + new DurationFormatUtils.Token(DurationFormatUtils.d, 1), + new DurationFormatUtils.Token(DurationFormatUtils.H, 1), + new DurationFormatUtils.Token(DurationFormatUtils.m, 1), + new DurationFormatUtils.Token(DurationFormatUtils.s, 1), + new DurationFormatUtils.Token(DurationFormatUtils.S, 1)}, DurationFormatUtils.lexx("yMdHmsS")); + + // tests the ISO 8601-like + assertArrayEquals(new DurationFormatUtils.Token[]{ + new DurationFormatUtils.Token(DurationFormatUtils.H, 2), + new DurationFormatUtils.Token(new StringBuilder(":"), 1), + new DurationFormatUtils.Token(DurationFormatUtils.m, 2), + new DurationFormatUtils.Token(new StringBuilder(":"), 1), + new DurationFormatUtils.Token(DurationFormatUtils.s, 2), + new DurationFormatUtils.Token(new StringBuilder("."), 1), + new DurationFormatUtils.Token(DurationFormatUtils.S, 3)}, DurationFormatUtils.lexx("HH:mm:ss.SSS")); + + // test the iso extended format + assertArrayEquals(new DurationFormatUtils.Token[]{ + new DurationFormatUtils.Token(new StringBuilder("P"), 1), + new DurationFormatUtils.Token(DurationFormatUtils.y, 4), + new DurationFormatUtils.Token(new StringBuilder("Y"), 1), + new DurationFormatUtils.Token(DurationFormatUtils.M, 1), + new DurationFormatUtils.Token(new StringBuilder("M"), 1), + new DurationFormatUtils.Token(DurationFormatUtils.d, 1), + new DurationFormatUtils.Token(new StringBuilder("DT"), 1), + new DurationFormatUtils.Token(DurationFormatUtils.H, 1), + new DurationFormatUtils.Token(new StringBuilder("H"), 1), + new DurationFormatUtils.Token(DurationFormatUtils.m, 1), + new DurationFormatUtils.Token(new StringBuilder("M"), 1), + new DurationFormatUtils.Token(DurationFormatUtils.s, 1), + new DurationFormatUtils.Token(new StringBuilder("."), 1), + new DurationFormatUtils.Token(DurationFormatUtils.S, 3), + new DurationFormatUtils.Token(new StringBuilder("S"), 1)}, DurationFormatUtils + .lexx(DurationFormatUtils.ISO_EXTENDED_FORMAT_PATTERN)); + + // test failures in equals + final DurationFormatUtils.Token token = new DurationFormatUtils.Token(DurationFormatUtils.y, 4); + assertNotEquals(token, new Object(), "Token equal to non-Token class. "); + assertNotEquals(token, new DurationFormatUtils.Token(new Object()), "Token equal to Token with wrong value class. "); + assertNotEquals(token, new DurationFormatUtils.Token(DurationFormatUtils.y, 1), "Token equal to Token with different count. "); + final DurationFormatUtils.Token numToken = new DurationFormatUtils.Token(Integer.valueOf(1), 4); + assertEquals(numToken, numToken, "Token with Number value not equal to itself. "); } - private void assertEqualDuration(final String message, final String expected, final int[] start, final int[] end, final String format) { - final Calendar cal1 = Calendar.getInstance(); - cal1.set(start[0], start[1], start[2], start[3], start[4], start[5]); - cal1.set(Calendar.MILLISECOND, 0); - final Calendar cal2 = Calendar.getInstance(); - cal2.set(end[0], end[1], end[2], end[3], end[4], end[5]); - cal2.set(Calendar.MILLISECOND, 0); - final long milli1 = cal1.getTime().getTime(); - final long milli2 = cal2.getTime().getTime(); - final String result = DurationFormatUtils.formatPeriod(milli1, milli2, format); - if (message == null) { - assertEquals(expected, result); - } else { - assertEquals(expected, result, message); + // Testing the under a day range in DurationFormatUtils.formatPeriod + @Test + public void testLowDurations() { + for (int hr=0; hr < 24; hr++) { + for (int min=0; min < 60; min++) { + for (int sec=0; sec < 60; sec++) { + assertEqualDuration( hr + ":" + min + ":" + sec, + new int[] { 2000, 0, 1, 0, 0, 0, 0 }, + new int[] { 2000, 0, 1, hr, min, sec }, + "H:m:s" + ); + } + } } } diff --git a/src/test/java/org/apache/commons/lang3/time/FastDateFormatTest.java b/src/test/java/org/apache/commons/lang3/time/FastDateFormatTest.java index df59b5bf6..b945d1748 100644 --- a/src/test/java/org/apache/commons/lang3/time/FastDateFormatTest.java +++ b/src/test/java/org/apache/commons/lang3/time/FastDateFormatTest.java @@ -45,62 +45,51 @@ * @since 2.0 */ public class FastDateFormatTest { - /* - * Only the cache methods need to be tested here. - * The print methods are tested by {@link FastDateFormat_PrinterTest} - * and the parse methods are tested by {@link FastDateFormat_ParserTest} - */ - @Test - public void test_getInstance() { - final FastDateFormat format1 = FastDateFormat.getInstance(); - final FastDateFormat format2 = FastDateFormat.getInstance(); - assertSame(format1, format2); - } + private static final int NTHREADS = 10; - @Test - public void test_getInstance_String() { - final FastDateFormat format1 = FastDateFormat.getInstance("MM/DD/yyyy"); - final FastDateFormat format2 = FastDateFormat.getInstance("MM-DD-yyyy"); - final FastDateFormat format3 = FastDateFormat.getInstance("MM-DD-yyyy"); + private static final int NROUNDS = 10000; - assertNotSame(format1, format2); - assertSame(format2, format3); - assertEquals("MM/DD/yyyy", format1.getPattern()); - assertEquals(TimeZone.getDefault(), format1.getTimeZone()); - assertEquals(TimeZone.getDefault(), format2.getTimeZone()); - } + private AtomicLongArray measureTime(final Format printer, final Format parser) throws InterruptedException { + final ExecutorService pool = Executors.newFixedThreadPool(NTHREADS); + final AtomicInteger failures = new AtomicInteger(0); + final AtomicLongArray totalElapsed = new AtomicLongArray(2); + try { + for (int i = 0; i < NTHREADS; ++i) { + pool.submit(() -> { + for (int j = 0; j < NROUNDS; ++j) { + try { + final Date date = new Date(); - @DefaultLocale(language = "en", country = "US") - @DefaultTimeZone("America/New_York") - @Test - public void test_getInstance_String_TimeZone() { + final long t0Millis = System.currentTimeMillis(); + final String formattedDate = printer.format(date); + totalElapsed.addAndGet(0, System.currentTimeMillis() - t0Millis); - final FastDateFormat format1 = FastDateFormat.getInstance("MM/DD/yyyy", - TimeZone.getTimeZone("Atlantic/Reykjavik")); - final FastDateFormat format2 = FastDateFormat.getInstance("MM/DD/yyyy"); - final FastDateFormat format3 = FastDateFormat.getInstance("MM/DD/yyyy", TimeZone.getDefault()); - final FastDateFormat format4 = FastDateFormat.getInstance("MM/DD/yyyy", TimeZone.getDefault()); - final FastDateFormat format5 = FastDateFormat.getInstance("MM-DD-yyyy", TimeZone.getDefault()); - final FastDateFormat format6 = FastDateFormat.getInstance("MM-DD-yyyy"); + final long t1Millis = System.currentTimeMillis(); + final Object pd = parser.parseObject(formattedDate); + totalElapsed.addAndGet(1, System.currentTimeMillis() - t1Millis); - assertNotSame(format1, format2); - assertEquals(TimeZone.getTimeZone("Atlantic/Reykjavik"), format1.getTimeZone()); - assertEquals(TimeZone.getDefault(), format2.getTimeZone()); - assertSame(format3, format4); - assertNotSame(format3, format5); - assertNotSame(format4, format6); - } - - @DefaultLocale(language = "en", country = "US") - @Test - public void test_getInstance_String_Locale() { - final FastDateFormat format1 = FastDateFormat.getInstance("MM/DD/yyyy", Locale.GERMANY); - final FastDateFormat format2 = FastDateFormat.getInstance("MM/DD/yyyy"); - final FastDateFormat format3 = FastDateFormat.getInstance("MM/DD/yyyy", Locale.GERMANY); - - assertNotSame(format1, format2); - assertSame(format1, format3); - assertEquals(Locale.GERMANY, format1.getLocale()); + if (!date.equals(pd)) { + failures.incrementAndGet(); + } + } catch (final Exception e) { + failures.incrementAndGet(); + e.printStackTrace(); + } + } + }); + } + } finally { + pool.shutdown(); + // depending on the performance of the machine used to run the parsing, + // the tests can run for a while. It should however complete within + // 30 seconds. Might need increase on very slow machines. + if (!pool.awaitTermination(30, TimeUnit.SECONDS)) { + pool.shutdownNow(); + fail("did not complete tasks"); + } + } + assertEquals(0, failures.get()); + return totalElapsed; } @DefaultLocale(language = "en", country = "US") @@ -133,6 +122,64 @@ public void test_changeDefault_Locale_DateTimeInstance() { assertNotSame(format2, format3); } + /* + * Only the cache methods need to be tested here. + * The print methods are tested by {@link FastDateFormat_PrinterTest} + * and the parse methods are tested by {@link FastDateFormat_ParserTest} + */ + @Test + public void test_getInstance() { + final FastDateFormat format1 = FastDateFormat.getInstance(); + final FastDateFormat format2 = FastDateFormat.getInstance(); + assertSame(format1, format2); + } + + @Test + public void test_getInstance_String() { + final FastDateFormat format1 = FastDateFormat.getInstance("MM/DD/yyyy"); + final FastDateFormat format2 = FastDateFormat.getInstance("MM-DD-yyyy"); + final FastDateFormat format3 = FastDateFormat.getInstance("MM-DD-yyyy"); + + assertNotSame(format1, format2); + assertSame(format2, format3); + assertEquals("MM/DD/yyyy", format1.getPattern()); + assertEquals(TimeZone.getDefault(), format1.getTimeZone()); + assertEquals(TimeZone.getDefault(), format2.getTimeZone()); + } + + @DefaultLocale(language = "en", country = "US") + @Test + public void test_getInstance_String_Locale() { + final FastDateFormat format1 = FastDateFormat.getInstance("MM/DD/yyyy", Locale.GERMANY); + final FastDateFormat format2 = FastDateFormat.getInstance("MM/DD/yyyy"); + final FastDateFormat format3 = FastDateFormat.getInstance("MM/DD/yyyy", Locale.GERMANY); + + assertNotSame(format1, format2); + assertSame(format1, format3); + assertEquals(Locale.GERMANY, format1.getLocale()); + } + + @DefaultLocale(language = "en", country = "US") + @DefaultTimeZone("America/New_York") + @Test + public void test_getInstance_String_TimeZone() { + + final FastDateFormat format1 = FastDateFormat.getInstance("MM/DD/yyyy", + TimeZone.getTimeZone("Atlantic/Reykjavik")); + final FastDateFormat format2 = FastDateFormat.getInstance("MM/DD/yyyy"); + final FastDateFormat format3 = FastDateFormat.getInstance("MM/DD/yyyy", TimeZone.getDefault()); + final FastDateFormat format4 = FastDateFormat.getInstance("MM/DD/yyyy", TimeZone.getDefault()); + final FastDateFormat format5 = FastDateFormat.getInstance("MM-DD-yyyy", TimeZone.getDefault()); + final FastDateFormat format6 = FastDateFormat.getInstance("MM-DD-yyyy"); + + assertNotSame(format1, format2); + assertEquals(TimeZone.getTimeZone("Atlantic/Reykjavik"), format1.getTimeZone()); + assertEquals(TimeZone.getDefault(), format2.getTimeZone()); + assertSame(format3, format4); + assertNotSame(format3, format5); + assertNotSame(format4, format6); + } + @DefaultLocale(language = "en", country = "US") @DefaultTimeZone("America/New_York") @Test @@ -193,27 +240,28 @@ public void testDateDefaults() { } @Test - public void testTimeDefaults() { - assertEquals(FastDateFormat.getTimeInstance(FastDateFormat.LONG, Locale.CANADA), - FastDateFormat.getTimeInstance(FastDateFormat.LONG, TimeZone.getDefault(), Locale.CANADA)); + public void testLANG_1152() { + final TimeZone utc = FastTimeZone.getGmtTimeZone(); + final Date date = new Date(Long.MAX_VALUE); - assertEquals(FastDateFormat.getTimeInstance(FastDateFormat.LONG, TimeZone.getTimeZone("America/New_York")), - FastDateFormat.getTimeInstance(FastDateFormat.LONG, TimeZone.getTimeZone("America/New_York"), Locale.getDefault())); + String dateAsString = FastDateFormat.getInstance("yyyy-MM-dd", utc, Locale.US).format(date); + assertEquals("292278994-08-17", dateAsString); - assertEquals(FastDateFormat.getTimeInstance(FastDateFormat.LONG), - FastDateFormat.getTimeInstance(FastDateFormat.LONG, TimeZone.getDefault(), Locale.getDefault())); + dateAsString = FastDateFormat.getInstance("dd/MM/yyyy", utc, Locale.US).format(date); + assertEquals("17/08/292278994", dateAsString); + } + @Test + public void testLANG_1267() { + FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); } + /** + * According to LANG-954 (https://issues.apache.org/jira/browse/LANG-954) this is broken in Android 2.1. + */ @Test - public void testTimeDateDefaults() { - assertEquals(FastDateFormat.getDateTimeInstance(FastDateFormat.LONG, FastDateFormat.MEDIUM, Locale.CANADA), - FastDateFormat.getDateTimeInstance(FastDateFormat.LONG, FastDateFormat.MEDIUM, TimeZone.getDefault(), Locale.CANADA)); - - assertEquals(FastDateFormat.getDateTimeInstance(FastDateFormat.LONG, FastDateFormat.MEDIUM, TimeZone.getTimeZone("America/New_York")), - FastDateFormat.getDateTimeInstance(FastDateFormat.LONG, FastDateFormat.MEDIUM, TimeZone.getTimeZone("America/New_York"), Locale.getDefault())); - - assertEquals(FastDateFormat.getDateTimeInstance(FastDateFormat.LONG, FastDateFormat.MEDIUM), - FastDateFormat.getDateTimeInstance(FastDateFormat.LONG, FastDateFormat.MEDIUM, TimeZone.getDefault(), Locale.getDefault())); + public void testLANG_954() { + final String pattern = "yyyy-MM-dd'T'"; + FastDateFormat.getInstance(pattern); } @Test @@ -248,75 +296,27 @@ public Object parseObject(final String source, final ParsePosition pos) { //System.out.println(">>FastDateFormatTest: FastDateParser:"+fdfTime.get(1)+" SimpleDateFormat:"+sdfTime.get(1)); } - private static final int NTHREADS = 10; - private static final int NROUNDS = 10000; - - private AtomicLongArray measureTime(final Format printer, final Format parser) throws InterruptedException { - final ExecutorService pool = Executors.newFixedThreadPool(NTHREADS); - final AtomicInteger failures = new AtomicInteger(0); - final AtomicLongArray totalElapsed = new AtomicLongArray(2); - try { - for (int i = 0; i < NTHREADS; ++i) { - pool.submit(() -> { - for (int j = 0; j < NROUNDS; ++j) { - try { - final Date date = new Date(); - - final long t0Millis = System.currentTimeMillis(); - final String formattedDate = printer.format(date); - totalElapsed.addAndGet(0, System.currentTimeMillis() - t0Millis); - - final long t1Millis = System.currentTimeMillis(); - final Object pd = parser.parseObject(formattedDate); - totalElapsed.addAndGet(1, System.currentTimeMillis() - t1Millis); - - if (!date.equals(pd)) { - failures.incrementAndGet(); - } - } catch (final Exception e) { - failures.incrementAndGet(); - e.printStackTrace(); - } - } - }); - } - } finally { - pool.shutdown(); - // depending on the performance of the machine used to run the parsing, - // the tests can run for a while. It should however complete within - // 30 seconds. Might need increase on very slow machines. - if (!pool.awaitTermination(30, TimeUnit.SECONDS)) { - pool.shutdownNow(); - fail("did not complete tasks"); - } - } - assertEquals(0, failures.get()); - return totalElapsed; - } - - /** - * According to LANG-954 (https://issues.apache.org/jira/browse/LANG-954) this is broken in Android 2.1. - */ @Test - public void testLANG_954() { - final String pattern = "yyyy-MM-dd'T'"; - FastDateFormat.getInstance(pattern); + public void testTimeDateDefaults() { + assertEquals(FastDateFormat.getDateTimeInstance(FastDateFormat.LONG, FastDateFormat.MEDIUM, Locale.CANADA), + FastDateFormat.getDateTimeInstance(FastDateFormat.LONG, FastDateFormat.MEDIUM, TimeZone.getDefault(), Locale.CANADA)); + + assertEquals(FastDateFormat.getDateTimeInstance(FastDateFormat.LONG, FastDateFormat.MEDIUM, TimeZone.getTimeZone("America/New_York")), + FastDateFormat.getDateTimeInstance(FastDateFormat.LONG, FastDateFormat.MEDIUM, TimeZone.getTimeZone("America/New_York"), Locale.getDefault())); + + assertEquals(FastDateFormat.getDateTimeInstance(FastDateFormat.LONG, FastDateFormat.MEDIUM), + FastDateFormat.getDateTimeInstance(FastDateFormat.LONG, FastDateFormat.MEDIUM, TimeZone.getDefault(), Locale.getDefault())); } @Test - public void testLANG_1152() { - final TimeZone utc = FastTimeZone.getGmtTimeZone(); - final Date date = new Date(Long.MAX_VALUE); + public void testTimeDefaults() { + assertEquals(FastDateFormat.getTimeInstance(FastDateFormat.LONG, Locale.CANADA), + FastDateFormat.getTimeInstance(FastDateFormat.LONG, TimeZone.getDefault(), Locale.CANADA)); - String dateAsString = FastDateFormat.getInstance("yyyy-MM-dd", utc, Locale.US).format(date); - assertEquals("292278994-08-17", dateAsString); + assertEquals(FastDateFormat.getTimeInstance(FastDateFormat.LONG, TimeZone.getTimeZone("America/New_York")), + FastDateFormat.getTimeInstance(FastDateFormat.LONG, TimeZone.getTimeZone("America/New_York"), Locale.getDefault())); - dateAsString = FastDateFormat.getInstance("dd/MM/yyyy", utc, Locale.US).format(date); - assertEquals("17/08/292278994", dateAsString); - } - - @Test - public void testLANG_1267() { - FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + assertEquals(FastDateFormat.getTimeInstance(FastDateFormat.LONG), + FastDateFormat.getTimeInstance(FastDateFormat.LONG, TimeZone.getDefault(), Locale.getDefault())); } } diff --git a/src/test/java/org/apache/commons/lang3/time/FastDateParserSDFTest.java b/src/test/java/org/apache/commons/lang3/time/FastDateParserSDFTest.java index ce8e4bf2f..6e4aad41a 100644 --- a/src/test/java/org/apache/commons/lang3/time/FastDateParserSDFTest.java +++ b/src/test/java/org/apache/commons/lang3/time/FastDateParserSDFTest.java @@ -38,6 +38,8 @@ */ public class FastDateParserSDFTest { + private static final TimeZone timeZone = TimeZone.getDefault(); + public static Stream data() { return Stream.of( // General Time zone tests @@ -102,44 +104,6 @@ public static Stream data() { ); } - private static final TimeZone timeZone = TimeZone.getDefault(); - - @ParameterizedTest - @MethodSource("data") - public void testOriginal(final String format, final String input, final Locale locale, final boolean valid) { - checkParse(input, format, locale, valid); - } - - @ParameterizedTest - @MethodSource("data") - public void testOriginalPP(final String format, final String input, final Locale locale, final boolean valid) { - checkParsePosition(input, format, locale, valid); - } - - @ParameterizedTest - @MethodSource("data") - public void testUpperCase(final String format, final String input, final Locale locale, final boolean valid) { - checkParse(input.toUpperCase(locale), format, locale, valid); - } - - @ParameterizedTest - @MethodSource("data") - public void testUpperCasePP(final String format, final String input, final Locale locale, final boolean valid) { - checkParsePosition(input.toUpperCase(locale), format, locale, valid); - } - - @ParameterizedTest - @MethodSource("data") - public void testLowerCase(final String format, final String input, final Locale locale, final boolean valid) { - checkParse(input.toLowerCase(locale), format, locale, valid); - } - - @ParameterizedTest - @MethodSource("data") - public void testLowerCasePP(final String format, final String input, final Locale locale, final boolean valid) { - checkParsePosition(input.toLowerCase(locale), format, locale, valid); - } - private void checkParse(final String formattedDate, final String format, final Locale locale, final boolean valid) { final SimpleDateFormat sdf = new SimpleDateFormat(format, locale); sdf.setTimeZone(timeZone); @@ -176,6 +140,7 @@ private void checkParse(final String formattedDate, final String format, final L assertEquals(sdfE, fdfE, locale.toString()+" "+formattedDate + " expected same Exception "); } } + private void checkParsePosition(final String formattedDate, final String format, final Locale locale, final boolean valid) { final SimpleDateFormat sdf = new SimpleDateFormat(format, locale); sdf.setTimeZone(timeZone); @@ -214,4 +179,39 @@ private void checkParsePosition(final String formattedDate, final String format, "FDF error index ("+ fdferrorIndex + ") should approximate SDF index (" + sdferrorIndex + ")"); } } + + @ParameterizedTest + @MethodSource("data") + public void testLowerCase(final String format, final String input, final Locale locale, final boolean valid) { + checkParse(input.toLowerCase(locale), format, locale, valid); + } + + @ParameterizedTest + @MethodSource("data") + public void testLowerCasePP(final String format, final String input, final Locale locale, final boolean valid) { + checkParsePosition(input.toLowerCase(locale), format, locale, valid); + } + + @ParameterizedTest + @MethodSource("data") + public void testOriginal(final String format, final String input, final Locale locale, final boolean valid) { + checkParse(input, format, locale, valid); + } + + @ParameterizedTest + @MethodSource("data") + public void testOriginalPP(final String format, final String input, final Locale locale, final boolean valid) { + checkParsePosition(input, format, locale, valid); + } + + @ParameterizedTest + @MethodSource("data") + public void testUpperCase(final String format, final String input, final Locale locale, final boolean valid) { + checkParse(input.toUpperCase(locale), format, locale, valid); + } + @ParameterizedTest + @MethodSource("data") + public void testUpperCasePP(final String format, final String input, final Locale locale, final boolean valid) { + checkParsePosition(input.toUpperCase(locale), format, locale, valid); + } } diff --git a/src/test/java/org/apache/commons/lang3/time/FastDateParserTest.java b/src/test/java/org/apache/commons/lang3/time/FastDateParserTest.java index e61d9c291..b9a00a384 100644 --- a/src/test/java/org/apache/commons/lang3/time/FastDateParserTest.java +++ b/src/test/java/org/apache/commons/lang3/time/FastDateParserTest.java @@ -95,6 +95,28 @@ private enum Expected1806 { private static final Locale SWEDEN = new Locale("sv", "SE"); + static void checkParse(final Locale locale, final Calendar cal, final SimpleDateFormat simpleDateFormat, + final DateParser dateParser) { + final String formattedDate = simpleDateFormat.format(cal.getTime()); + checkParse(locale, simpleDateFormat, dateParser, formattedDate, formattedDate); + checkParse(locale, simpleDateFormat, dateParser, formattedDate.toLowerCase(locale), formattedDate); + checkParse(locale, simpleDateFormat, dateParser, formattedDate.toUpperCase(locale), formattedDate); + } + + static void checkParse(final Locale locale, final SimpleDateFormat simpleDateFormat, final DateParser dateParser, + final String formattedDate, final String originalFormattedDate) { + try { + final Date expectedTime = simpleDateFormat.parse(formattedDate); + final Date actualTime = dateParser.parse(formattedDate); + assertEquals(expectedTime, actualTime, + "locale: " + locale + ", formattedDate: '" + formattedDate + "', originalFormattedDate: '" + + originalFormattedDate + ", simpleDateFormat.pattern: '" + simpleDateFormat + "', Java: " + + SystemUtils.JAVA_RUNTIME_VERSION + "\n"); + } catch (final Exception e) { + fail("locale: " + locale + ", formattedDate: '" + formattedDate + "', error : " + e + "\n", e); + } + } + static Stream dateParserParameters() { return Stream.of( // @formatter:off @@ -120,28 +142,6 @@ private static Calendar initializeCalendar(final TimeZone timeZone) { private final TriFunction dateParserProvider = (format, timeZone, locale) -> new FastDateParser(format, timeZone, locale, null); - static void checkParse(final Locale locale, final Calendar cal, final SimpleDateFormat simpleDateFormat, - final DateParser dateParser) { - final String formattedDate = simpleDateFormat.format(cal.getTime()); - checkParse(locale, simpleDateFormat, dateParser, formattedDate, formattedDate); - checkParse(locale, simpleDateFormat, dateParser, formattedDate.toLowerCase(locale), formattedDate); - checkParse(locale, simpleDateFormat, dateParser, formattedDate.toUpperCase(locale), formattedDate); - } - - static void checkParse(final Locale locale, final SimpleDateFormat simpleDateFormat, final DateParser dateParser, - final String formattedDate, final String originalFormattedDate) { - try { - final Date expectedTime = simpleDateFormat.parse(formattedDate); - final Date actualTime = dateParser.parse(formattedDate); - assertEquals(expectedTime, actualTime, - "locale: " + locale + ", formattedDate: '" + formattedDate + "', originalFormattedDate: '" - + originalFormattedDate + ", simpleDateFormat.pattern: '" + simpleDateFormat + "', Java: " - + SystemUtils.JAVA_RUNTIME_VERSION + "\n"); - } catch (final Exception e) { - fail("locale: " + locale + ", formattedDate: '" + formattedDate + "', error : " + e + "\n", e); - } - } - private DateParser getDateInstance(final int dateStyle, final Locale locale) { return getInstance(null, FormatCache.getPatternForStyle(Integer.valueOf(dateStyle), null, locale), TimeZone.getDefault(), Locale.getDefault()); diff --git a/src/test/java/org/apache/commons/lang3/time/FastDateParser_MoreOrLessTest.java b/src/test/java/org/apache/commons/lang3/time/FastDateParser_MoreOrLessTest.java index 56a0b0f59..a3d4978c4 100644 --- a/src/test/java/org/apache/commons/lang3/time/FastDateParser_MoreOrLessTest.java +++ b/src/test/java/org/apache/commons/lang3/time/FastDateParser_MoreOrLessTest.java @@ -32,6 +32,27 @@ public class FastDateParser_MoreOrLessTest { private static final TimeZone NEW_YORK = TimeZone.getTimeZone("America/New_York"); + @Test + public void testInputHasLessCharacters() { + final FastDateParser parser = new FastDateParser("MM/dd/yyy", TimeZone.getDefault(), Locale.getDefault()); + final ParsePosition parsePosition = new ParsePosition(0); + assertNull(parser.parse("03/23", parsePosition)); + assertEquals(5, parsePosition.getErrorIndex()); + } + + @Test + public void testInputHasMoreCharacters() { + final FastDateParser parser = new FastDateParser("MM/dd", TimeZone.getDefault(), Locale.getDefault()); + final ParsePosition parsePosition = new ParsePosition(0); + final Date date = parser.parse("3/23/61", parsePosition); + assertEquals(4, parsePosition.getIndex()); + + final Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + assertEquals(2, calendar.get(Calendar.MONTH)); + assertEquals(23, calendar.get(Calendar.DATE)); + } + @Test public void testInputHasPrecedingCharacters() { final FastDateParser parser = new FastDateParser("MM/dd", TimeZone.getDefault(), Locale.getDefault()); @@ -57,19 +78,6 @@ public void testInputHasWhitespace() { assertEquals(23, calendar.get(Calendar.DATE)); } - @Test - public void testInputHasMoreCharacters() { - final FastDateParser parser = new FastDateParser("MM/dd", TimeZone.getDefault(), Locale.getDefault()); - final ParsePosition parsePosition = new ParsePosition(0); - final Date date = parser.parse("3/23/61", parsePosition); - assertEquals(4, parsePosition.getIndex()); - - final Calendar calendar = Calendar.getInstance(); - calendar.setTime(date); - assertEquals(2, calendar.get(Calendar.MONTH)); - assertEquals(23, calendar.get(Calendar.DATE)); - } - @Test public void testInputHasWrongCharacters() { final FastDateParser parser = new FastDateParser("MM-dd-yyy", TimeZone.getDefault(), Locale.getDefault()); @@ -79,11 +87,16 @@ public void testInputHasWrongCharacters() { } @Test - public void testInputHasLessCharacters() { - final FastDateParser parser = new FastDateParser("MM/dd/yyy", TimeZone.getDefault(), Locale.getDefault()); + public void testInputHasWrongDay() { + final FastDateParser parser = new FastDateParser("EEEE, MM/dd/yyy", NEW_YORK, Locale.US); + final String input = "Thursday, 03/23/61"; final ParsePosition parsePosition = new ParsePosition(0); - assertNull(parser.parse("03/23", parsePosition)); - assertEquals(5, parsePosition.getErrorIndex()); + assertNotNull(parser.parse(input, parsePosition)); + assertEquals(input.length(), parsePosition.getIndex()); + + parsePosition.setIndex(0); + assertNull(parser.parse( "Thorsday, 03/23/61", parsePosition)); + assertEquals(0, parsePosition.getErrorIndex()); } @Test @@ -99,17 +112,4 @@ public void testInputHasWrongTimeZone() { assertNull(parser.parse( "11:23 Pacific Standard ", parsePosition)); assertEquals(6, parsePosition.getErrorIndex()); } - - @Test - public void testInputHasWrongDay() { - final FastDateParser parser = new FastDateParser("EEEE, MM/dd/yyy", NEW_YORK, Locale.US); - final String input = "Thursday, 03/23/61"; - final ParsePosition parsePosition = new ParsePosition(0); - assertNotNull(parser.parse(input, parsePosition)); - assertEquals(input.length(), parsePosition.getIndex()); - - parsePosition.setIndex(0); - assertNull(parser.parse( "Thorsday, 03/23/61", parsePosition)); - assertEquals(0, parsePosition.getErrorIndex()); - } } diff --git a/src/test/java/org/apache/commons/lang3/time/FastDateParser_TimeZoneStrategyTest.java b/src/test/java/org/apache/commons/lang3/time/FastDateParser_TimeZoneStrategyTest.java index d2f106ec4..4cd6835d9 100644 --- a/src/test/java/org/apache/commons/lang3/time/FastDateParser_TimeZoneStrategyTest.java +++ b/src/test/java/org/apache/commons/lang3/time/FastDateParser_TimeZoneStrategyTest.java @@ -30,6 +30,15 @@ class FastDateParser_TimeZoneStrategyTest { + @Test + void testLang1219() throws ParseException { + final FastDateParser parser = new FastDateParser("dd.MM.yyyy HH:mm:ss z", TimeZone.getDefault(), Locale.GERMAN); + + final Date summer = parser.parse("26.10.2014 02:00:00 MESZ"); + final Date standard = parser.parse("26.10.2014 02:00:00 MEZ"); + assertNotEquals(summer.getTime(), standard.getTime()); + } + @ParameterizedTest @MethodSource("java.util.Locale#getAvailableLocales") void testTimeZoneStrategyPattern(final Locale locale) throws ParseException { @@ -46,13 +55,4 @@ void testTimeZoneStrategyPattern(final Locale locale) throws ParseException { } } } - - @Test - void testLang1219() throws ParseException { - final FastDateParser parser = new FastDateParser("dd.MM.yyyy HH:mm:ss z", TimeZone.getDefault(), Locale.GERMAN); - - final Date summer = parser.parse("26.10.2014 02:00:00 MESZ"); - final Date standard = parser.parse("26.10.2014 02:00:00 MEZ"); - assertNotEquals(summer.getTime(), standard.getTime()); - } } diff --git a/src/test/java/org/apache/commons/lang3/time/FastDatePrinterTest.java b/src/test/java/org/apache/commons/lang3/time/FastDatePrinterTest.java index 13ba5fe03..f3511a51e 100644 --- a/src/test/java/org/apache/commons/lang3/time/FastDatePrinterTest.java +++ b/src/test/java/org/apache/commons/lang3/time/FastDatePrinterTest.java @@ -42,20 +42,49 @@ */ public class FastDatePrinterTest { + private enum Expected1806 { + India(INDIA, "+05", "+0530", "+05:30"), Greenwich(GMT, "Z", "Z", "Z"), NewYork( + NEW_YORK, "-05", "-0500", "-05:00"); + + final TimeZone zone; + + final String one; + final String two; + final String three; + Expected1806(final TimeZone zone, final String one, final String two, final String three) { + this.zone = zone; + this.one = one; + this.two = two; + this.three = three; + } + } private static final String YYYY_MM_DD = "yyyy/MM/dd"; private static final TimeZone NEW_YORK = TimeZone.getTimeZone("America/New_York"); private static final TimeZone GMT = TimeZone.getTimeZone("GMT"); private static final TimeZone INDIA = TimeZone.getTimeZone("Asia/Calcutta"); + private static final Locale SWEDEN = new Locale("sv", "SE"); - DatePrinter getInstance(final String format) { - return getInstance(format, TimeZone.getDefault(), Locale.getDefault()); + private static Calendar initializeCalendar(final TimeZone tz) { + final Calendar cal = Calendar.getInstance(tz); + cal.set(Calendar.YEAR, 2001); + cal.set(Calendar.MONTH, 1); // not daylight savings + cal.set(Calendar.DAY_OF_MONTH, 4); + cal.set(Calendar.HOUR_OF_DAY, 12); + cal.set(Calendar.MINUTE, 8); + cal.set(Calendar.SECOND, 56); + cal.set(Calendar.MILLISECOND, 235); + return cal; } private DatePrinter getDateInstance(final int dateStyle, final Locale locale) { return getInstance(FormatCache.getPatternForStyle(Integer.valueOf(dateStyle), null, locale), TimeZone.getDefault(), Locale.getDefault()); } + DatePrinter getInstance(final String format) { + return getInstance(format, TimeZone.getDefault(), Locale.getDefault()); + } + private DatePrinter getInstance(final String format, final Locale locale) { return getInstance(format, TimeZone.getDefault(), locale); } @@ -75,6 +104,68 @@ protected DatePrinter getInstance(final String format, final TimeZone timeZone, return new FastDatePrinter(format, timeZone, locale); } + @Test + public void test1806() { + for (final Expected1806 trial : Expected1806.values()) { + final Calendar cal = initializeCalendar(trial.zone); + + DatePrinter printer = getInstance("X", trial.zone); + assertEquals(trial.one, printer.format(cal)); + + printer = getInstance("XX", trial.zone); + assertEquals(trial.two, printer.format(cal)); + + printer = getInstance("XXX", trial.zone); + assertEquals(trial.three, printer.format(cal)); + } + } + @Test + public void test1806Argument() { + assertThrows(IllegalArgumentException.class, () -> getInstance("XXXX")); + } + + @Test + public void testAppendableOptions() { + final DatePrinter format = getInstance("yyyy-MM-dd HH:mm:ss.SSS Z", TimeZone.getTimeZone("GMT")); + final Calendar calendar = Calendar.getInstance(); + final StringBuilder sb = new StringBuilder(); + final String expected = format.format(calendar, sb).toString(); + sb.setLength(0); + + final Date date = calendar.getTime(); + assertEquals(expected, format.format(date, sb).toString()); + sb.setLength(0); + + final long epoch = date.getTime(); + assertEquals(expected, format.format(epoch, sb).toString()); + } + + @Test + public void testDayNumberOfWeek() { + final DatePrinter printer = getInstance("u"); + final Calendar calendar = Calendar.getInstance(); + + calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); + assertEquals("1", printer.format(calendar.getTime())); + + calendar.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY); + assertEquals("6", printer.format(calendar.getTime())); + + calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); + assertEquals("7", printer.format(calendar.getTime())); + } + + @Test + public void testEquals() { + final DatePrinter printer1= getInstance(YYYY_MM_DD); + final DatePrinter printer2= getInstance(YYYY_MM_DD); + + assertEquals(printer1, printer2); + assertEquals(printer1.hashCode(), printer2.hashCode()); + + assertNotEquals(printer1, new Object()); + } + @DefaultLocale(language = "en", country = "US") @DefaultTimeZone("America/New_York") @Test @@ -123,67 +214,32 @@ public void testFormat() { assertEquals(sdf.format(date2).replaceAll("2003 03 03 03", "2003 2003 03 2003"), fdf.format(date2)); } - /** - * Test case for {@link FastDateParser#FastDateParser(String, TimeZone, Locale)}. - */ @Test - public void testShortDateStyleWithLocales() { - final Locale usLocale = Locale.US; - final Locale swedishLocale = new Locale("sv", "SE"); - final Calendar cal = Calendar.getInstance(); - cal.set(2004, Calendar.FEBRUARY, 3); - DatePrinter fdf = getDateInstance(FastDateFormat.SHORT, usLocale); - assertEquals("2/3/04", fdf.format(cal)); + public void testHourFormats() { + final Calendar calendar = Calendar.getInstance(); + calendar.clear(); + final DatePrinter printer = getInstance("K k H h"); - fdf = getDateInstance(FastDateFormat.SHORT, swedishLocale); - assertEquals("2004-02-03", fdf.format(cal)); + calendar.set(Calendar.HOUR_OF_DAY, 0); + assertEquals("0 24 0 12", printer.format(calendar)); + calendar.set(Calendar.HOUR_OF_DAY, 12); + assertEquals("0 12 12 12", printer.format(calendar)); + + calendar.set(Calendar.HOUR_OF_DAY, 23); + assertEquals("11 23 23 11", printer.format(calendar)); } - /** - * Tests that pre-1000AD years get padded with yyyy - */ @Test - public void testLowYearPadding() { - final Calendar cal = Calendar.getInstance(); - final DatePrinter format = getInstance(YYYY_MM_DD); + public void testLang1103() { + final Calendar cal = Calendar.getInstance(SWEDEN); + cal.set(Calendar.DAY_OF_MONTH, 2); - cal.set(1, Calendar.JANUARY, 1); - assertEquals("0001/01/01", format.format(cal)); - cal.set(10, Calendar.JANUARY, 1); - assertEquals("0010/01/01", format.format(cal)); - cal.set(100, Calendar.JANUARY, 1); - assertEquals("0100/01/01", format.format(cal)); - cal.set(999, Calendar.JANUARY, 1); - assertEquals("0999/01/01", format.format(cal)); - } - /** - * Show Bug #39410 is solved - */ - @Test - public void testMilleniumBug() { - final Calendar cal = Calendar.getInstance(); - final DatePrinter format = getInstance("dd.MM.yyyy"); - - cal.set(1000, Calendar.JANUARY, 1); - assertEquals("01.01.1000", format.format(cal)); - } - - /** - * testLowYearPadding showed that the date was buggy - * This test confirms it, getting 366 back as a date - */ - @Test - public void testSimpleDate() { - final Calendar cal = Calendar.getInstance(); - final DatePrinter format = getInstance(YYYY_MM_DD); - - cal.set(2004, Calendar.DECEMBER, 31); - assertEquals("2004/12/31", format.format(cal)); - cal.set(999, Calendar.DECEMBER, 31); - assertEquals("0999/12/31", format.format(cal)); - cal.set(1, Calendar.MARCH, 2); - assertEquals("0001/03/02", format.format(cal)); + assertEquals("2", getInstance("d", SWEDEN).format(cal)); + assertEquals("02", getInstance("dd", SWEDEN).format(cal)); + assertEquals("002", getInstance("ddd", SWEDEN).format(cal)); + assertEquals("0002", getInstance("dddd", SWEDEN).format(cal)); + assertEquals("00002", getInstance("ddddd", SWEDEN).format(cal)); } @Test @@ -224,117 +280,6 @@ public void testLang645() { assertEquals("fredag, week 53", fdf.format(d)); } - @Test - public void testEquals() { - final DatePrinter printer1= getInstance(YYYY_MM_DD); - final DatePrinter printer2= getInstance(YYYY_MM_DD); - - assertEquals(printer1, printer2); - assertEquals(printer1.hashCode(), printer2.hashCode()); - - assertNotEquals(printer1, new Object()); - } - - @Test - public void testToStringContainsName() { - final DatePrinter printer= getInstance(YYYY_MM_DD); - assertTrue(printer.toString().startsWith("FastDate")); - } - - @Test - public void testPatternMatches() { - final DatePrinter printer= getInstance(YYYY_MM_DD); - assertEquals(YYYY_MM_DD, printer.getPattern()); - } - - @Test - public void testLocaleMatches() { - final DatePrinter printer= getInstance(YYYY_MM_DD, SWEDEN); - assertEquals(SWEDEN, printer.getLocale()); - } - - @Test - public void testTimeZoneMatches() { - final DatePrinter printer= getInstance(YYYY_MM_DD, NEW_YORK); - assertEquals(NEW_YORK, printer.getTimeZone()); - } - - @DefaultTimeZone("UTC") - @Test - public void testTimeZoneAsZ() { - final Calendar c = Calendar.getInstance(FastTimeZone.getGmtTimeZone()); - final FastDateFormat noColonFormat = FastDateFormat.getInstance("Z"); - assertEquals("+0000", noColonFormat.format(c)); - - final FastDateFormat isoFormat = FastDateFormat.getInstance("ZZ"); - assertEquals("Z", isoFormat.format(c)); - - final FastDateFormat colonFormat = FastDateFormat.getInstance("ZZZ"); - assertEquals("+00:00", colonFormat.format(c)); - } - - private static Calendar initializeCalendar(final TimeZone tz) { - final Calendar cal = Calendar.getInstance(tz); - cal.set(Calendar.YEAR, 2001); - cal.set(Calendar.MONTH, 1); // not daylight savings - cal.set(Calendar.DAY_OF_MONTH, 4); - cal.set(Calendar.HOUR_OF_DAY, 12); - cal.set(Calendar.MINUTE, 8); - cal.set(Calendar.SECOND, 56); - cal.set(Calendar.MILLISECOND, 235); - return cal; - } - - @Test - public void test1806Argument() { - assertThrows(IllegalArgumentException.class, () -> getInstance("XXXX")); - } - - private enum Expected1806 { - India(INDIA, "+05", "+0530", "+05:30"), Greenwich(GMT, "Z", "Z", "Z"), NewYork( - NEW_YORK, "-05", "-0500", "-05:00"); - - Expected1806(final TimeZone zone, final String one, final String two, final String three) { - this.zone = zone; - this.one = one; - this.two = two; - this.three = three; - } - - final TimeZone zone; - final String one; - final String two; - final String three; - } - - @Test - public void test1806() { - for (final Expected1806 trial : Expected1806.values()) { - final Calendar cal = initializeCalendar(trial.zone); - - DatePrinter printer = getInstance("X", trial.zone); - assertEquals(trial.one, printer.format(cal)); - - printer = getInstance("XX", trial.zone); - assertEquals(trial.two, printer.format(cal)); - - printer = getInstance("XXX", trial.zone); - assertEquals(trial.three, printer.format(cal)); - } - } - - @Test - public void testLang1103() { - final Calendar cal = Calendar.getInstance(SWEDEN); - cal.set(Calendar.DAY_OF_MONTH, 2); - - assertEquals("2", getInstance("d", SWEDEN).format(cal)); - assertEquals("02", getInstance("dd", SWEDEN).format(cal)); - assertEquals("002", getInstance("ddd", SWEDEN).format(cal)); - assertEquals("0002", getInstance("dddd", SWEDEN).format(cal)); - assertEquals("00002", getInstance("ddddd", SWEDEN).format(cal)); - } - /** * According to LANG-916 (https://issues.apache.org/jira/browse/LANG-916), * the format method did contain a bug: it did not use the TimeZone data. @@ -364,19 +309,79 @@ public void testLang916() { } @Test - public void testHourFormats() { - final Calendar calendar = Calendar.getInstance(); - calendar.clear(); - final DatePrinter printer = getInstance("K k H h"); + public void testLocaleMatches() { + final DatePrinter printer= getInstance(YYYY_MM_DD, SWEDEN); + assertEquals(SWEDEN, printer.getLocale()); + } - calendar.set(Calendar.HOUR_OF_DAY, 0); - assertEquals("0 24 0 12", printer.format(calendar)); + /** + * Tests that pre-1000AD years get padded with yyyy + */ + @Test + public void testLowYearPadding() { + final Calendar cal = Calendar.getInstance(); + final DatePrinter format = getInstance(YYYY_MM_DD); - calendar.set(Calendar.HOUR_OF_DAY, 12); - assertEquals("0 12 12 12", printer.format(calendar)); + cal.set(1, Calendar.JANUARY, 1); + assertEquals("0001/01/01", format.format(cal)); + cal.set(10, Calendar.JANUARY, 1); + assertEquals("0010/01/01", format.format(cal)); + cal.set(100, Calendar.JANUARY, 1); + assertEquals("0100/01/01", format.format(cal)); + cal.set(999, Calendar.JANUARY, 1); + assertEquals("0999/01/01", format.format(cal)); + } - calendar.set(Calendar.HOUR_OF_DAY, 23); - assertEquals("11 23 23 11", printer.format(calendar)); + /** + * Show Bug #39410 is solved + */ + @Test + public void testMilleniumBug() { + final Calendar cal = Calendar.getInstance(); + final DatePrinter format = getInstance("dd.MM.yyyy"); + + cal.set(1000, Calendar.JANUARY, 1); + assertEquals("01.01.1000", format.format(cal)); + } + + @Test + public void testPatternMatches() { + final DatePrinter printer= getInstance(YYYY_MM_DD); + assertEquals(YYYY_MM_DD, printer.getPattern()); + } + + /** + * Test case for {@link FastDateParser#FastDateParser(String, TimeZone, Locale)}. + */ + @Test + public void testShortDateStyleWithLocales() { + final Locale usLocale = Locale.US; + final Locale swedishLocale = new Locale("sv", "SE"); + final Calendar cal = Calendar.getInstance(); + cal.set(2004, Calendar.FEBRUARY, 3); + DatePrinter fdf = getDateInstance(FastDateFormat.SHORT, usLocale); + assertEquals("2/3/04", fdf.format(cal)); + + fdf = getDateInstance(FastDateFormat.SHORT, swedishLocale); + assertEquals("2004-02-03", fdf.format(cal)); + + } + + /** + * testLowYearPadding showed that the date was buggy + * This test confirms it, getting 366 back as a date + */ + @Test + public void testSimpleDate() { + final Calendar cal = Calendar.getInstance(); + final DatePrinter format = getInstance(YYYY_MM_DD); + + cal.set(2004, Calendar.DECEMBER, 31); + assertEquals("2004/12/31", format.format(cal)); + cal.set(999, Calendar.DECEMBER, 31); + assertEquals("0999/12/31", format.format(cal)); + cal.set(1, Calendar.MARCH, 2); + assertEquals("0001/03/02", format.format(cal)); } @SuppressWarnings("deprecation") @@ -402,35 +407,30 @@ public void testStringBufferOptions() { assertEquals(expected, format.format(epoch, sb).toString()); } + @DefaultTimeZone("UTC") @Test - public void testAppendableOptions() { - final DatePrinter format = getInstance("yyyy-MM-dd HH:mm:ss.SSS Z", TimeZone.getTimeZone("GMT")); - final Calendar calendar = Calendar.getInstance(); - final StringBuilder sb = new StringBuilder(); - final String expected = format.format(calendar, sb).toString(); - sb.setLength(0); + public void testTimeZoneAsZ() { + final Calendar c = Calendar.getInstance(FastTimeZone.getGmtTimeZone()); + final FastDateFormat noColonFormat = FastDateFormat.getInstance("Z"); + assertEquals("+0000", noColonFormat.format(c)); - final Date date = calendar.getTime(); - assertEquals(expected, format.format(date, sb).toString()); - sb.setLength(0); + final FastDateFormat isoFormat = FastDateFormat.getInstance("ZZ"); + assertEquals("Z", isoFormat.format(c)); - final long epoch = date.getTime(); - assertEquals(expected, format.format(epoch, sb).toString()); + final FastDateFormat colonFormat = FastDateFormat.getInstance("ZZZ"); + assertEquals("+00:00", colonFormat.format(c)); } @Test - public void testDayNumberOfWeek() { - final DatePrinter printer = getInstance("u"); - final Calendar calendar = Calendar.getInstance(); + public void testTimeZoneMatches() { + final DatePrinter printer= getInstance(YYYY_MM_DD, NEW_YORK); + assertEquals(NEW_YORK, printer.getTimeZone()); + } - calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); - assertEquals("1", printer.format(calendar.getTime())); - - calendar.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY); - assertEquals("6", printer.format(calendar.getTime())); - - calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); - assertEquals("7", printer.format(calendar.getTime())); + @Test + public void testToStringContainsName() { + final DatePrinter printer= getInstance(YYYY_MM_DD); + assertTrue(printer.toString().startsWith("FastDate")); } @DefaultLocale(language = "en", country = "US") diff --git a/src/test/java/org/apache/commons/lang3/time/FastTimeZoneTest.java b/src/test/java/org/apache/commons/lang3/time/FastTimeZoneTest.java index 70e8d0d4c..69ced394b 100644 --- a/src/test/java/org/apache/commons/lang3/time/FastTimeZoneTest.java +++ b/src/test/java/org/apache/commons/lang3/time/FastTimeZoneTest.java @@ -32,35 +32,14 @@ public class FastTimeZoneTest { private static final int MINUTES_59 = 59 * 60 * 1000; private static final int MINUTES_5 = 5 * 60 * 1000; - @Test - public void testGetGmtTimeZone() { - assertEquals(0, FastTimeZone.getGmtTimeZone().getRawOffset()); - } - @Test public void testBareGmt() { assertEquals(FastTimeZone.getGmtTimeZone(), FastTimeZone.getTimeZone("GMT")); } @Test - public void testZ() { - assertEquals(FastTimeZone.getGmtTimeZone(), FastTimeZone.getTimeZone("Z")); - } - - @Test - public void testUTC() { - assertEquals(FastTimeZone.getGmtTimeZone(), FastTimeZone.getTimeZone("UTC")); - } - - @Test - public void testZeroOffsetsReturnSingleton() { - assertEquals(FastTimeZone.getGmtTimeZone(), FastTimeZone.getTimeZone("+0")); - assertEquals(FastTimeZone.getGmtTimeZone(), FastTimeZone.getTimeZone("-0")); - } - - @Test - public void testOlson() { - assertEquals(TimeZone.getTimeZone("America/New_York"), FastTimeZone.getTimeZone("America/New_York")); + public void testGetGmtTimeZone() { + assertEquals(0, FastTimeZone.getGmtTimeZone().getRawOffset()); } @Test @@ -69,14 +48,6 @@ public void testGmtPrefix() { assertEquals(-HOURS_23, FastTimeZone.getGmtTimeZone("GMT-23:00").getRawOffset()); } - @Test - public void testSign() { - assertEquals(HOURS_23, FastTimeZone.getGmtTimeZone("+23:00").getRawOffset()); - assertEquals(HOURS_2, FastTimeZone.getGmtTimeZone("+2:00").getRawOffset()); - assertEquals(-HOURS_23, FastTimeZone.getGmtTimeZone("-23:00").getRawOffset()); - assertEquals(-HOURS_2, FastTimeZone.getGmtTimeZone("-2:00").getRawOffset()); - } - @Test public void testHoursColonMinutes() { assertEquals(HOURS_23, FastTimeZone.getGmtTimeZone("23:00").getRawOffset()); @@ -97,4 +68,33 @@ public void testHoursMinutes() { assertEquals(HOURS_2+MINUTES_5, FastTimeZone.getGmtTimeZone("0205").getRawOffset()); } + @Test + public void testOlson() { + assertEquals(TimeZone.getTimeZone("America/New_York"), FastTimeZone.getTimeZone("America/New_York")); + } + + @Test + public void testSign() { + assertEquals(HOURS_23, FastTimeZone.getGmtTimeZone("+23:00").getRawOffset()); + assertEquals(HOURS_2, FastTimeZone.getGmtTimeZone("+2:00").getRawOffset()); + assertEquals(-HOURS_23, FastTimeZone.getGmtTimeZone("-23:00").getRawOffset()); + assertEquals(-HOURS_2, FastTimeZone.getGmtTimeZone("-2:00").getRawOffset()); + } + + @Test + public void testUTC() { + assertEquals(FastTimeZone.getGmtTimeZone(), FastTimeZone.getTimeZone("UTC")); + } + + @Test + public void testZ() { + assertEquals(FastTimeZone.getGmtTimeZone(), FastTimeZone.getTimeZone("Z")); + } + + @Test + public void testZeroOffsetsReturnSingleton() { + assertEquals(FastTimeZone.getGmtTimeZone(), FastTimeZone.getTimeZone("+0")); + assertEquals(FastTimeZone.getGmtTimeZone(), FastTimeZone.getTimeZone("-0")); + } + } diff --git a/src/test/java/org/apache/commons/lang3/time/GmtTimeZoneTest.java b/src/test/java/org/apache/commons/lang3/time/GmtTimeZoneTest.java index 3fa99e096..c55362135 100644 --- a/src/test/java/org/apache/commons/lang3/time/GmtTimeZoneTest.java +++ b/src/test/java/org/apache/commons/lang3/time/GmtTimeZoneTest.java @@ -27,41 +27,6 @@ */ public class GmtTimeZoneTest { - @Test - public void hoursOutOfRange() { - assertThrows(IllegalArgumentException.class, () -> new GmtTimeZone(false, 24, 0)); - } - - @Test - public void hoursInRange() { - assertEquals(23 * 60 * 60 * 1000, new GmtTimeZone(false, 23, 0).getRawOffset()); - } - - @Test - public void minutesOutOfRange() { - assertThrows(IllegalArgumentException.class, () -> new GmtTimeZone(false, 0, 60)); - } - - @Test - public void minutesInRange() { - assertEquals(59 * 60 * 1000, new GmtTimeZone(false, 0, 59).getRawOffset()); - } - - @Test - public void getOffset() { - assertEquals(0, new GmtTimeZone(false, 0, 0).getOffset(234304)); - } - - @Test - public void setRawOffset() { - assertThrows(UnsupportedOperationException.class, () -> new GmtTimeZone(false, 0, 0).setRawOffset(0)); - } - - @Test - public void getRawOffset() { - assertEquals(0, new GmtTimeZone(false, 0, 0).getRawOffset()); - } - @Test public void getID() { assertEquals("GMT+00:00", new GmtTimeZone(false, 0, 0).getID()); @@ -72,8 +37,23 @@ public void getID() { } @Test - public void useDaylightTime() { - assertFalse(new GmtTimeZone(false, 0, 0).useDaylightTime()); + public void getOffset() { + assertEquals(0, new GmtTimeZone(false, 0, 0).getOffset(234304)); + } + + @Test + public void getRawOffset() { + assertEquals(0, new GmtTimeZone(false, 0, 0).getRawOffset()); + } + + @Test + public void hoursInRange() { + assertEquals(23 * 60 * 60 * 1000, new GmtTimeZone(false, 23, 0).getRawOffset()); + } + + @Test + public void hoursOutOfRange() { + assertThrows(IllegalArgumentException.class, () -> new GmtTimeZone(false, 24, 0)); } @Test @@ -81,6 +61,27 @@ public void inDaylightTime() { assertFalse(new GmtTimeZone(false, 0, 0).useDaylightTime()); } + @Test + public void minutesInRange() { + assertEquals(59 * 60 * 1000, new GmtTimeZone(false, 0, 59).getRawOffset()); + } + + @Test + public void minutesOutOfRange() { + assertThrows(IllegalArgumentException.class, () -> new GmtTimeZone(false, 0, 60)); + } + + @Test + public void setRawOffset() { + assertThrows(UnsupportedOperationException.class, () -> new GmtTimeZone(false, 0, 0).setRawOffset(0)); + } + + @Test + public void testGetOffset() { + assertEquals(-(6 * 60 + 30) * 60 * 1000, + new GmtTimeZone(true, 6, 30).getOffset(1, 1, 1, 1, 1, 1)); + } + @Test public void testToString() { assertEquals("[GmtTimeZone id=\"GMT-12:00\",offset=-43200000]", @@ -88,8 +89,7 @@ public void testToString() { } @Test - public void testGetOffset() { - assertEquals(-(6 * 60 + 30) * 60 * 1000, - new GmtTimeZone(true, 6, 30).getOffset(1, 1, 1, 1, 1, 1)); + public void useDaylightTime() { + assertFalse(new GmtTimeZone(false, 0, 0).useDaylightTime()); } } diff --git a/src/test/java/org/apache/commons/lang3/time/StopWatchTest.java b/src/test/java/org/apache/commons/lang3/time/StopWatchTest.java index 2eceff432..290be10cd 100644 --- a/src/test/java/org/apache/commons/lang3/time/StopWatchTest.java +++ b/src/test/java/org/apache/commons/lang3/time/StopWatchTest.java @@ -215,6 +215,20 @@ public void testMessage() { assertTrue(stopWatch.toSplitString().startsWith(MESSAGE)); } + @Test + public void testStopTimeSimple() throws InterruptedException { + final StopWatch watch = StopWatch.createStarted(); + final long testStartMillis = System.currentTimeMillis(); + sleepQuietly(MILLIS_550); + watch.stop(); + final long testEndMillis = System.currentTimeMillis(); + final long stopTime = watch.getStopTime(); + assertEquals(stopTime, watch.getStopTime()); + + assertTrue(stopTime >= testStartMillis); + assertTrue(stopTime <= testEndMillis); + } + @Test public void testStopWatchGetWithTimeUnit() { // Create a mock StopWatch with a time of 2:59:01.999 @@ -247,20 +261,6 @@ public void testStopWatchSimple() throws InterruptedException { assertEquals(0, watch.getTime()); } - @Test - public void testStopTimeSimple() throws InterruptedException { - final StopWatch watch = StopWatch.createStarted(); - final long testStartMillis = System.currentTimeMillis(); - sleepQuietly(MILLIS_550); - watch.stop(); - final long testEndMillis = System.currentTimeMillis(); - final long stopTime = watch.getStopTime(); - assertEquals(stopTime, watch.getStopTime()); - - assertTrue(stopTime >= testStartMillis); - assertTrue(stopTime <= testEndMillis); - } - @Test public void testStopWatchSimpleGet() throws InterruptedException { final StopWatch watch = new StopWatch();