/*
* Geotoolkit - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2010, Geomatys
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotoolkit.temporal.object;
import java.util.GregorianCalendar;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimeZone;
import org.apache.sis.util.logging.Logging;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
import static java.util.Calendar.*;
/**
*
* @author Johann Sorel (Geomatys)
* @module
*/
public class ISODateParserTest extends org.geotoolkit.test.TestBase {
public ISODateParserTest() {
}
@BeforeClass
public static void setUpClass() throws Exception {
}
@AfterClass
public static void tearDownClass() throws Exception {
}
@Before
public void setUp() {
}
@After
public void tearDown() {
}
@Test
public void testConformance() throws ParseException {
final ISODateParser fdp = new ISODateParser();
String str;
Calendar calendar = Calendar.getInstance();
int year = 1995;
int month = 10; //starts at 0
int day = 23;
int hour = 16;
int min = 41;
int sec = 36;
int mil = 512;
// yyyy ----------------------------------------------------------------
str = "1995";
calendar = fdp.getCalendar(str);
assertEquals(TimeZone.getDefault(), calendar.getTimeZone());
assertEquals(year, calendar.get(YEAR));
assertEquals(0, calendar.get(MONTH));
assertEquals(1, calendar.get(DAY_OF_MONTH));
assertEquals(0, calendar.get(HOUR_OF_DAY));
assertEquals(0, calendar.get(MINUTE));
assertEquals(0, calendar.get(SECOND));
assertEquals(0, calendar.get(MILLISECOND));
str = "1995Z";
calendar = fdp.getCalendar(str);
assertEquals(TimeZone.getTimeZone("GMT+0"), calendar.getTimeZone());
assertEquals(year, calendar.get(YEAR));
assertEquals(0, calendar.get(MONTH));
assertEquals(1, calendar.get(DAY_OF_MONTH));
assertEquals(0, calendar.get(HOUR_OF_DAY));
assertEquals(0, calendar.get(MINUTE));
assertEquals(0, calendar.get(SECOND));
assertEquals(0, calendar.get(MILLISECOND));
str = "1995+2";
calendar = fdp.getCalendar(str);
assertEquals(TimeZone.getTimeZone("GMT+2"), calendar.getTimeZone());
assertEquals(year, calendar.get(YEAR));
assertEquals(0, calendar.get(MONTH));
assertEquals(1, calendar.get(DAY_OF_MONTH));
assertEquals(0, calendar.get(HOUR_OF_DAY));
assertEquals(0, calendar.get(MINUTE));
assertEquals(0, calendar.get(SECOND));
assertEquals(0, calendar.get(MILLISECOND));
// yyyyMM -------------------------------------------------------------
str = "199511";
calendar = fdp.getCalendar(str);
assertEquals(TimeZone.getDefault(), calendar.getTimeZone());
assertEquals(year, calendar.get(YEAR));
assertEquals(month, calendar.get(MONTH));
assertEquals(1, calendar.get(DAY_OF_MONTH));
assertEquals(0, calendar.get(HOUR_OF_DAY));
assertEquals(0, calendar.get(MINUTE));
assertEquals(0, calendar.get(SECOND));
assertEquals(0, calendar.get(MILLISECOND));
str = "199511Z";
calendar = fdp.getCalendar(str);
assertEquals(TimeZone.getTimeZone("GMT+0"), calendar.getTimeZone());
assertEquals(year, calendar.get(YEAR));
assertEquals(month, calendar.get(MONTH));
assertEquals(1, calendar.get(DAY_OF_MONTH));
assertEquals(0, calendar.get(HOUR_OF_DAY));
assertEquals(0, calendar.get(MINUTE));
assertEquals(0, calendar.get(SECOND));
assertEquals(0, calendar.get(MILLISECOND));
str = "199511+2";
calendar = fdp.getCalendar(str);
assertEquals(TimeZone.getTimeZone("GMT+2"), calendar.getTimeZone());
assertEquals(year, calendar.get(YEAR));
assertEquals(month, calendar.get(MONTH));
assertEquals(1, calendar.get(DAY_OF_MONTH));
assertEquals(0, calendar.get(HOUR_OF_DAY));
assertEquals(0, calendar.get(MINUTE));
assertEquals(0, calendar.get(SECOND));
assertEquals(0, calendar.get(MILLISECOND));
// yyyy-MM -------------------------------------------------------------
str = "1995-11";
calendar = fdp.getCalendar(str);
assertEquals(TimeZone.getDefault(), calendar.getTimeZone());
assertEquals(year, calendar.get(YEAR));
assertEquals(month, calendar.get(MONTH));
assertEquals(1, calendar.get(DAY_OF_MONTH));
assertEquals(0, calendar.get(HOUR_OF_DAY));
assertEquals(0, calendar.get(MINUTE));
assertEquals(0, calendar.get(SECOND));
assertEquals(0, calendar.get(MILLISECOND));
str = "1995-11Z";
calendar = fdp.getCalendar(str);
assertEquals(TimeZone.getTimeZone("GMT+0"), calendar.getTimeZone());
assertEquals(year, calendar.get(YEAR));
assertEquals(month, calendar.get(MONTH));
assertEquals(1, calendar.get(DAY_OF_MONTH));
assertEquals(0, calendar.get(HOUR_OF_DAY));
assertEquals(0, calendar.get(MINUTE));
assertEquals(0, calendar.get(SECOND));
assertEquals(0, calendar.get(MILLISECOND));
str = "1995-11+2";
calendar = fdp.getCalendar(str);
assertEquals(TimeZone.getTimeZone("GMT+2"), calendar.getTimeZone());
assertEquals(year, calendar.get(YEAR));
assertEquals(month, calendar.get(MONTH));
assertEquals(1, calendar.get(DAY_OF_MONTH));
assertEquals(0, calendar.get(HOUR_OF_DAY));
assertEquals(0, calendar.get(MINUTE));
assertEquals(0, calendar.get(SECOND));
assertEquals(0, calendar.get(MILLISECOND));
// yyyMMdd -----------------------------------------------------
str = "19951123";
calendar = fdp.getCalendar(str);
assertEquals(TimeZone.getDefault(), calendar.getTimeZone());
assertEquals(year, calendar.get(YEAR));
assertEquals(month, calendar.get(MONTH));
assertEquals(day, calendar.get(DAY_OF_MONTH));
assertEquals(0, calendar.get(HOUR_OF_DAY));
assertEquals(0, calendar.get(MINUTE));
assertEquals(0, calendar.get(SECOND));
assertEquals(0, calendar.get(MILLISECOND));
str = "19951123Z";
calendar = fdp.getCalendar(str);
assertEquals(TimeZone.getTimeZone("GMT+0"), calendar.getTimeZone());
assertEquals(year, calendar.get(YEAR));
assertEquals(month, calendar.get(MONTH));
assertEquals(day, calendar.get(DAY_OF_MONTH));
assertEquals(0, calendar.get(HOUR_OF_DAY));
assertEquals(0, calendar.get(MINUTE));
assertEquals(0, calendar.get(SECOND));
assertEquals(0, calendar.get(MILLISECOND));
str = "19951123+2";
calendar = fdp.getCalendar(str);
assertEquals(TimeZone.getTimeZone("GMT+2"), calendar.getTimeZone());
assertEquals(year, calendar.get(YEAR));
assertEquals(month, calendar.get(MONTH));
assertEquals(day, calendar.get(DAY_OF_MONTH));
assertEquals(0, calendar.get(HOUR_OF_DAY));
assertEquals(0, calendar.get(MINUTE));
assertEquals(0, calendar.get(SECOND));
assertEquals(0, calendar.get(MILLISECOND));
//test simple date -----------------------------------------------------
str = "1995-11-23";
calendar = fdp.getCalendar(str);
assertEquals(TimeZone.getDefault(), calendar.getTimeZone());
assertEquals(year, calendar.get(YEAR));
assertEquals(month, calendar.get(MONTH));
assertEquals(day, calendar.get(DAY_OF_MONTH));
assertEquals(0, calendar.get(HOUR_OF_DAY));
assertEquals(0, calendar.get(MINUTE));
assertEquals(0, calendar.get(SECOND));
assertEquals(0, calendar.get(MILLISECOND));
str = "1995-11-23Z";
calendar = fdp.getCalendar(str);
assertEquals(TimeZone.getTimeZone("GMT+0"), calendar.getTimeZone());
assertEquals(year, calendar.get(YEAR));
assertEquals(month, calendar.get(MONTH));
assertEquals(day, calendar.get(DAY_OF_MONTH));
assertEquals(0, calendar.get(HOUR_OF_DAY));
assertEquals(0, calendar.get(MINUTE));
assertEquals(0, calendar.get(SECOND));
assertEquals(0, calendar.get(MILLISECOND));
str = "1995-11-23+2";
calendar = fdp.getCalendar(str);
assertEquals(TimeZone.getTimeZone("GMT+2"), calendar.getTimeZone());
assertEquals(year, calendar.get(YEAR));
assertEquals(month, calendar.get(MONTH));
assertEquals(day, calendar.get(DAY_OF_MONTH));
assertEquals(0, calendar.get(HOUR_OF_DAY));
assertEquals(0, calendar.get(MINUTE));
assertEquals(0, calendar.get(SECOND));
assertEquals(0, calendar.get(MILLISECOND));
//test no 'Z' for local GMT --------------------------------------------
str = "1995-11-23T16:41:36";
calendar = fdp.getCalendar(str);
assertEquals(TimeZone.getDefault(), calendar.getTimeZone());
assertEquals(year, calendar.get(YEAR));
assertEquals(month, calendar.get(MONTH));
assertEquals(day, calendar.get(DAY_OF_MONTH));
assertEquals(hour, calendar.get(HOUR_OF_DAY));
assertEquals(min, calendar.get(MINUTE));
assertEquals(sec, calendar.get(SECOND));
assertEquals(0, calendar.get(MILLISECOND));
str = "1995-11-23T16:41:36.512";
calendar = fdp.getCalendar(str);
assertEquals(TimeZone.getDefault(), calendar.getTimeZone());
assertEquals(year, calendar.get(YEAR));
assertEquals(month, calendar.get(MONTH));
assertEquals(day, calendar.get(DAY_OF_MONTH));
assertEquals(hour, calendar.get(HOUR_OF_DAY));
assertEquals(min, calendar.get(MINUTE));
assertEquals(sec, calendar.get(SECOND));
assertEquals(mil, calendar.get(MILLISECOND));
//test 'Z' for GMT+0 ---------------------------------------------------
str = "1995-11-23T16:41:36Z";
calendar = fdp.getCalendar(str);
assertEquals(TimeZone.getTimeZone("GMT+0"), calendar.getTimeZone());
assertEquals(year, calendar.get(YEAR));
assertEquals(month, calendar.get(MONTH));
assertEquals(day, calendar.get(DAY_OF_MONTH));
assertEquals(hour, calendar.get(HOUR_OF_DAY));
assertEquals(min, calendar.get(MINUTE));
assertEquals(sec, calendar.get(SECOND));
assertEquals(0, calendar.get(MILLISECOND));
str = "1995-11-23T16:41:36.512Z";
calendar = fdp.getCalendar(str);
assertEquals(TimeZone.getTimeZone("GMT+0"), calendar.getTimeZone());
assertEquals(year, calendar.get(YEAR));
assertEquals(month, calendar.get(MONTH));
assertEquals(day, calendar.get(DAY_OF_MONTH));
assertEquals(hour, calendar.get(HOUR_OF_DAY));
assertEquals(min, calendar.get(MINUTE));
assertEquals(sec, calendar.get(SECOND));
assertEquals(mil, calendar.get(MILLISECOND));
//test Z for GMT+2 -----------------------------------------------------
str = "1995-11-23T16:41:36+2";
calendar = fdp.getCalendar(str);
assertEquals(TimeZone.getTimeZone("GMT+2"), calendar.getTimeZone());
assertEquals(year, calendar.get(YEAR));
assertEquals(month, calendar.get(MONTH));
assertEquals(day, calendar.get(DAY_OF_MONTH));
assertEquals(hour, calendar.get(HOUR_OF_DAY));
assertEquals(min, calendar.get(MINUTE));
assertEquals(sec, calendar.get(SECOND));
assertEquals(0, calendar.get(MILLISECOND));
str = "1995-11-23T16:41:36.512+2";
calendar = fdp.getCalendar(str);
assertEquals(TimeZone.getTimeZone("GMT+2"), calendar.getTimeZone());
assertEquals(year, calendar.get(YEAR));
assertEquals(month, calendar.get(MONTH));
assertEquals(day, calendar.get(DAY_OF_MONTH));
assertEquals(hour, calendar.get(HOUR_OF_DAY));
assertEquals(min, calendar.get(MINUTE));
assertEquals(sec, calendar.get(SECOND));
assertEquals(mil, calendar.get(MILLISECOND));
//test a negative ------------------------------------------------------
str = "-1995";
calendar = fdp.getCalendar(str);
assertEquals(TimeZone.getDefault(), calendar.getTimeZone());
assertEquals(GregorianCalendar.BC, calendar.get(ERA));
assertEquals(year, calendar.get(YEAR));
assertEquals(0, calendar.get(MONTH));
assertEquals(1, calendar.get(DAY_OF_MONTH));
assertEquals(0, calendar.get(HOUR_OF_DAY));
assertEquals(0, calendar.get(MINUTE));
assertEquals(0, calendar.get(SECOND));
assertEquals(0, calendar.get(MILLISECOND));
str = "-199511";
calendar = fdp.getCalendar(str);
assertEquals(TimeZone.getDefault(), calendar.getTimeZone());
assertEquals(GregorianCalendar.BC, calendar.get(ERA));
assertEquals(year, calendar.get(YEAR));
assertEquals(month, calendar.get(MONTH));
assertEquals(1, calendar.get(DAY_OF_MONTH));
assertEquals(0, calendar.get(HOUR_OF_DAY));
assertEquals(0, calendar.get(MINUTE));
assertEquals(0, calendar.get(SECOND));
assertEquals(0, calendar.get(MILLISECOND));
str = "-19951123";
calendar = fdp.getCalendar(str);
assertEquals(TimeZone.getDefault(), calendar.getTimeZone());
assertEquals(GregorianCalendar.BC, calendar.get(ERA));
assertEquals(year, calendar.get(YEAR));
assertEquals(month, calendar.get(MONTH));
assertEquals(day, calendar.get(DAY_OF_MONTH));
assertEquals(0, calendar.get(HOUR_OF_DAY));
assertEquals(0, calendar.get(MINUTE));
assertEquals(0, calendar.get(SECOND));
assertEquals(0, calendar.get(MILLISECOND));
str = "-1995-11-23T16:41:36.512+2";
calendar = fdp.getCalendar(str);
assertEquals(TimeZone.getTimeZone("GMT+2"), calendar.getTimeZone());
assertEquals(GregorianCalendar.BC, calendar.get(ERA));
assertEquals(year, calendar.get(YEAR));
assertEquals(month, calendar.get(MONTH));
assertEquals(day, calendar.get(DAY_OF_MONTH));
assertEquals(hour, calendar.get(HOUR_OF_DAY));
assertEquals(min, calendar.get(MINUTE));
assertEquals(sec, calendar.get(SECOND));
assertEquals(mil, calendar.get(MILLISECOND));
}
@Test
public void testSpeed() throws ParseException {
long before, after;
String str;
final Calendar date = Calendar.getInstance();
int year = 1995;
int month = 10; //starts at 0
int day = 23;
int hour = 16;
int min = 41;
int sec = 36;
int mil = 512;
final int nb = 10000;
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("GMT+0"));
final ISODateParser fdp = new ISODateParser();
//complete date --------------------------------------------------------
str = "1995-11-23T16:41:36Z";
date.setTime(sdf.parse(str));
date.setTimeZone(TimeZone.getTimeZone("GMT+0"));
assertEquals(year, date.get(YEAR));
assertEquals(month, date.get(MONTH));
assertEquals(day, date.get(DAY_OF_MONTH));
assertEquals(hour, date.get(HOUR_OF_DAY));
assertEquals(min, date.get(MINUTE));
assertEquals(sec, date.get(SECOND));
assertEquals(0, date.get(MILLISECOND));
before = System.currentTimeMillis();
for(int i=0; i<nb; i++){
sdf.parse(str);
}
after = System.currentTimeMillis();
final long sdfComplete = (after-before);
System.out.println("Simple date format perform in = " + sdfComplete +" ms");
date.setTime(fdp.parseToDate(str));
date.setTimeZone(TimeZone.getTimeZone("GMT+0"));
assertEquals(year, date.get(YEAR));
assertEquals(month, date.get(MONTH));
assertEquals(day, date.get(DAY_OF_MONTH));
assertEquals(hour, date.get(HOUR_OF_DAY));
assertEquals(min, date.get(MINUTE));
assertEquals(sec, date.get(SECOND));
assertEquals(0, date.get(MILLISECOND));
before = System.currentTimeMillis();
for(int i=0; i<nb; i++){
fdp.parseToDate(str);
}
after = System.currentTimeMillis();
final long fdpComplete = (after-before);
System.out.println("Fast date parser perform in = " + fdpComplete +" ms");
assertTrue(fdpComplete < sdfComplete);
// not all char field --------------------------------------------------
str = "5-1-3T6:1:6Z";
date.setTime(sdf.parse(str));
date.setTimeZone(TimeZone.getTimeZone("GMT+0"));
assertEquals(5, date.get(YEAR));
assertEquals(0, date.get(MONTH));
assertEquals(3, date.get(DAY_OF_MONTH));
assertEquals(6, date.get(HOUR_OF_DAY));
assertEquals(1, date.get(MINUTE));
assertEquals(6, date.get(SECOND));
assertEquals(0, date.get(MILLISECOND));
before = System.currentTimeMillis();
for(int i=0; i<nb; i++){
sdf.parse(str);
}
after = System.currentTimeMillis();
final long sdfPart = (after-before);
System.out.println("Simple date format perform in = " + sdfPart +" ms");
date.setTime(fdp.parseToDate(str));
date.setTimeZone(TimeZone.getTimeZone("GMT+0"));
assertEquals(5, date.get(YEAR));
assertEquals(0, date.get(MONTH));
assertEquals(3, date.get(DAY_OF_MONTH));
assertEquals(6, date.get(HOUR_OF_DAY));
assertEquals(1, date.get(MINUTE));
assertEquals(6, date.get(SECOND));
assertEquals(0, date.get(MILLISECOND));
before = System.currentTimeMillis();
for(int i=0; i<nb; i++){
fdp.parseToDate(str);
}
after = System.currentTimeMillis();
final long fdpPart = (after-before);
System.out.println("Fast date parser perform in = " + fdpPart +" ms");
if (fdpPart >= sdfPart) {
Logging.getLogger("org.geotoolkit.temporal.object").warning("ISODateParser is slower than expected.");
}
}
}