/** * Copyright (c) 2011-2014 Exxeleron GmbH * * 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 * * http://www.apache.org/licenses/LICENSE-2.0 * * 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. */ package com.exxeleron.qjava; import static org.junit.Assert.assertEquals; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.Calendar; import java.util.Date; import org.junit.Test; public class TestDateTime { private static <T extends Serializable> byte[] pickle( final T obj ) throws IOException { final ByteArrayOutputStream baos = new ByteArrayOutputStream(); final ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(obj); oos.close(); return baos.toByteArray(); } private static <T extends Serializable> T unpickle( final byte[] b, final Class<T> cl ) throws IOException, ClassNotFoundException { final ByteArrayInputStream bais = new ByteArrayInputStream(b); final ObjectInputStream ois = new ObjectInputStream(bais); final Object o = ois.readObject(); return cl.cast(o); } @Test public void testQDate() { final Calendar c = Calendar.getInstance(); c.set(1995, 6, 1); assertEquals(-1645, (Object) new QDate(c.getTime()).getValue()); c.set(1999, 0, 1); assertEquals(-365, (Object) new QDate(c.getTime()).getValue()); c.set(2000, 0, 1); assertEquals(0, (Object) new QDate(c.getTime()).getValue()); c.set(2005, 6, 1); assertEquals(2008, (Object) new QDate(c.getTime()).getValue()); c.set(2010, 0, 1); assertEquals(3653, (Object) new QDate(c.getTime()).getValue()); assertEquals(Integer.MIN_VALUE, (Object) new QDate((Date) null).getValue()); } @Test public void testQDateToString() { assertEquals("1995.07.01", new QDate(-1645).toString()); assertEquals("1999.01.01", new QDate(-365).toString()); assertEquals("2000.01.01", new QDate(0).toString()); assertEquals("2005.07.01", new QDate(2008).toString()); assertEquals("2010.01.01", new QDate(3653).toString()); assertEquals("0Nd", new QDate(Integer.MIN_VALUE).toString()); } @Test public void testQDateFromString() { assertEquals(new QDate(-1645), QDate.fromString("1995.07.01")); assertEquals(new QDate(-365), QDate.fromString("1999.01.01")); assertEquals(new QDate(0), QDate.fromString("2000.01.01")); assertEquals(new QDate(2008), QDate.fromString("2005.07.01")); assertEquals(new QDate(3653), QDate.fromString("2010.01.01")); assertEquals(new QDate(Integer.MIN_VALUE), QDate.fromString(null)); assertEquals(new QDate(Integer.MIN_VALUE), QDate.fromString("")); assertEquals(new QDate(Integer.MIN_VALUE), QDate.fromString("0Nd")); } @Test public void testQDateSerialization() throws ClassNotFoundException, IOException { final QDate[] ref = new QDate[] { new QDate(-1645), new QDate(-365), new QDate(0), new QDate(3653), new QDate(Integer.MIN_VALUE) }; for ( int i = 0; i < ref.length; i++ ) { final QDate copy = unpickle(pickle(ref[i]), QDate.class); assertEquals(ref[i], copy); assertEquals(ref[i].toString(), copy.toString()); assertEquals(ref[i].getValue(), copy.getValue()); } } @Test public void testQDateTime() { final Calendar c = Calendar.getInstance(); c.set(1999, 0, 1, 23, 59, 59); c.set(Calendar.MILLISECOND, 0); assertEquals(-364.0000116, new QDateTime(c.getTime()).getValue(), 0.1); c.set(2000, 0, 1, 0, 0, 0); assertEquals(0., new QDateTime(c.getTime()).getValue(), 0.1); c.set(2005, 6, 1, 1, 59, 59); assertEquals(2008.0833218, new QDateTime(c.getTime()).getValue(), 0.1); c.set(2010, 0, 1, 14, 23, 42); assertEquals(3653.599792, new QDateTime(c.getTime()).getValue(), 0.1); assertEquals(Double.NaN, (Object) new QDateTime((Date) null).getValue()); } @Test public void testQDateTimeToString() { assertEquals(true, new QDateTime(-364.0000115).toString().startsWith("1999.01.01T23:59:59.0")); assertEquals("2000.01.01T00:00:00.000", new QDateTime(0.).toString()); assertEquals(true, new QDateTime(2008.0833218).toString().startsWith("2005.07.01T01:59:59.0")); assertEquals(true, new QDateTime(3653.599792).toString().startsWith("2010.01.01T14:23:42.0")); assertEquals("0Nz", new QDateTime(Double.NaN).toString()); } @Test public void testQDateTimeFromString() { assertEquals(new QDateTime(-364.0000115).getValue(), QDateTime.fromString("1999.01.01T23:59:59.000").getValue(), 0.001); assertEquals(new QDateTime(0.).getValue(), QDateTime.fromString("2000.01.01T00:00:00.000").getValue(), 0.001); assertEquals(new QDateTime(2008.0833218).getValue(), QDateTime.fromString("2005.07.01T01:59:59.000").getValue(), 0.001); assertEquals(new QDateTime(3653.599792).getValue(), QDateTime.fromString("2010.01.01T14:23:42.000").getValue(), 0.001); assertEquals(new QDateTime(Double.NaN), QDateTime.fromString(null)); assertEquals(new QDateTime(Double.NaN), QDateTime.fromString("")); assertEquals(new QDateTime(Double.NaN), QDateTime.fromString("0Nz")); } @Test public void testQDateTimeSerialization() throws ClassNotFoundException, IOException { final QDateTime[] ref = new QDateTime[] { new QDateTime(-364.0000115), new QDateTime(2008.0833218), new QDateTime(0.), new QDateTime(3653.599792), new QDateTime(Double.NaN) }; for ( int i = 0; i < ref.length; i++ ) { final QDateTime copy = unpickle(pickle(ref[i]), QDateTime.class); assertEquals(ref[i], copy); assertEquals(ref[i].toString(), copy.toString()); assertEquals(ref[i].getValue(), copy.getValue()); } } @Test public void testQMinute() { final Calendar c = Calendar.getInstance(); c.set(2000, 0, 1, 0, 0); assertEquals(0, (Object) new QMinute(c.getTime()).getValue()); c.set(2000, 0, 1, 13, 30); assertEquals(810, (Object) new QMinute(c.getTime()).getValue()); c.set(2000, 0, 1, 23, 59); assertEquals(1439, (Object) new QMinute(c.getTime()).getValue()); assertEquals(Integer.MIN_VALUE, (Object) new QMinute((Date) null).getValue()); } @Test public void testQMinuteToString() { assertEquals("00:00", new QMinute(0).toString()); assertEquals("13:30", new QMinute(810).toString()); assertEquals("-13:30", new QMinute(-810).toString()); assertEquals("23:59", new QMinute(1439).toString()); assertEquals("-13:30", new QMinute(-810).toString()); assertEquals("52:23", new QMinute(3143).toString()); assertEquals("0Nu", new QMinute(Integer.MIN_VALUE).toString()); } @Test public void testQMinuteFromString() { assertEquals(new QMinute(0), QMinute.fromString("00:00")); assertEquals(new QMinute(12), QMinute.fromString("00:12")); assertEquals(new QMinute(-12), QMinute.fromString("-00:12")); assertEquals(new QMinute(810), QMinute.fromString("13:30")); assertEquals(new QMinute(1439), QMinute.fromString("23:59")); assertEquals(new QMinute(-810), QMinute.fromString("-13:30")); assertEquals(new QMinute(3143), QMinute.fromString("52:23")); assertEquals(new QMinute(Integer.MIN_VALUE), QMinute.fromString(null)); assertEquals(new QMinute(Integer.MIN_VALUE), QMinute.fromString("")); assertEquals(new QMinute(Integer.MIN_VALUE), QMinute.fromString("0Nu")); } @Test public void testQMinuteSerialization() throws ClassNotFoundException, IOException { final QMinute[] ref = new QMinute[] { new QMinute(-1645), new QMinute(0), new QMinute(3653), new QMinute(Integer.MIN_VALUE) }; for ( int i = 0; i < ref.length; i++ ) { final QMinute copy = unpickle(pickle(ref[i]), QMinute.class); assertEquals(ref[i], copy); assertEquals(ref[i].toString(), copy.toString()); assertEquals(ref[i].getValue(), copy.getValue()); } } @Test public void testQMonth() { final Calendar c = Calendar.getInstance(); c.set(1995, 0, 1); assertEquals(-60, (Object) new QMonth(c.getTime()).getValue()); c.set(1995, 6, 1); assertEquals(-54, (Object) new QMonth(c.getTime()).getValue()); c.set(2000, 0, 1); assertEquals(0, (Object) new QMonth(c.getTime()).getValue()); c.set(2005, 6, 1); assertEquals(66, (Object) new QMonth(c.getTime()).getValue()); c.set(2010, 0, 1); assertEquals(120, (Object) new QMonth(c.getTime()).getValue()); assertEquals(Integer.MIN_VALUE, (Object) new QMonth((Date) null).getValue()); } @Test public void testQMonthToString() { assertEquals("1995.01m", new QMonth(-60).toString()); assertEquals("1995.07m", new QMonth(-54).toString()); assertEquals("2000.01m", new QMonth(0).toString()); assertEquals("2005.07m", new QMonth(66).toString()); assertEquals("2010.01m", new QMonth(120).toString()); assertEquals("0Nm", new QMonth(Integer.MIN_VALUE).toString()); } @Test public void testQMonthFromString() { assertEquals(new QMonth(-60), QMonth.fromString("1995.01m")); assertEquals(new QMonth(-54), QMonth.fromString("1995.07m")); assertEquals(new QMonth(0), QMonth.fromString("2000.01m")); assertEquals(new QMonth(66), QMonth.fromString("2005.07m")); assertEquals(new QMonth(120), QMonth.fromString("2010.01m")); assertEquals(new QMonth(Integer.MIN_VALUE), QMonth.fromString(null)); assertEquals(new QMonth(Integer.MIN_VALUE), QMonth.fromString("")); assertEquals(new QMonth(Integer.MIN_VALUE), QMonth.fromString("0Nm")); } @Test public void testQMonthSerialization() throws ClassNotFoundException, IOException { final QMonth[] ref = new QMonth[] { new QMonth(-1645), new QMonth(0), new QMonth(3653), new QMonth(Integer.MIN_VALUE) }; for ( int i = 0; i < ref.length; i++ ) { final QMonth copy = unpickle(pickle(ref[i]), QMonth.class); assertEquals(ref[i], copy); assertEquals(ref[i].toString(), copy.toString()); assertEquals(ref[i].getValue(), copy.getValue()); } } @Test public void testQSecond() { final Calendar c = Calendar.getInstance(); c.set(2000, 0, 1, 0, 0, 0); assertEquals(0, (Object) new QSecond(c.getTime()).getValue()); c.set(2000, 0, 1, 13, 30, 13); assertEquals(48613, (Object) new QSecond(c.getTime()).getValue()); c.set(2000, 0, 1, 23, 59, 59); assertEquals(86399, (Object) new QSecond(c.getTime()).getValue()); assertEquals(Integer.MIN_VALUE, (Object) new QSecond((Date) null).getValue()); } @Test public void testQSecondToString() { assertEquals("00:00:00", new QSecond(0).toString()); assertEquals("13:30:13", new QSecond(48613).toString()); assertEquals("-13:30:13", new QSecond(-48613).toString()); assertEquals("23:59:59", new QSecond(86399).toString()); assertEquals("51:46:39", new QSecond(186399).toString()); assertEquals("-23:59:59", new QSecond(-86399).toString()); assertEquals("0Nv", new QSecond(Integer.MIN_VALUE).toString()); } @Test public void testQSecondFromString() { assertEquals(new QSecond(0), QSecond.fromString("00:00:00")); assertEquals(new QSecond(70), QSecond.fromString("00:01:10")); assertEquals(new QSecond(-70), QSecond.fromString("-00:01:10")); assertEquals(new QSecond(48613), QSecond.fromString("13:30:13")); assertEquals(new QSecond(86399), QSecond.fromString("23:59:59")); assertEquals(new QSecond(186399), QSecond.fromString("51:46:39")); assertEquals(new QSecond(-86399), QSecond.fromString("-23:59:59")); assertEquals(new QSecond(Integer.MIN_VALUE), QSecond.fromString(null)); assertEquals(new QSecond(Integer.MIN_VALUE), QSecond.fromString("")); assertEquals(new QSecond(Integer.MIN_VALUE), QSecond.fromString("0Nv")); } @Test public void testQSecondSerialization() throws ClassNotFoundException, IOException { final QSecond[] ref = new QSecond[] { new QSecond(-1645), new QSecond(0), new QSecond(3653), new QSecond(Integer.MIN_VALUE) }; for ( int i = 0; i < ref.length; i++ ) { final QSecond copy = unpickle(pickle(ref[i]), QSecond.class); assertEquals(ref[i], copy); assertEquals(ref[i].toString(), copy.toString()); assertEquals(ref[i].getValue(), copy.getValue()); } } @Test public void testQTime() { final Calendar c = Calendar.getInstance(); c.set(2000, 0, 1, 0, 0, 0); c.set(Calendar.MILLISECOND, 0); assertEquals(0, (Object) new QTime(c.getTime()).getValue()); c.set(2000, 0, 1, 13, 30, 13); assertEquals(48613000, (Object) new QTime(c.getTime()).getValue()); c.set(2000, 0, 1, 23, 59, 59); assertEquals(86399000, (Object) new QTime(c.getTime()).getValue()); assertEquals(Integer.MIN_VALUE, (Object) new QTime((Date) null).getValue()); } @Test public void testQTimeToString() { assertEquals("00:00:00.000", new QTime(0).toString()); assertEquals("-13:30:13.000", new QTime(-48613000).toString()); assertEquals("13:30:13.000", new QTime(48613000).toString()); assertEquals("23:59:59.001", new QTime(86399001).toString()); assertEquals("51:46:39.050", new QTime(186399050).toString()); assertEquals("-23:59:59.100", new QTime(-86399100).toString()); assertEquals("0Nt", new QTime(Integer.MIN_VALUE).toString()); } @Test public void testQTimeFromString() { assertEquals(new QTime(48613000), QTime.fromString("13:30:13.000")); assertEquals(new QTime(0), QTime.fromString("00:00:00.000")); assertEquals(new QTime(10000), QTime.fromString("00:00:10.000")); assertEquals(new QTime(-10000), QTime.fromString("-00:00:10.000")); assertEquals(new QTime(86399000), QTime.fromString("23:59:59.000")); assertEquals(new QTime(186399001), QTime.fromString("51:46:39.001")); assertEquals(new QTime(-86399000), QTime.fromString("-23:59:59.000")); assertEquals(new QTime(Integer.MIN_VALUE), QTime.fromString(null)); assertEquals(new QTime(Integer.MIN_VALUE), QTime.fromString("")); assertEquals(new QTime(Integer.MIN_VALUE), QTime.fromString("0Nt")); } @Test public void testQTimeSerialization() throws ClassNotFoundException, IOException { final QTime[] ref = new QTime[] { new QTime(-1645), new QTime(0), new QTime(3653), new QTime(Integer.MIN_VALUE) }; for ( int i = 0; i < ref.length; i++ ) { final QTime copy = unpickle(pickle(ref[i]), QTime.class); assertEquals(ref[i], copy); assertEquals(ref[i].toString(), copy.toString()); assertEquals(ref[i].getValue(), copy.getValue()); } } @Test public void testQTimespan() { final Calendar c = Calendar.getInstance(); c.set(2000, 0, 1, 0, 0, 0); c.set(Calendar.MILLISECOND, 0); assertEquals(0L, (Object) new QTimespan(c.getTime()).getValue()); c.set(2000, 0, 1, 13, 30, 13); assertEquals(48613000000000L, (Object) new QTimespan(c.getTime()).getValue()); c.set(2000, 0, 1, 23, 59, 59); assertEquals(86399000000000L, (Object) new QTimespan(c.getTime()).getValue()); assertEquals(Long.MIN_VALUE, (Object) new QTimespan((Date) null).getValue()); } @Test public void testQTimespanToString() { assertEquals("0D00:00:00.000000000", new QTimespan(0L).toString()); assertEquals("0D13:30:13.000000000", new QTimespan(48613000000000L).toString()); assertEquals("0D13:30:13.000000100", new QTimespan(48613000000100L).toString()); assertEquals("-0D13:30:13.000001000", new QTimespan(-48613000001000L).toString()); assertEquals("1D13:30:13.000000000", new QTimespan(135013000000000L).toString()); assertEquals("0D23:59:59.000000000", new QTimespan(86399000000000L).toString()); assertEquals("2D23:59:59.000000000", new QTimespan(259199000000000L).toString()); assertEquals("-2D23:59:59.000000000", new QTimespan(-259199000000000L).toString()); assertEquals("0Nn", new QTimespan(Long.MIN_VALUE).toString()); } @Test public void testQTimespanFromString() { assertEquals(new QTimespan(0L), QTimespan.fromString("0D00:00:00.000000000")); assertEquals(new QTimespan(48613000000000L), QTimespan.fromString("0D13:30:13.000000000")); assertEquals(new QTimespan(48613000000100L), QTimespan.fromString("0D13:30:13.000000100")); assertEquals(new QTimespan(-48613000000000L), QTimespan.fromString("-0D13:30:13.000000000")); assertEquals(new QTimespan(-48613000010000L), QTimespan.fromString("-0D13:30:13.000010000")); assertEquals(new QTimespan(135013000000000L), QTimespan.fromString("1D13:30:13.000000000")); assertEquals(new QTimespan(86399000000000L), QTimespan.fromString("0D23:59:59.000000000")); assertEquals(new QTimespan(259199000000000L), QTimespan.fromString("2D23:59:59.000000000")); assertEquals(new QTimespan(-259199000000000L), QTimespan.fromString("-2D23:59:59.000000000")); assertEquals(new QTimespan(Long.MIN_VALUE), QTimespan.fromString(null)); assertEquals(new QTimespan(Long.MIN_VALUE), QTimespan.fromString("")); assertEquals(new QTimespan(Long.MIN_VALUE), QTimespan.fromString("0Nn")); } @Test public void testQTimespanSerialization() throws ClassNotFoundException, IOException { final QTimespan[] ref = new QTimespan[] { new QTimespan(-259199000000000L), new QTimespan(0L), new QTimespan(48613000000000L), new QTimespan(Long.MIN_VALUE) }; for ( int i = 0; i < ref.length; i++ ) { final QTimespan copy = unpickle(pickle(ref[i]), QTimespan.class); assertEquals(ref[i], copy); assertEquals(ref[i].toString(), copy.toString()); assertEquals(ref[i].getValue(), copy.getValue()); } } @Test public void testQTimestamp() { final Calendar c = Calendar.getInstance(); c.set(1995, 6, 1, 13, 30, 13); c.set(Calendar.MILLISECOND, 0); assertEquals(-142079387000000000L, (Object) new QTimestamp(c.getTime()).getValue()); c.set(1999, 0, 1, 23, 59, 59); assertEquals(-31449601000000000L, (Object) new QTimestamp(c.getTime()).getValue()); c.set(2000, 0, 1, 0, 0, 0); assertEquals(0L, (Object) new QTimestamp(c.getTime()).getValue()); c.set(2005, 6, 1, 1, 59, 59); assertEquals(173498399000000000L, (Object) new QTimestamp(c.getTime()).getValue()); c.set(2010, 0, 1, 14, 23, 42); assertEquals(315671022000000000L, (Object) new QTimestamp(c.getTime()).getValue()); assertEquals(Long.MIN_VALUE, (Object) new QTimestamp((Date) null).getValue()); } @Test public void testQTimestampToString() { assertEquals("1995.07.01D13:30:13.000000000", new QTimestamp(-142079387000000000L).toString()); assertEquals("1999.01.01D23:59:59.000000000", new QTimestamp(-31449601000000000L).toString()); assertEquals("2000.01.01D00:00:00.000000000", new QTimestamp(0L).toString()); assertEquals("2005.07.01D01:59:59.000000012", new QTimestamp(173498399000000012L).toString()); assertEquals("2010.01.01D14:23:42.000000066", new QTimestamp(315671022000000066L).toString()); assertEquals("0Np", new QTimestamp(Long.MIN_VALUE).toString()); } @Test public void testQTimestampFromString() { assertEquals(new QTimestamp(-142079387000000000L), QTimestamp.fromString("1995.07.01D13:30:13.000000000")); assertEquals(new QTimestamp(-31449601000000000L), QTimestamp.fromString("1999.01.01D23:59:59.000000000")); assertEquals(new QTimestamp(0L), QTimestamp.fromString("2000.01.01D00:00:00.000000000")); assertEquals(new QTimestamp(173498399000000012L), QTimestamp.fromString("2005.07.01D01:59:59.000000012")); assertEquals(new QTimestamp(315671022000000066L), QTimestamp.fromString("2010.01.01D14:23:42.000000066")); assertEquals(new QTimestamp(Long.MIN_VALUE), QTimestamp.fromString(null)); assertEquals(new QTimestamp(Long.MIN_VALUE), QTimestamp.fromString("")); assertEquals(new QTimestamp(Long.MIN_VALUE), QTimestamp.fromString("0Np")); } @Test public void testQTimestampSerialization() throws ClassNotFoundException, IOException { final QTimestamp[] ref = new QTimestamp[] { new QTimestamp(-259199000000000L), new QTimestamp(0L), new QTimestamp(48613000000000L), new QTimestamp(Long.MIN_VALUE) }; for ( int i = 0; i < ref.length; i++ ) { final QTimestamp copy = unpickle(pickle(ref[i]), QTimestamp.class); assertEquals(ref[i], copy); assertEquals(ref[i].toString(), copy.toString()); assertEquals(ref[i].getValue(), copy.getValue()); } } }