/* * Copyright Aduna (http://www.aduna-software.com/) (c) 1997-2006. * * Licensed under the Aduna BSD-style license. */ package org.openrdf.model.datatypes; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import junit.textui.TestRunner; /** * This class provides JUnit test cases for class {@link XMLDateTime}. */ public class DateTimeTest extends TestCase { private static final String[] VALID_DATES = { "0001-01-01T00:00:00", "0001-01-01T00:00:00.0", "0001-01-01T00:00:00Z", "0001-01-01T00:00:00.0Z", "0001-01-01T00:00:00+00:00", "0001-01-01T00:00:00.0+00:00", "0001-01-01T00:00:00.0-00:00", "0001-01-01T00:00:00.0+14:00", "0001-01-01T00:00:00.0-14:00", "-0001-01-01T00:00:00", "1234-12-31T23:59:59", "1234-12-31T24:00:00", "12345-12-31T24:00:00", // "5000000000-12-31T24:00:00", // year > Integer.MAX_VALUE // "-5000000000-12-31T24:00:00", // year < Integer.MIN_VALUE "1234-12-31T24:00:00.1234567890", "2004-02-29T00:00:00" // leap year }; private static final String[] INVALID_DATES = { "foo", "Mon, 11 Jul 2005 09:22:29 +0200", "0001-01-01T00:00", "0001-13-01T00:00.00", "0001-01-32T00:00.00", "0001-02-30T00:00.00", // "2005-02-29T00:00:00", "0001-01-01T25:00.00", "0001-01-01T00:61.00", "0001-01-01T00:00.61", "0001-01-01T00:00.00+15:00", "0001-01-01T00:00.00-15:00", "001-01-01T00:00:00.0", "0001-1-01T00:00:00.0", "0001-01-1T00:00:00.0", "0001-01-01T0:00:00.0", "0001-01-01T00:0:00.0", "0001-01-01T00:00:0.0", "0001/01-01T00:00:00.0", "0001-01/01T00:00:00.0", "0001-01-01t00:00:00.0", "0001-01-01T00.00:00.0", "0001-01-01T00:00.00.0", "0001-01-01T00:00:00:0", "0001-01-01T00:00.00+0:00", "0001-01-01T00:00.00+00:0", "0001-jan-01T00:00:00", "0001-01-01T00:00:00+00:00Z", "0001-01-01T24:01:00", "0001-01-01T24:00:01", "00001-01-01T00:00:00", "0001-001-01T00:00:00", "0001-01-001T00:00:00", "0001-01-01T000:00:00", "0001-01-01T00:000:00", "0001-01-01T00:00:000", "0001-01-01T00:00:000", "0001-01-01T00:00:00z", "0001-01-01T00:00:00+05", "0001-01-01T00:00:00+0500", "0001-01-01T00:00:00GMT", "0001-01-01T00:00:00PST", "0001-01-01T00:00:00GMT+05", "0000-01-01T00:00:00", "0000-01-01T00:00:00", "-0000-01-01T00:00:00", "+0001-01-01T00:00:00" }; private static final String[][] NORMALIZED_DATES = { { "0001-01-01T00:00:00", "0001-01-01T00:00:00" }, { "0001-01-01T00:00:00.0", "0001-01-01T00:00:00" }, { "0001-01-01T00:00:00Z", "0001-01-01T00:00:00Z" }, { "0001-01-01T00:00:00.0Z", "0001-01-01T00:00:00Z" }, { "0001-01-01T00:00:00+00:00", "0001-01-01T00:00:00Z" }, { "0001-01-01T00:00:00-00:00", "0001-01-01T00:00:00Z" }, { "0001-01-01T00:00:00.0+00:00", "0001-01-01T00:00:00Z" }, { "0001-01-01T00:00:00.0-00:00", "0001-01-01T00:00:00Z" }, { "0001-01-01T00:00:00-14:00", "0001-01-01T14:00:00Z" }, { "0001-01-01T00:00:00+14:00", "-0001-12-31T10:00:00Z" }, { "1234-12-31T24:00:00", "1235-01-01T00:00:00" } }; private static final String[][] EQUAL_DATES = { { "2005-01-29T00:00:00", "2005-01-29T00:00:00" }, { "2005-01-29T00:00:00", "2005-01-28T24:00:00" }, { "2005-05-01T00:00:00.2+02:00", "2005-05-01T00:00:00.2+02:00" } }; private static final String[][] COMPARISON_DATES = { { "-0005-02-27T00:00:00", "2005-02-28T24:00:00" }, { "2005-02-28T24:00:00", "2005-03-27T00:00:00" }, { "2005-01-28T24:00:00", "2005-02-29T00:00:00.4" }, { "2005-02-29T00:00:00.1", "2005-02-29T00:00:00.4" }, { "2005-02-29T00:00:00", "2005-02-29T00:00:00.1" }, { "2005-02-29T00:00:00", "2005-02-29T00:00:00.2" }, { "2005-05-01T00:00:00.2+02:00", "2005-05-01T00:00:00.2+01:00" }, { "2005-05-01T00:00:00.2-01:00", "2005-05-01T00:00:00.2-02:00" }, { "2005-05-01T00:00:00+02:00", "2005-05-01T00:00:00.2+01:00" }, { "2005-05-01T00:00:00-01:00", "2005-05-01T00:00:00.2-02:00" }, { "2005-05-01T00:00:00-01:00", "2005-05-01T00:00:00-02:00" }, { "2005-05-01T00:00:00-01:00", "2005-05-01T00:00:00-02:00" }, { "-2005-05-01T00:00:00.2+02:00", "2005-05-01T00:00:00.2+02:00" }, { "2005-05-01T00:00:00.2+02:00", "20005-05-01T00:00:00.2+02:00" } }; public static Test suite() { TestSuite suite = new TestSuite(); for (int i = 0; i < VALID_DATES.length; i++) { suite.addTest(new ValidDateTest(VALID_DATES[i])); } for (int i = 0; i < INVALID_DATES.length; i++) { suite.addTest(new InvalidDateTest(INVALID_DATES[i])); } for (int i = 0; i < NORMALIZED_DATES.length; i++) { suite.addTest(new NormalizedDateTest(NORMALIZED_DATES[i][0], NORMALIZED_DATES[i][1])); } for (int i = 0; i < EQUAL_DATES.length; i++) { suite.addTest(new EqualDateTest(EQUAL_DATES[i][0], EQUAL_DATES[i][1])); } for (int i = 0; i < COMPARISON_DATES.length; i++) { suite.addTest(new CompareDateTest(COMPARISON_DATES[i][0], COMPARISON_DATES[i][1])); } return suite; } private static void logError(String errMsg) { System.err.println("[ERROR]: " + errMsg); } /* * run test */ public static void main(String[] args) { TestRunner.run(new TestSuite(DateTimeTest.class)); } /*--------------------------------------------------* * Inner classes for testing specific functionality * *--------------------------------------------------*/ private static class ValidDateTest extends TestCase { private String dateString; public ValidDateTest(String dateString) { super("valid: " + dateString); this.dateString = dateString; } protected void runTest() { if (!XMLDatatypeUtil.isValidDateTime(dateString)) { String errMsg = "string should be valid but is not: " + dateString; logError(errMsg); fail(errMsg); } } } private static class InvalidDateTest extends TestCase { private String dateString; public InvalidDateTest(String dateString) { super("invalid: " + dateString); this.dateString = dateString; } protected void runTest() { if (XMLDatatypeUtil.isValidDateTime(dateString)) { String errMsg = "string should be invalid but is not: " + dateString; logError(errMsg); fail(errMsg); } } } private static class NormalizedDateTest extends TestCase { private String input; private String expected; public NormalizedDateTest(String input, String expected) { super("normalize: " + input + " --> " + expected); this.input = input; this.expected = expected; } protected void runTest() { String normalized = XMLDatatypeUtil.normalizeDateTime(input); if (!expected.equals(normalized)) { String errMsg = "normalizing " + input + " should produce " + expected + " but was " + normalized; logError(errMsg); fail(errMsg); } } } private static class EqualDateTest extends TestCase { private String dateString1; private String dateString2; public EqualDateTest(String dateString1, String dateString2) { super(dateString1 + " == " + dateString2); this.dateString1 = dateString1; this.dateString2 = dateString2; } protected void runTest() { int result = XMLDatatypeUtil.compareDateTime(dateString1, dateString2); if (result != 0) { String errMsg = dateString1 + " and " + dateString2 + " should be equals but are not (result=" + result + ")"; logError(errMsg); fail(errMsg); } } } private static class CompareDateTest extends TestCase { private String dateString1; private String dateString2; public CompareDateTest(String dateString1, String dateString2) { super(dateString1 + " < " + dateString2); this.dateString1 = dateString1; this.dateString2 = dateString2; } protected void runTest() { int result = XMLDatatypeUtil.compareDateTime(dateString1, dateString2); if (result >= 0) { String errMsg = dateString1 + " should be smaller than " + dateString2 + " but is not (result=" + result + ")"; logError(errMsg); fail(errMsg); } } } }