package org.semanticweb.HermiT.reasoner; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import org.semanticweb.HermiT.datatypes.datetime.BoundType; import org.semanticweb.HermiT.datatypes.datetime.DateTime; import org.semanticweb.HermiT.datatypes.datetime.DateTimeInterval; import org.semanticweb.HermiT.datatypes.datetime.IntervalType; public class DateTimeTest extends AbstractReasonerTest { public DateTimeTest(String name) { super(name); } public void testParsing() { // Test positive dates assertParsing("1926-11-26T16:24:10.200Z"); assertParsing("1926-11-26T24:00:00Z"); assertParsing("1926-11-26T16:24:10.200+02:00"); assertParsing("1926-01-01T16:24:10.200+02:00"); assertParsing("1926-12-21T16:24:10.200+02:00"); assertParsing("1926-12-31T16:24:10.200+02:00"); assertParsing("1926-12-31T00:00:00+02:00"); // Test year = 0 assertParsing("0000-01-01T00:00:00Z"); assertParsing("0000-01-01T00:00:00+14:00"); assertParsing("0000-01-01T00:00:00-02:00"); assertParsing("0000-01-01T00:00:00+02:00"); assertParsing("0000-01-01T24:00:00+02:00"); // Test year = -1 assertParsing("-0001-12-31T24:00:00Z"); assertParsing("-0001-12-31T23:59:59Z"); assertParsing("-0001-12-31T23:59:59+14:00"); assertParsing("-0001-12-31T24:00:00+14:00"); // Test negative dates assertParsing("-1926-11-26T16:24:10.200Z"); assertParsing("-1926-11-26T24:00:00Z"); assertParsing("-1926-11-26T16:24:10.200+02:00"); assertParsing("-1926-01-01T16:24:10.200+02:00"); assertParsing("-1926-12-21T16:24:10.200+02:00"); assertParsing("-1926-12-31T16:24:10.200+02:00"); assertParsing("-1926-12-31T00:00:00+02:00"); } public void testExactIntervalsWithoutTZ1() { DateTime time1=getTime("1926-11-26T14:00:00"); DateTime time2=getTime("1926-11-26T14:00:00Z"); DateTimeInterval interval=wihtoutTZ(time1); assertEquals(100000,interval.subtractSizeFrom(100001)); assertTrue(interval.containsDateTime(time1)); assertFalse(interval.containsDateTime(time2)); assertElements(time1,interval,time1); } public void testExactIntervalsWithoutTZ2() { DateTime time1=getTime("1926-11-26T24:00:00"); DateTime time2=getTime("1926-11-27T00:00:00"); assertEquals(time1.getTimeOnTimeline(),time2.getTimeOnTimeline()); DateTime time3=getTime("1926-11-26T24:00:00Z"); DateTimeInterval interval=wihtoutTZ(time1); assertEquals(100000,interval.subtractSizeFrom(100002)); assertTrue(interval.containsDateTime(time1)); assertTrue(interval.containsDateTime(time2)); assertFalse(interval.containsDateTime(time3)); assertElements(time1,interval,time1,time2); } public void testExactIntervalsWithTZ1() throws Exception { DateTime time1=getTime("1926-11-26T04:00:01Z"); DateTime time2=getTime("1926-11-26T04:00:01"); DateTimeInterval interval=wihtTZ(time1); assertEquals(100000,interval.subtractSizeFrom(100000+840+840+1)); assertTrue(interval.containsDateTime(time1)); assertFalse(interval.containsDateTime(time2)); assertElements(time1,interval,loadDateTimes("res/datetime-1.txt")); } public void testExactIntervalsWithTZ2() throws Exception { DateTime time1=getTime("1926-11-26T11:00:00Z"); DateTime time2=getTime("1926-11-26T11:00:00"); DateTimeInterval interval=wihtTZ(time1); assertEquals(100000,interval.subtractSizeFrom(100000+840+840+1+1+1)); assertTrue(interval.containsDateTime(time1)); assertFalse(interval.containsDateTime(time2)); assertElements(time1,interval,loadDateTimes("res/datetime-2.txt")); } public void testExactIntervalsWithTZ3() throws Exception { DateTime time1=getTime("-1926-11-26T11:00:00Z"); DateTime time2=getTime("-1926-11-26T11:00:00"); DateTimeInterval interval=wihtTZ(time1); assertEquals(100000,interval.subtractSizeFrom(100000+840+840+1+1+1)); assertTrue(interval.containsDateTime(time1)); assertFalse(interval.containsDateTime(time2)); assertElements(time1,interval,loadDateTimes("res/datetime-3.txt")); } public void testFinite1_1() throws Exception { assertDRSatisfiable(true,2, DR("xsd:dateTime","xsd:minInclusive",DATE("1965-04-15T00:00:00"),"xsd:maxInclusive",DATE("1965-04-15T00:00:00")) ); } public void testFinite1_2() throws Exception { assertDRSatisfiable(false,3, DR("xsd:dateTime","xsd:minInclusive",DATE("1965-04-15T00:00:00"),"xsd:maxInclusive",DATE("1965-04-15T00:00:00")) ); } public void testFinite2_1() throws Exception { assertDRSatisfiable(true,4, DR("xsd:dateTime","xsd:minInclusive",DATE("1965-04-15T00:00:00"),"xsd:maxInclusive",DATE("1965-05-01T00:00:00")), NOT(DR("xsd:dateTime","xsd:minExclusive",DATE("1965-04-15T00:00:00"),"xsd:maxExclusive",DATE("1965-05-01T00:00:00"))) ); } public void testFinite2_2() throws Exception { assertDRSatisfiable(false,5, DR("xsd:dateTime","xsd:minInclusive",DATE("1965-04-15T00:00:00"),"xsd:maxInclusive",DATE("1965-05-01T00:00:00")), NOT(DR("xsd:dateTime","xsd:minExclusive",DATE("1965-04-15T00:00:00"),"xsd:maxExclusive",DATE("1965-05-01T00:00:00"))) ); } public void testInfinite_1() throws Exception { assertDRSatisfiable(true,100, DR("xsd:dateTime","xsd:minInclusive",DATE("1965-04-15T00:00:00"),"xsd:maxInclusive",DATE("1965-05-01T00:00:00.001")) ); } public void testInfinite_2() throws Exception { assertDRSatisfiable(true,100, DR("xsd:dateTime","xsd:minInclusive",DATE("1965-04-15T00:00:00Z"),"xsd:maxInclusive",DATE("1965-05-01T00:00:00.001Z")) ); } public void testMizedTZs_1() throws Exception { assertDRSatisfiable(false, DR("xsd:dateTime","xsd:minInclusive",DATE("1965-04-15T00:00:00"),"xsd:maxInclusive",DATE("1965-04-15T00:00:01Z")) ); } public void testMizedTZs_2() throws Exception { assertDRSatisfiable(false, DR("xsd:dateTime","xsd:minInclusive",DATE("1965-04-15T00:00:00"),"xsd:maxInclusive",DATE("1965-04-15T00:00:00-14:00")) ); } public void testMizedTZs_3() throws Exception { assertDRSatisfiable(true,100, DR("xsd:dateTime","xsd:minInclusive",DATE("1965-04-15T00:00:00"),"xsd:maxInclusive",DATE("1965-04-15T00:00:00.001-14:00")) ); } public void testMember() throws Exception { assertDRSatisfiable(true, DR("xsd:dateTime","xsd:minInclusive",DATE("1965-04-15T00:00:00Z"),"xsd:maxInclusive",DATE("1965-05-01T00:00:00Z")), NOT(DR("xsd:dateTime","xsd:minInclusive",DATE("1965-04-17T00:00:00"),"xsd:maxInclusive",DATE("1965-04-18T00:00:00Z"))), OO(DATE("1965-04-15T00:00:00Z")), NOT(OO(DATE("1965-04-15T00:00:00+00:01"))) ); } protected static String getTZO(int offset) { int offsetAbs=Math.abs(offset); int min=offsetAbs % 60; int hour=offsetAbs / 60; return (offset<0 ? "-" : "+")+padTwo(hour)+":"+padTwo(min); } protected static void assertParsing(String lexicalForm) { DateTime dateTime=getTime(lexicalForm); assertEquals(lexicalForm,dateTime.toString()); } protected static DateTime getTime(String lexicalForm) { return DateTime.parse(lexicalForm); } protected static DateTimeInterval wihtoutTZ(DateTime dateTime) { return new DateTimeInterval(IntervalType.WITHOUT_TIMEZONE,dateTime.getTimeOnTimeline(),BoundType.INCLUSIVE,dateTime.getTimeOnTimeline(),BoundType.INCLUSIVE); } protected static DateTimeInterval wihtTZ(DateTime dateTime) { return new DateTimeInterval(IntervalType.WITH_TIMEZONE,dateTime.getTimeOnTimeline(),BoundType.INCLUSIVE,dateTime.getTimeOnTimeline(),BoundType.INCLUSIVE); } protected static void assertElements(DateTime baseDateTime,DateTimeInterval interval,DateTime... expectedDateTimes) { List<Object> dateTimes=new ArrayList<Object>(); interval.enumerateDateTimes(dateTimes); assertContainsAll(dateTimes,(Object[])expectedDateTimes); for (DateTime dateTime : expectedDateTimes) assertEquals(baseDateTime.getTimeOnTimeline(),dateTime.getTimeOnTimeline()); } protected static String padTwo(int value) { String string=String.valueOf(value); if (string.length()==1) string='0'+string; return string; } protected static DateTime[] loadDateTimes(String resourceName) throws Exception { List<DateTime> dateTimes=new ArrayList<DateTime>(); BufferedReader reader=new BufferedReader(new InputStreamReader(DateTimeTest.class.getResourceAsStream(resourceName))); String line=reader.readLine(); while (line!=null) { dateTimes.add(DateTime.parse(line)); line=reader.readLine(); } reader.close(); DateTime[] dateTimesArray=new DateTime[dateTimes.size()]; dateTimes.toArray(dateTimesArray); return dateTimesArray; } }