package org.whole.lang.xsd.util;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.TimeZone;
import java.util.regex.Pattern;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.tz.FixedDateTimeZone;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.whole.lang.codebase.StreamPersistenceProvider;
import org.whole.lang.operations.InterpreterOperation;
import org.whole.lang.parsers.DataTypeParsers;
import org.whole.lang.parsers.IDataTypeParser;
import org.whole.lang.reflect.EntityDescriptor;
import org.whole.lang.reflect.EntityDescriptorEnum;
import org.whole.lang.reflect.ILanguageKit;
import org.whole.lang.reflect.ReflectionFactory;
import org.whole.lang.xsd.codebase.XsdPersistenceKit;
import org.whole.lang.xsd.model.Schema;
import org.whole.lang.xsd.parsers.SchemaDataTypeParsersTest;
import org.whole.test.SlowTests;
public class XsiDateTimeUtilsTest {
private static final String DATATYPES_URI = "http://lang.whole.org/XsdDatatypes";
@BeforeClass
public static void deployWholePlatform() {
ReflectionFactory.deployWholePlatform();
}
@Before
public void setUp() throws Exception {
InterpreterOperation.interpret(loadXsd("datatypes.xsd"));
}
private Schema loadXsd(String fileName) throws Exception {
return (Schema) XsdPersistenceKit.instance().readModel(
new StreamPersistenceProvider(getInputStream(fileName)));
}
private InputStream getInputStream(String fileName) {
return SchemaDataTypeParsersTest.class.getResourceAsStream(fileName);
}
private static void assertEquals(IDataTypeParser dataTypeParser, DateTime base, EntityDescriptor<?> dateTime, String toParse, String toMatch) {
DateTime jodaDateTime = DateTimeUtils.toDateTime(base, dataTypeParser.parse(dateTime, toParse));
Date javaDate = DateTimeUtils.toDate(jodaDateTime);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Assert.assertEquals(dateFormat.format(javaDate), toMatch);
}
@Test
public void testGregorianCalendar() {
ILanguageKit languageKit = ReflectionFactory.getLanguageKit(DATATYPES_URI);
EntityDescriptorEnum edEnum = languageKit.getEntityDescriptorEnum();
IDataTypeParser dataTypeParser = languageKit.getDataTypeParser(DataTypeParsers.PERSISTENCE);
EntityDescriptor<?> dateTime = edEnum.valueOf("XSDateTime");
EntityDescriptor<?> date = edEnum.valueOf("XSDate");
EntityDescriptor<?> time = edEnum.valueOf("XSTime");
EntityDescriptor<?> gYearMonth = edEnum.valueOf("XSGYearMonth");
DateTime base = new DateTime(2001, 1, 1, 11, 22, 33, 444, DateTimeZone.UTC);
assertEquals(dataTypeParser, base, dateTime, "1990-11-30T12:30:43.999Z", "1990-11-30T12:30:43.999Z");
assertEquals(dataTypeParser, base, dateTime, "1990-11-30T12:30:43", "1990-11-30T12:30:43.000Z");
assertEquals(dataTypeParser, base, gYearMonth, "1990-11", "1990-11-01T11:22:33.444Z");
assertEquals(dataTypeParser, base, date, "1990-11-30", "1990-11-30T11:22:33.444Z");
assertEquals(dataTypeParser, base, date, "1990-11-30Z", "1990-11-30T00:00:00.000Z");
assertEquals(dataTypeParser, base, date, "1990-11-30+02:00", "1990-11-29T22:00:00.000Z");
assertEquals(dataTypeParser, base, time, "12:30:43", "2001-01-01T12:30:43.000Z");
assertEquals(dataTypeParser, base, time, "12:30:43.999Z", "1970-01-01T12:30:43.999Z");
}
private static Pattern OFFSET_TIME_ZONE_PATTERN;
public static TimeZone getTimeZone(DateTimeZone zone) {
if (OFFSET_TIME_ZONE_PATTERN == null)
OFFSET_TIME_ZONE_PATTERN = Pattern.compile("[-+]\\d\\d:\\d\\d");
String zoneID = zone.getID();
if (zone instanceof FixedDateTimeZone && OFFSET_TIME_ZONE_PATTERN.matcher(zoneID).matches())
return TimeZone.getTimeZone("GMT"+zoneID);
else
return zone.toTimeZone();
}
@Category(SlowTests.class)
@Test
public void testCalendarConversions() {
DateTime jodaTime = new DateTime();
GregorianCalendar gregorianCalendar = new GregorianCalendar(getTimeZone(jodaTime.getZone()));
gregorianCalendar.setTime(jodaTime.toDate());
Assert.assertEquals(gregorianCalendar, DateTimeUtils.toGregorianCalendar(jodaTime));
Calendar calendar = Calendar.getInstance(getTimeZone(jodaTime.getZone()), Locale.getDefault());
calendar.setTime(jodaTime.toDate());
Assert.assertEquals(calendar, DateTimeUtils.toGregorianCalendar(jodaTime));
}
}