/* The contents of this file are subject to the license and copyright terms
* detailed in the license directory at the root of the source tree (also
* available online at http://fedora-commons.org/license/).
*/
package org.fcrepo.common;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import java.text.ParseException;
import java.util.Date;
import junit.framework.JUnit4TestAdapter;
import org.fcrepo.utilities.DateUtility;
import org.junit.Test;
/**
* @author Edwin Shin
*/
public class TestDateUtility {
protected final Date EPOCH = new Date(0L);
protected final String EPOCH_DT = "1970-01-01T00:00:00.000Z";
protected final String EPOCH_DT2 = "1970-01-01T00:00:00Z"; // no millis
protected final String EPOCH_XSD_DT = "1970-01-01T00:00:00Z";
protected final String EPOCH_D = "1970-01-01Z";
protected final String EPOCH_T = "00:00:00.000Z";
protected final String HTTP_DATE = "Thu, 04 Aug 2005 01:35:07 GMT";
protected final Date ONE_CE = new Date(-62135596800000L);
protected final String ONE_CE_DT = "0001-01-01T00:00:00.000Z";
protected final String ONE_CE_XSD_DT = "0001-01-01T00:00:00Z";
protected final Date ONE_BCE = new Date(-62198755200000L);
protected final String ONE_BCE_DT = "-0001-01-01T00:00:00.000Z";
protected final String ONE_BCE_XSD_DT = "0000-01-01T00:00:00Z";
protected final Date TWO_BCE = new Date(-62230291200000L);
protected final String TWO_BCE_DT = "-0002-01-01T00:00:00.000Z";
protected final String TWO_BCE_XSD_DT = "-0001-01-01T00:00:00Z";
@Test
public void testConvertDateToString() {
assertEquals(EPOCH_DT, DateUtility.convertDateToString(EPOCH));
assertEquals(EPOCH_DT, DateUtility.convertDateToString(EPOCH, true));
assertEquals(EPOCH_DT2, DateUtility.convertDateToString(EPOCH, false));
assertEquals(ONE_CE_DT, DateUtility.convertDateToString(ONE_CE));
assertEquals(ONE_BCE_DT, DateUtility.convertDateToString(ONE_BCE));
assertEquals(TWO_BCE_DT, DateUtility.convertDateToString(TWO_BCE));
}
@Test
public void testConvertDateToDateString() {
assertEquals(EPOCH_D, DateUtility.convertDateToDateString(EPOCH));
}
@Test
public void testConvertDateToTimeString() {
assertEquals(EPOCH_T, DateUtility.convertDateToTimeString(EPOCH));
}
@Test
public void testConvertDateToXSDString() {
assertEquals(EPOCH_XSD_DT, DateUtility.convertDateToXSDString(EPOCH));
assertEquals(ONE_CE_XSD_DT, DateUtility.convertDateToXSDString(ONE_CE));
assertEquals(ONE_BCE_XSD_DT,
DateUtility.convertDateToXSDString(ONE_BCE));
assertEquals(TWO_BCE_XSD_DT,
DateUtility.convertDateToXSDString(TWO_BCE));
}
@Test
public void testParseDate() {
String[] dates = { "1970-01-01T00:00:00.000Z",
"1970-01-01T00:00:00.00Z", "1970-01-01T00:00:00.0Z",
"1970-01-01T00:00:00Z", "1970-01-01Z",
"1970-01-01T00:00:00.000", "1970-01-01T00:00:00.00",
"1970-01-01T00:00:00.0", "1970-01-01T00:00:00", "1970-01-01",
"Thu, 01 Jan 1970 00:00:00 GMT" };
for (String element : dates) {
assertEquals(EPOCH, DateUtility.parseDateLoose(element));
}
// why would "12345-01-01T00:00:00.000Z" be a bad date??
// i commented this out since it's quite reasonable.
// but it would also be possible to check if the year has passed a
// certain threshold and return null
String[] badDates = { "", "ABCD-EF-GHTIJ:KL:MN.OPQZ", "1234", "1",
"1970-01", "1970-1-1", /* "12345-01-01T00:00:00.000Z",*/
"12345-01-01T00:00:00." };
for (String element : badDates) {
assertNull(element + " not null",
DateUtility.parseDateLoose(element));
}
// i think this was wrong since it used a different format for input
// then all the other tests, so i switched the usage to the non XSD variables
assertEquals(ONE_CE, DateUtility.parseDateLoose(ONE_CE_DT));
assertEquals(ONE_BCE, DateUtility.parseDateLoose(ONE_BCE_DT));
assertEquals(TWO_BCE, DateUtility.parseDateLoose(TWO_BCE_DT));
}
@Test
public void testMillis() throws Exception {
// canonical form of 200 milliseconds after Epoch
String a = "1970-01-01T00:00:00.2Z";
// also 200 ms after Epoch
String b = "1970-01-01T00:00:00.200Z";
Date aDate = DateUtility.parseDateStrict(a);
Date bDate = DateUtility.parseDateStrict(b);
assertEquals(200, aDate.getTime());
assertEquals(200, bDate.getTime());
assertEquals(a, DateUtility.convertDateToXSDString(aDate));
assertEquals(b, DateUtility.convertDateToString(bDate));
// canonical form of 20 milliseconds after Epoch
String c = "1970-01-01T00:00:00.02Z";
// also 20 ms after Epoch
String d = "1970-01-01T00:00:00.020Z";
Date cDate = DateUtility.parseDateStrict(c);
Date dDate = DateUtility.parseDateStrict(d);
assertEquals(20, cDate.getTime());
assertEquals(20, dDate.getTime());
assertEquals(c, DateUtility.convertDateToXSDString(cDate));
assertEquals(d, DateUtility.convertDateToString(dDate));
// canonical form of 2 milliseconds after Epoch
String e = "1970-01-01T00:00:00.002Z";
Date eDate = DateUtility.parseDateStrict(e);
assertEquals(2, eDate.getTime());
assertEquals(e, DateUtility.convertDateToXSDString(eDate));
assertEquals(e, DateUtility.convertDateToString(eDate));
// variations of Epoch
String f = "1970-01-01T00:00:00.0Z";
String g = "1970-01-01T00:00:00.00Z";
Date fDate = DateUtility.parseDateStrict(f);
Date gDate = DateUtility.parseDateStrict(g);
assertEquals(0, fDate.getTime());
assertEquals(0, gDate.getTime());
assertEquals(EPOCH_XSD_DT, DateUtility.convertDateToXSDString(fDate));
assertEquals(EPOCH_XSD_DT, DateUtility.convertDateToXSDString(gDate));
assertEquals(EPOCH_DT, DateUtility.convertDateToString(fDate));
assertEquals(EPOCH_DT, DateUtility.convertDateToString(gDate));
// negative dates
String n = "-1234-01-01T00:00:00.2Z";
String o = "-1234-01-01T00:00:00.200Z";
Date nDate = DateUtility.parseDateStrict(n);
Date oDate = DateUtility.parseDateStrict(o);
assertEquals(nDate.getTime(), oDate.getTime());
// these are read as non XSD dates and should therefore comply
// with no year "0" in Gregorian Calendar, since 0 in XSD stands for -1
// therefore the date should be 1233 not 1234
assertEquals("-1233-01-01T00:00:00.2Z",
DateUtility.convertDateToXSDString(nDate));
}
@Test
public void testRoundTripMillis() throws ParseException {
String expected = "1970-01-01T00:00:00.200Z";
Date parsed = DateUtility.parseDateStrict(expected);
String actual = DateUtility.formatMillisTZ(parsed);
assertEquals(expected, actual);
expected = "-1234-01-01T00:00:00.200Z";
parsed = DateUtility.parseDateStrict(expected);
actual = DateUtility.formatMillisTZ(parsed);
assertEquals(expected, actual);
}
public static junit.framework.Test suite() {
return new JUnit4TestAdapter(TestDateUtility.class);
}
}