package uws; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import java.text.ParseException; import java.util.TimeZone; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; public class TestISO8601Format { private final long date = 1411737870325L; // Fri Sep 26 15:24:30 CEST 2014 = 2014-09-26T15:24:30.325+02:00 = 1411737870325 ms private final long dateAlone = 1411689600000L; private final long dateWithNoTime = 1449792000000L; // Fri Dec 11 2015 = 2015-12-11 = 1449792000000 ms private final long oldDate = -3506029200000L; // Thu Nov 25 00:00:00 CET 1858 = 1858-11-25T00:00:00+01:00 = -3506029200000 ms private static boolean displayMS; private static boolean displayTZ; private static String targetTZ = null; @BeforeClass public static void setUpBeforeClass() throws Exception{ displayMS = ISO8601Format.displayMilliseconds; displayTZ = ISO8601Format.displayTimeZone; targetTZ = ISO8601Format.targetTimeZone; } @Before public void setUp() throws Exception{ ISO8601Format.displayMilliseconds = false; ISO8601Format.displayTimeZone = true; ISO8601Format.targetTimeZone = "Europe/Berlin"; } @AfterClass public static void tearDownAfterClass() throws Exception{ ISO8601Format.displayMilliseconds = displayMS; ISO8601Format.displayTimeZone = displayTZ; ISO8601Format.targetTimeZone = targetTZ; } @Test public void testFormatDate(){ // Special case: reference for the millisecond representation of dates (1st January 1970): assertEquals("1970-01-01T01:00:00+01:00", ISO8601Format.format(0)); assertEquals("1970-01-01T00:00:00Z", ISO8601Format.formatInUTC(0)); // Special case: old date (25th November 1858): assertEquals("1858-11-25T00:00:00+01:00", ISO8601Format.format(oldDate)); assertEquals("1858-11-24T23:00:00Z", ISO8601Format.formatInUTC(oldDate)); // Tests of: FORMAT(Date) && FORMAT(Date, boolean withTimestamp): assertEquals("2014-09-26T15:24:30+02:00", ISO8601Format.format(date)); assertEquals(ISO8601Format.format(date), ISO8601Format.format(date, true)); assertEquals("2014-09-26T15:24:30", ISO8601Format.format(date, false)); // Tests of: FORMAT_IN_UTC(Date) && FORMAT_IN_UTC(Date, boolean withTimestamp): assertEquals("2014-09-26T13:24:30Z", ISO8601Format.formatInUTC(date)); assertEquals(ISO8601Format.formatInUTC(date), ISO8601Format.formatInUTC(date, true)); assertEquals("2014-09-26T13:24:30", ISO8601Format.formatInUTC(date, false)); // Test with a different time zone: assertEquals("2014-09-26T17:24:30+04:00", ISO8601Format.format(date, "Indian/Reunion", true, false)); // Test with no specified different time zone (the chosen time zone should be the local one): assertEquals(ISO8601Format.format(date, TimeZone.getDefault().getID(), true, false), ISO8601Format.format(date, null, true, false)); // Test with display of milliseconds: assertEquals("2014-09-26T15:24:30.325+02:00", ISO8601Format.format(date, null, true, true)); assertEquals("2014-09-26T15:24:30.325", ISO8601Format.format(date, null, false, true)); // Same tests but in the UTC time zone: assertEquals("2014-09-26T13:24:30.325Z", ISO8601Format.format(date, "UTC", true, true)); assertEquals("2014-09-26T13:24:30.325", ISO8601Format.format(date, "UTC", false, true)); } @Test public void testParse(){ // Special case: NULL try{ ISO8601Format.parse(null); fail("Parse can not theoretically work without a string"); }catch(Throwable t){ assertEquals(NullPointerException.class, t.getClass()); } // Special case: "" try{ ISO8601Format.parse(""); fail("Parse can not theoretically work without a non-empty string"); }catch(Throwable t){ assertEquals(ParseException.class, t.getClass()); assertEquals("Invalid date format: \"\"! An ISO8601 date was expected.", t.getMessage()); } // Special case: anything stupid rather than a valid date try{ ISO8601Format.parse("stupid thing"); fail("Parse can not theoretically work without a valid string date"); }catch(Throwable t){ assertEquals(ParseException.class, t.getClass()); assertEquals("Invalid date format: \"stupid thing\"! An ISO8601 date was expected.", t.getMessage()); } try{ // Special case: reference for the millisecond representation of dates (1st January 1970): assertEquals(0, ISO8601Format.parse("1970-01-01T01:00:00+01:00")); assertEquals(0, ISO8601Format.parse("1970-01-01T00:00:00Z")); // Special case: old date (25th November 1858): assertEquals(oldDate, ISO8601Format.parse("1858-11-25T00:00:00+01:00")); assertEquals(oldDate, ISO8601Format.parse("1858-11-24T23:00:00Z")); // Test with a date expressed in weeks: assertEquals(dateWithNoTime, ISO8601Format.parse("2015-W50-5")); assertEquals(dateWithNoTime, ISO8601Format.parse("2015W505")); // Test with a date expressed in days of year: assertEquals(dateWithNoTime, ISO8601Format.parse("2015-345")); assertEquals(dateWithNoTime, ISO8601Format.parse("2015345")); // Test with a perfectly valid date in ISO8601: assertEquals(dateAlone, ISO8601Format.parse("2014-09-26")); assertEquals(date, ISO8601Format.parse("2014-09-26T15:24:30.325+02:00")); assertEquals(date - 325, ISO8601Format.parse("2014-09-26T15:24:30+02:00")); // Test with Z as time zone (UTC): assertEquals(date, ISO8601Format.parse("2014-09-26T13:24:30.325Z")); assertEquals(date - 325, ISO8601Format.parse("2014-09-26T13:24:30Z")); // If no time zone is specified, the local one should be used: assertEquals(date, ISO8601Format.parse("2014-09-26T13:24:30.325")); assertEquals(date - 325, ISO8601Format.parse("2014-09-26T13:24:30")); // All the previous tests without the _ between days, month, and years: assertEquals(0, ISO8601Format.parse("19700101T01:00:00+01:00")); assertEquals(0, ISO8601Format.parse("19700101T00:00:00Z")); assertEquals(oldDate, ISO8601Format.parse("18581125T00:00:00+01:00")); assertEquals(oldDate, ISO8601Format.parse("18581124T23:00:00Z")); assertEquals(dateAlone, ISO8601Format.parse("20140926")); assertEquals(date, ISO8601Format.parse("20140926T15:24:30.325+02:00")); assertEquals(date - 325, ISO8601Format.parse("20140926T15:24:30+02:00")); assertEquals(date, ISO8601Format.parse("20140926T13:24:30.325Z")); assertEquals(date - 325, ISO8601Format.parse("20140926T13:24:30Z")); assertEquals(date, ISO8601Format.parse("20140926T13:24:30.325")); assertEquals(date - 325, ISO8601Format.parse("20140926T13:24:30")); // All the previous tests without the : between hours, minutes and seconds: assertEquals(0, ISO8601Format.parse("1970-01-01T010000+0100")); assertEquals(oldDate, ISO8601Format.parse("1858-11-25T000000+0100")); assertEquals(date, ISO8601Format.parse("2014-09-26T152430.325+0200")); assertEquals(date - 325, ISO8601Format.parse("2014-09-26T152430+0200")); // All the previous tests by replacing the T between date and time by a space: assertEquals(0, ISO8601Format.parse("1970-01-01 00:00:00Z")); assertEquals(oldDate, ISO8601Format.parse("1858-11-24 23:00:00Z")); assertEquals(date, ISO8601Format.parse("2014-09-26 13:24:30.325Z")); assertEquals(date - 325, ISO8601Format.parse("2014-09-26 13:24:30Z")); assertEquals(date, ISO8601Format.parse("2014-09-26 13:24:30.325")); assertEquals(date - 325, ISO8601Format.parse("2014-09-26 13:24:30")); // Test with only the year: YYYY assertEquals(0, ISO8601Format.parse("1970")); // Test with only the year and month: YYYY-MM assertEquals(0, ISO8601Format.parse("1970-01")); // Test with a complete date: YYYY-MM-DD assertEquals(0, ISO8601Format.parse("1970-01-01")); // Test with a complete date: YYYY-'W'ww-D assertEquals(0, ISO8601Format.parse("1970-W01-4")); // Test with a complete date plus hours: YYYY-MM-DDThh:mmTZD // ...with no time zone information: assertEquals(0, ISO8601Format.parse("1970-01-01 00")); // ...with Z: assertEquals(0, ISO8601Format.parse("1970-01-01 00Z")); // ...with time zone: assertEquals(0, ISO8601Format.parse("1970-01-01 00+00:00")); // Test with a complete date plus hours and minutes: YYYY-MM-DDThh:mmTZD // ...with no time zone information: assertEquals(0, ISO8601Format.parse("1970-01-01 00:00")); // ...with Z: assertEquals(0, ISO8601Format.parse("1970-01-01 00:00Z")); // ...with time zone: assertEquals(0, ISO8601Format.parse("1970-01-01 00:00+00")); // Test with a complete date plus hours, minutes and seconds: YYYY-MM-DDThh:mm:ssTZD // ...with no time zone information: assertEquals(0, ISO8601Format.parse("1970-01-01 00:00:00")); // ...with Z: assertEquals(0, ISO8601Format.parse("1970-01-01 00:00:00Z")); // ...with time zone: assertEquals(0, ISO8601Format.parse("1970-01-01 00:00:00-0000")); // Test with a complete date plus hours, minutes, seconds and a decimal fraction of a second: YYYY-MM-DDThh:mm:ss.sTZD // ...with no time zone information: assertEquals(0, ISO8601Format.parse("1970-01-01 00:00:00.0")); assertEquals(0, ISO8601Format.parse("1970-01-01 00:00:00.0000000")); // ...with Z: assertEquals(0, ISO8601Format.parse("1970-01-01 00:00:00.0Z")); // ...with time zone: assertEquals(0, ISO8601Format.parse("1970-01-01 00:00:00.0-00")); assertEquals(0, ISO8601Format.parse("1970-01-01 03:00:00.0+03")); assertEquals(0, ISO8601Format.parse("1970-01-01 03:00:00.0+03:00")); }catch(Exception ex){ ex.printStackTrace(System.err); fail("No error should have occured here! All date expressions are correct."); } } }