package ucar.nc2.time; import ucar.nc2.units.DateFormatter; import ucar.nc2.units.DateUnit; import ucar.units.*; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import java.util.Arrays; import java.util.Collection; import java.util.Date; /** * Test CalendarDateUnit * * @author caron * @since 3/25/11 */ @RunWith(Parameterized.class) public class TestCalendarDateUnit { DateFormatter df = new DateFormatter(); UnitFormat format = UnitFormatManager.instance(); /* http://www.w3.org/TR/NOTE-datetime.html Year: YYYY (eg 1997) Year and month: YYYY-MM (eg 1997-07) Complete date: YYYY-MM-DD (eg 1997-07-16) Complete date plus hours and minutes: YYYY-MM-DDThh:mmTZD (eg 1997-07-16T19:20+01:00) Complete date plus hours, minutes and seconds: YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00) Complete date plus hours, minutes, seconds and a decimal fraction of a second YYYY-MM-DDThh:mm:ss.sTZD (eg 1997-07-16T19:20:30.45+01:00) */ @Parameterized.Parameters(name="{0}: {2}") public static Collection params() { Object[][] data = new Object[][] { {"W3CISO", null, "secs since 1997"}, {"W3CISO", null, "secs since 1997"}, {"W3CISO", null, "secs since 1997-07"}, {"W3CISO", null, "secs since 1997-07-16"}, {"W3CISO", null, "secs since 1997-07-16T19:20+01:00"}, {"W3CISO", null, "secs since 1997-07-16T19:20:30+01:00"}, {"ChangeoverDate", null, "secs since 1997-01-01"}, {"ChangeoverDate", null, "secs since 1582-10-16"}, {"ChangeoverDate", null, "secs since 1582-10-15"}, // {"ChangeoverDate", null, "secs since 1582-10-01"}, // {"ChangeoverDate", null, "secs since 1582-10-02"}, // {"ChangeoverDate", null, "secs since 1582-10-03"}, // {"ChangeoverDate", null, "secs since 1582-10-04"}, // {"yearZero", null, "secs since 0000-01-01"}, // {"yearZero", null, "secs since 0001-01-01"}, // {"yearZero", null, "secs since -0001-01-01"}, // {"yearZero", "gregorian", "secs since 0001-01-01"}, // {"yearZero", "gregorian", "secs since -0001-01-01"}, {"Problem", null, "days since 2008-01-01 0:00:00 00:00"}, {"Problem", null, "seconds since 1968-05-23 00:00:00 UTC"}, {"Problem", null, "seconds since 1970-01-01 00 UTC"}, // UNIT since [-]Y[Y[Y[Y]]]-MM-DD[(T| )hh[:mm[:ss[.sss*]]][ [+|-]hh[[:]mm]]] {"UDUnits", null, "secs since 1992-10-8 15:15:42.5 -6:00"}, {"UDUnits", null, "secs since 1992-10-8 15:15:42.5 +6"}, // {"UDUnits", null, "secs since 1992-10-8 15:15:42.534"}, {"UDUnits", null, "secs since 1992-10-8 15:15:42"}, {"UDUnits", null, "secs since 1992-10-8 15:15"}, {"UDUnits", null, "secs since 1992-10-8 15"}, {"UDUnits", null, "secs since 1992-10-8T15"}, {"UDUnits", null, "secs since 1992-10-8"}, // {"UDUnits", null, "secs since 199-10-8"}, // {"UDUnits", null, "secs since 19-10-8"}, // {"UDUnits", null, "secs since 1-10-8"}, // {"UDUnits", null, "secs since +1101-10-8"}, // {"UDUnits", null, "secs since -1101-10-8"}, {"UDUnits", null, "secs since 1992-10-8T7:00 -6:00"}, {"UDUnits", null, "secs since 1992-10-8T7:00 +6:00"}, {"UDUnits", null, "secs since 1992-10-8T7 -6:00"}, {"UDUnits", null, "secs since 1992-10-8T7 +6:00"}, {"UDUnits", null, "secs since 1992-10-8 7 -6:00"}, {"UDUnits", null, "secs since 1992-10-8 7 +6:00"}, {"UDUnits", null, "days since 1992"}, {"UDUnits", null, "hours since 2011-02-09T06:00:00Z"}, {"UDUnits", null, "seconds since 1968-05-23 00:00:00"}, {"UDUnits", null, "seconds since 1968-05-23 00:00:00 UTC"}, {"UDUnits", null, "seconds since 1968-05-23 00:00:00 GMT"}, {"UDUnits", null, "msecs since 1970-01-01T00:00:00Z"}, }; return Arrays.asList(data); } @Parameterized.Parameter public String category; @Parameterized.Parameter(value=1) public String calendar; @Parameterized.Parameter(value=2) public String datestring; private Date getBase(String s) throws Exception { Unit u = format.parse(s); assert u instanceof TimeScaleUnit : s; TimeScaleUnit tu = (TimeScaleUnit) u; return tu.getOrigin(); } @Test public void testBase() throws Exception { Date base = getBase(datestring); CalendarDateUnit cdu = CalendarDateUnit.of(calendar, datestring); Assert.assertEquals("Difference (ms): " + (base.getTime() - cdu.getBaseDate().getTime()), cdu.getBaseDate(), base); Assert.assertEquals("Difference (ms): " + (CalendarDate.of(base).getMillis() - cdu.getBaseCalendarDate().getMillis()), cdu.getBaseCalendarDate(), CalendarDate.of(base)); } // @Test public void testCoords() { boolean test = false; testCoords("days", test); testCoords("hours", test); testCoords("months", test); testCoords("years", test); } private void testCoords(String unitP, boolean test) { String unit = unitP + " since 2008-02-29"; CalendarDateUnit cdu = CalendarDateUnit.of(null, unit); for (int i=0; i<13; i++) { CalendarDate cd = cdu.makeCalendarDate(i); System.out.printf("%d %s == %s%n", i, cdu, CalendarDateFormatter.toDateTimeStringISO(cd)); if (test) testDate(i + " "+ unit); } System.out.printf("%n"); } private void testDate(String udunits) { Date uddate = DateUnit.getStandardDate(udunits); CalendarDate cd = CalendarDate.parseUdunits(null, udunits); if (!uddate.equals(cd.toDate())) { System.out.printf(" BAD %s == %s != %s (diff = %d)%n", udunits, df.toDateTimeString(uddate), cd, cd.toDate().getTime() - uddate.getTime()); } } // @Test public void testCoordsByCalendarField() { boolean test = false; testCoordsByCalendarField("calendar days", test); testCoordsByCalendarField("calendar hours", test); testCoordsByCalendarField("calendar months", test); testCoordsByCalendarField("calendar years", test); } private void testCoordsByCalendarField(String unitP, boolean test) { String unit = unitP + " since 2008-02-29"; CalendarDateUnit cdu = CalendarDateUnit.of(null, unit); for (int i=0; i<15; i++) { CalendarDate cd = cdu.makeCalendarDate(i); System.out.printf("%2d %s == %s%n", i, cdu, CalendarDateFormatter.toDateTimeStringISO(cd)); if (test) testDate(i + " "+ unit); } for (int i=0; i<13; i++) { CalendarDate cd = cdu.makeCalendarDate(i*10); System.out.printf("%2d %s == %s%n", i*10, cdu, CalendarDateFormatter.toDateTimeStringISO(cd)); if (test) testDate(i + " "+ unit); } System.out.printf("%n"); } // @Test public void testBig() { CalendarDateUnit cdu = CalendarDateUnit.of(null, "years since 1970-01-01"); long val = 50*1000*1000; CalendarDate cd = cdu.makeCalendarDate(val); System.out.printf("%d %s == %s%n", val, cdu, CalendarDateFormatter.toDateTimeStringISO(cd)); cdu = CalendarDateUnit.of(null, "calendar years since 1970-01-01"); cd = cdu.makeCalendarDate(val); System.out.printf("%n%d %s == %s%n", val, cdu, CalendarDateFormatter.toDateTimeStringISO(cd)); } }