package com.cedarsoftware.util;
import org.junit.Assert;
import org.junit.Test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
import java.util.Calendar;
import java.util.Date;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
/**
* @author John DeRegnaucourt (john@cedarsoftware.com)
* <br>
* Copyright (c) Cedar Software LLC
* <br><br>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <br><br>
* http://www.apache.org/licenses/LICENSE-2.0
* <br><br>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
public class TestDateUtilities
{
@Test
public void testXmlDates()
{
Date t12 = DateUtilities.parseDate("2013-08-30T22:00Z");
Date t22 = DateUtilities.parseDate("2013-08-30T22:00+00:00");
Date t32 = DateUtilities.parseDate("2013-08-30T22:00-00:00");
Date t42 = DateUtilities.parseDate("2013-08-30T22:00+0000");
Date t52 = DateUtilities.parseDate("2013-08-30T22:00-0000");
assertEquals(t12, t22);
assertEquals(t22, t32);
assertEquals(t32, t42);
assertEquals(t42, t52);
Date t11 = DateUtilities.parseDate("2013-08-30T22:00:00Z");
Date t21 = DateUtilities.parseDate("2013-08-30T22:00:00+00:00");
Date t31 = DateUtilities.parseDate("2013-08-30T22:00:00-00:00");
Date t41 = DateUtilities.parseDate("2013-08-30T22:00:00+0000");
Date t51 = DateUtilities.parseDate("2013-08-30T22:00:00-0000");
assertEquals(t11, t12);
assertEquals(t11, t21);
assertEquals(t21, t31);
assertEquals(t31, t41);
assertEquals(t41, t51);
Date t1 = DateUtilities.parseDate("2013-08-30T22:00:00.0Z");
Date t2 = DateUtilities.parseDate("2013-08-30T22:00:00.0+00:00");
Date t3 = DateUtilities.parseDate("2013-08-30T22:00:00.0-00:00");
Date t4 = DateUtilities.parseDate("2013-08-30T22:00:00.0+0000");
Date t5 = DateUtilities.parseDate("2013-08-30T22:00:00.0-0000");
assertEquals(t1, t11);
assertEquals(t1, t2);
assertEquals(t2, t3);
assertEquals(t3, t4);
assertEquals(t4, t5);
Date t13 = DateUtilities.parseDate("2013-08-30T22:00:00.000000000Z");
Date t23 = DateUtilities.parseDate("2013-08-30T22:00:00.000000000+00:00");
Date t33 = DateUtilities.parseDate("2013-08-30T22:00:00.000000000-00:00");
Date t43 = DateUtilities.parseDate("2013-08-30T22:00:00.000000000+0000");
Date t53 = DateUtilities.parseDate("2013-08-30T22:00:00.000000000-0000");
assertEquals(t13, t1);
assertEquals(t13, t23);
assertEquals(t23, t33);
assertEquals(t33, t43);
assertEquals(t43, t53);
Date t14 = DateUtilities.parseDate("2013-08-30T22:00:00.123456789Z");
Date t24 = DateUtilities.parseDate("2013-08-30T22:00:00.123456789+00:00");
Date t34 = DateUtilities.parseDate("2013-08-30T22:00:00.123456789-00:00");
Date t44 = DateUtilities.parseDate("2013-08-30T22:00:00.123456789+0000");
Date t54 = DateUtilities.parseDate("2013-08-30T22:00:00.123456789-0000");
assertNotEquals(t14, t13);
assertEquals(t14, t24);
assertEquals(t24, t34);
assertEquals(t34, t44);
assertEquals(t44, t54);
}
@Test
public void testXmlDatesWithOffsets()
{
Date t1 = DateUtilities.parseDate("2013-08-30T22:00Z");
Date t2 = DateUtilities.parseDate("2013-08-30T22:00+01:00");
Date t3 = DateUtilities.parseDate("2013-08-30T22:00-01:00");
Date t4 = DateUtilities.parseDate("2013-08-30T22:00+0100");
Date t5 = DateUtilities.parseDate("2013-08-30T22:00-0100");
assertEquals(60 * 60 * 1000, t1.getTime() - t2.getTime());
assertEquals(-60 * 60 * 1000, t1.getTime() - t3.getTime());
assertEquals(60 * 60 * 1000, t1.getTime() - t4.getTime());
assertEquals(-60 * 60 * 1000, t1.getTime() - t5.getTime());
t1 = DateUtilities.parseDate("2013-08-30T22:17Z");
t2 = DateUtilities.parseDate("2013-08-30T22:17+01:00");
t3 = DateUtilities.parseDate("2013-08-30T22:17-01:00");
t4 = DateUtilities.parseDate("2013-08-30T22:17+0100");
t5 = DateUtilities.parseDate("2013-08-30T22:17-0100");
assertEquals(60 * 60 * 1000, t1.getTime() - t2.getTime());
assertEquals(-60 * 60 * 1000, t1.getTime() - t3.getTime());
assertEquals(60 * 60 * 1000, t1.getTime() - t4.getTime());
assertEquals(-60 * 60 * 1000, t1.getTime() - t5.getTime());
t1 = DateUtilities.parseDate("2013-08-30T22:17:34Z");
t2 = DateUtilities.parseDate("2013-08-30T22:17:34+01:00");
t3 = DateUtilities.parseDate("2013-08-30T22:17:34-01:00");
t4 = DateUtilities.parseDate("2013-08-30T22:17:34+0100");
t5 = DateUtilities.parseDate("2013-08-30T22:17:34-0100");
assertEquals(60 * 60 * 1000, t1.getTime() - t2.getTime());
assertEquals(-60 * 60 * 1000, t1.getTime() - t3.getTime());
assertEquals(60 * 60 * 1000, t1.getTime() - t4.getTime());
assertEquals(-60 * 60 * 1000, t1.getTime() - t5.getTime());
t1 = DateUtilities.parseDate("2013-08-30T22:17:34.123456789Z");
t2 = DateUtilities.parseDate("2013-08-30T22:17:34.123456789+01:00");
t3 = DateUtilities.parseDate("2013-08-30T22:17:34.123456789-01:00");
t4 = DateUtilities.parseDate("2013-08-30T22:17:34.123456789+0100");
t5 = DateUtilities.parseDate("2013-08-30T22:17:34.123456789-0100");
assertEquals(60 * 60 * 1000, t1.getTime() - t2.getTime());
assertEquals(-60 * 60 * 1000, t1.getTime() - t3.getTime());
assertEquals(60 * 60 * 1000, t1.getTime() - t4.getTime());
assertEquals(-60 * 60 * 1000, t1.getTime() - t5.getTime());
t1 = DateUtilities.parseDate("2013-08-30T22:17:34.123456789Z");
t2 = DateUtilities.parseDate("2013-08-30T22:17:34.123456789+13:00");
t3 = DateUtilities.parseDate("2013-08-30T22:17:34.123456789-13:00");
t4 = DateUtilities.parseDate("2013-08-30T22:17:34.123456789+1300");
t5 = DateUtilities.parseDate("2013-08-30T22:17:34.123456789-1300");
assertEquals(60 * 60 * 1000 * 13, t1.getTime() - t2.getTime());
assertEquals(-60 * 60 * 1000 * 13, t1.getTime() - t3.getTime());
assertEquals(60 * 60 * 1000 * 13, t1.getTime() - t4.getTime());
assertEquals(-60 * 60 * 1000 * 13, t1.getTime() - t5.getTime());
}
@Test
public void testXmlDatesWithMinuteOffsets()
{
Date t1 = DateUtilities.parseDate("2013-08-30T22:17:34.123456789Z");
Date t2 = DateUtilities.parseDate("2013-08-30T22:17:34.123456789+00:01");
Date t3 = DateUtilities.parseDate("2013-08-30T22:17:34.123456789-00:01");
Date t4 = DateUtilities.parseDate("2013-08-30T22:17:34.123456789+0001");
Date t5 = DateUtilities.parseDate("2013-08-30T22:17:34.123456789-0001");
assertEquals(60 * 1000, t1.getTime() - t2.getTime());
assertEquals(-60 * 1000, t1.getTime() - t3.getTime());
assertEquals(60 * 1000, t1.getTime() - t4.getTime());
assertEquals(-60 * 1000, t1.getTime() - t5.getTime());
t1 = DateUtilities.parseDate("2013-08-30T22:17Z");
t2 = DateUtilities.parseDate("2013-08-30T22:17+00:01");
t3 = DateUtilities.parseDate("2013-08-30T22:17-00:01");
t4 = DateUtilities.parseDate("2013-08-30T22:17+0001");
t5 = DateUtilities.parseDate("2013-08-30T22:17-0001");
assertEquals(60 * 1000, t1.getTime() - t2.getTime());
assertEquals(-60 * 1000, t1.getTime() - t3.getTime());
assertEquals(60 * 1000, t1.getTime() - t4.getTime());
assertEquals(-60 * 1000, t1.getTime() - t5.getTime());
}
@Test
public void testConstructorIsPrivate() throws Exception
{
Class c = DateUtilities.class;
Assert.assertEquals(Modifier.FINAL, c.getModifiers() & Modifier.FINAL);
Constructor<DateUtilities> con = c.getDeclaredConstructor();
Assert.assertEquals(Modifier.PRIVATE, con.getModifiers() & Modifier.PRIVATE);
con.setAccessible(true);
Assert.assertNotNull(con.newInstance());
}
@Test
public void testDateAloneNumbers()
{
Date d1 = DateUtilities.parseDate("2014-01-18");
Calendar c = Calendar.getInstance();
c.clear();
c.set(2014, 0, 18, 0, 0, 0);
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("2014/01/18");
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("2014/1/18");
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("1/18/2014");
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("01/18/2014");
assertEquals(c.getTime(), d1);
}
@Test
public void testDateAloneNames()
{
Date d1 = DateUtilities.parseDate("2014 Jan 18");
Calendar c = Calendar.getInstance();
c.clear();
c.set(2014, 0, 18, 0, 0, 0);
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("2014 January 18");
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("2014 January, 18");
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("18 Jan 2014");
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("18 Jan, 2014");
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("Jan 18 2014");
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("Jan 18, 2014");
assertEquals(c.getTime(), d1);
}
@Test
public void testDate24TimeParse()
{
Date d1 = DateUtilities.parseDate("2014-01-18 16:43");
Calendar c = Calendar.getInstance();
c.clear();
c.set(2014, 0, 18, 16, 43, 0);
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("2014/01/18 16:43");
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("2014/1/18 16:43");
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("1/18/2014 16:43");
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("01/18/2014 16:43");
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("16:43 2014-01-18");
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("16:43 2014/01/18");
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("16:43 2014/1/18");
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("16:43 1/18/2014");
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("16:43 01/18/2014");
assertEquals(c.getTime(), d1);
}
@Test
public void testDate24TimeSecParse()
{
Date d1 = DateUtilities.parseDate("2014-01-18 16:43:27");
Calendar c = Calendar.getInstance();
c.clear();
c.set(2014, 0, 18, 16, 43, 27);
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("2014/1/18 16:43:27");
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("1/18/2014 16:43:27");
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("01/18/2014 16:43:27");
assertEquals(c.getTime(), d1);
}
@Test
public void testDate24TimeSecMilliParse()
{
Date d1 = DateUtilities.parseDate("2014-01-18 16:43:27.123");
Calendar c = Calendar.getInstance();
c.clear();
c.set(2014, 0, 18, 16, 43, 27);
c.setTimeInMillis(c.getTime().getTime() + 123);
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("2014/1/18 16:43:27.123");
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("1/18/2014 16:43:27.123");
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("01/18/2014 16:43:27.123");
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("16:43:27.123 2014-01-18");
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("16:43:27.123 2014/1/18");
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("16:43:27.123 1/18/2014");
assertEquals(c.getTime(), d1);
d1 = DateUtilities.parseDate("16:43:27.123 01/18/2014");
assertEquals(c.getTime(), d1);
}
@Test
public void testParseWithNull()
{
assertNull(DateUtilities.parseDate(null));
assertNull(DateUtilities.parseDate(""));
assertNull(DateUtilities.parseDate(" "));
}
@Test
public void testDayOfWeek()
{
DateUtilities.parseDate("thu, Dec 25, 2014");
DateUtilities.parseDate("thur, Dec 25, 2014");
DateUtilities.parseDate("thursday, December 25, 2014");
DateUtilities.parseDate("Dec 25, 2014 thu");
DateUtilities.parseDate("Dec 25, 2014 thur");
DateUtilities.parseDate("Dec 25, 2014 thursday");
DateUtilities.parseDate("thu Dec 25, 2014");
DateUtilities.parseDate("thur Dec 25, 2014");
DateUtilities.parseDate("thursday December 25, 2014");
DateUtilities.parseDate(" thu, Dec 25, 2014 ");
DateUtilities.parseDate(" thur, Dec 25, 2014 ");
DateUtilities.parseDate(" thursday, Dec 25, 2014 ");
DateUtilities.parseDate(" thu Dec 25, 2014 ");
DateUtilities.parseDate(" thur Dec 25, 2014 ");
DateUtilities.parseDate(" thursday Dec 25, 2014 ");
DateUtilities.parseDate(" Dec 25, 2014, thu ");
DateUtilities.parseDate(" Dec 25, 2014, thur ");
DateUtilities.parseDate(" Dec 25, 2014, thursday ");
try
{
DateUtilities.parseDate("text Dec 25, 2014");
fail();
}
catch (Exception ignored)
{ }
try
{
DateUtilities.parseDate("Dec 25, 2014 text");
fail();
}
catch (Exception ignored)
{ }
}
@Test
public void testDaySuffixesLower()
{
Date x = DateUtilities.parseDate("January 21st, 1994");
Calendar c = Calendar.getInstance();
c.clear();
c.set(1994, Calendar.JANUARY, 21, 0, 0, 0);
assertEquals(x, c.getTime());
x = DateUtilities.parseDate("January 22nd 1994");
c.clear();
c.set(1994, Calendar.JANUARY, 22, 0, 0, 0);
assertEquals(x, c.getTime());
x = DateUtilities.parseDate("Jan 23rd 1994");
c.clear();
c.set(1994, Calendar.JANUARY, 23, 0, 0, 0);
assertEquals(x, c.getTime());
x = DateUtilities.parseDate("June 24th, 1994");
c.clear();
c.set(1994, Calendar.JUNE, 24, 0, 0, 0);
assertEquals(x, c.getTime());
x = DateUtilities.parseDate("21st January, 1994");
c.clear();
c.set(1994, Calendar.JANUARY, 21, 0, 0, 0);
assertEquals(x, c.getTime());
x = DateUtilities.parseDate("22nd January 1994");
c.clear();
c.set(1994, Calendar.JANUARY, 22, 0, 0, 0);
assertEquals(x, c.getTime());
x = DateUtilities.parseDate("23rd Jan 1994");
c.clear();
c.set(1994, Calendar.JANUARY, 23, 0, 0, 0);
assertEquals(x, c.getTime());
x = DateUtilities.parseDate("24th June, 1994");
c.clear();
c.set(1994, Calendar.JUNE, 24, 0, 0, 0);
assertEquals(x, c.getTime());
x = DateUtilities.parseDate("24th, June, 1994");
c.clear();
c.set(1994, Calendar.JUNE, 24, 0, 0, 0);
assertEquals(x, c.getTime());
}
@Test
public void testDaySuffixesUpper()
{
Date x = DateUtilities.parseDate("January 21ST, 1994");
Calendar c = Calendar.getInstance();
c.clear();
c.set(1994, Calendar.JANUARY, 21, 0, 0, 0);
assertEquals(x, c.getTime());
x = DateUtilities.parseDate("January 22ND 1994");
c.clear();
c.set(1994, Calendar.JANUARY, 22, 0, 0, 0);
assertEquals(x, c.getTime());
x = DateUtilities.parseDate("Jan 23RD 1994");
c.clear();
c.set(1994, Calendar.JANUARY, 23, 0, 0, 0);
assertEquals(x, c.getTime());
x = DateUtilities.parseDate("June 24TH, 1994");
c.clear();
c.set(1994, Calendar.JUNE, 24, 0, 0, 0);
assertEquals(x, c.getTime());
x = DateUtilities.parseDate("21ST January, 1994");
c.clear();
c.set(1994, Calendar.JANUARY, 21, 0, 0, 0);
assertEquals(x, c.getTime());
x = DateUtilities.parseDate("22ND January 1994");
c.clear();
c.set(1994, Calendar.JANUARY, 22, 0, 0, 0);
assertEquals(x, c.getTime());
x = DateUtilities.parseDate("23RD Jan 1994");
c.clear();
c.set(1994, Calendar.JANUARY, 23, 0, 0, 0);
assertEquals(x, c.getTime());
x = DateUtilities.parseDate("24TH June, 1994");
c.clear();
c.set(1994, Calendar.JUNE, 24, 0, 0, 0);
assertEquals(x, c.getTime());
x = DateUtilities.parseDate("24TH, June, 1994");
c.clear();
c.set(1994, Calendar.JUNE, 24, 0, 0, 0);
assertEquals(x, c.getTime());
}
@Test
public void testWeirdSpacing()
{
Date x = DateUtilities.parseDate("January 21ST , 1994");
Calendar c = Calendar.getInstance();
c.clear();
c.set(1994, Calendar.JANUARY, 21, 0, 0, 0);
assertEquals(x, c.getTime());
x = DateUtilities.parseDate("January 22ND 1994");
c.clear();
c.set(1994, Calendar.JANUARY, 22, 0, 0, 0);
assertEquals(x, c.getTime());
x = DateUtilities.parseDate("January 22ND 1994 Wed");
c.clear();
c.set(1994, Calendar.JANUARY, 22, 0, 0, 0);
assertEquals(x, c.getTime());
x = DateUtilities.parseDate(" Wednesday January 22ND 1994 ");
c.clear();
c.set(1994, Calendar.JANUARY, 22, 0, 0, 0);
assertEquals(x, c.getTime());
x = DateUtilities.parseDate("22ND January 1994");
c.clear();
c.set(1994, Calendar.JANUARY, 22, 0, 0, 0);
assertEquals(x, c.getTime());
x = DateUtilities.parseDate("22ND January , 1994");
c.clear();
c.set(1994, Calendar.JANUARY, 22, 0, 0, 0);
assertEquals(x, c.getTime());
x = DateUtilities.parseDate("22ND , Jan , 1994");
c.clear();
c.set(1994, Calendar.JANUARY, 22, 0, 0, 0);
assertEquals(x, c.getTime());
x = DateUtilities.parseDate("1994 , Jan 22ND");
c.clear();
c.set(1994, Calendar.JANUARY, 22, 0, 0, 0);
assertEquals(x, c.getTime());
x = DateUtilities.parseDate("1994 , January , 22nd");
c.clear();
c.set(1994, Calendar.JANUARY, 22, 0, 0, 0);
assertEquals(x, c.getTime());
x = DateUtilities.parseDate("1994 , Jan 22ND Wed");
c.clear();
c.set(1994, Calendar.JANUARY, 22, 0, 0, 0);
assertEquals(x, c.getTime());
x = DateUtilities.parseDate("Wed 1994 , January , 22nd");
c.clear();
c.set(1994, Calendar.JANUARY, 22, 0, 0, 0);
assertEquals(x, c.getTime());
}
@Test
public void testDateToStringFormat()
{
Date x = new Date();
Date y = DateUtilities.parseDate(x.toString());
assertEquals(x.toString(), y.toString());
}
@Test
public void testParseErrors()
{
try
{
DateUtilities.parseDate("2014-11-j 16:43:27.123");
fail("should not make it here");
}
catch (Exception ignored)
{
}
try
{
DateUtilities.parseDate("2014-6-10 24:43:27.123");
fail("should not make it here");
}
catch (Exception ignored)
{
}
try
{
DateUtilities.parseDate("2014-6-10 23:61:27.123");
fail("should not make it here");
}
catch (Exception ignored)
{
}
try
{
DateUtilities.parseDate("2014-6-10 23:00:75.123");
fail("should not make it here");
}
catch (Exception igored)
{
}
try
{
DateUtilities.parseDate("27 Jume 2014");
fail("should not make it here");
}
catch (Exception ignored)
{
}
try
{
DateUtilities.parseDate("13/01/2014");
fail("should not make it here");
}
catch (Exception ignored)
{
}
try
{
DateUtilities.parseDate("00/01/2014");
fail("should not make it here");
}
catch (Exception ignored)
{
}
try
{
DateUtilities.parseDate("12/32/2014");
fail("should not make it here");
}
catch (Exception ignored)
{
}
try
{
DateUtilities.parseDate("12/00/2014");
fail("should not make it here");
}
catch (Exception ignored)
{
}
}
}