/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* 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; either
* version 2.1 of the License, or (at your option) any later version.
*
* 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.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.core.util;
import static org.junit.Assert.*;
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimeZone;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class TestTimestampWithTimezone {
@Before public void setUp() {
TimestampWithTimezone.resetCalendar(TimeZone.getTimeZone("America/Chicago")); //$NON-NLS-1$
}
@After public void tearDown() {
TimestampWithTimezone.resetCalendar(null);
}
/**
* Ensures that the same calendar fields in different timezones (initially different UTC) can be converted to the same UTC in
* the local time zone
*
* @param startts
* @param startnanos
* @param starttz
* @param endtz
* @since 4.3
*/
public void helpTestSame(String startts,
int startnanos,
String starttz,
String endtz) {
try {
Timestamp start = getTimestamp(startts, startnanos, starttz);
Timestamp end = getTimestamp(startts, startnanos, endtz);
assertFalse("Initial timestamps should be different UTC times", start.getTime() == end.getTime()); //$NON-NLS-1$
assertEquals(TimestampWithTimezone.createTimestamp(start, TimeZone.getTimeZone(starttz), Calendar.getInstance())
.getTime(), TimestampWithTimezone.createTimestamp(end,
TimeZone.getTimeZone(endtz),
Calendar.getInstance()).getTime());
} catch (ParseException e) {
fail(e.toString());
}
}
/**
* Assuming local time zone of -06:00, change ts to endtz and compare to expected
*
* @param ts
* @param endtz
* @since 4.3
*/
public void helpTestChange(String ts,
String endtz,
String expected) {
Timestamp start = Timestamp.valueOf(ts);
Calendar target = Calendar.getInstance(TimeZone.getTimeZone(endtz));
assertEquals(expected,
TimestampWithTimezone.createTimestamp(start, TimeZone.getTimeZone("America/Chicago"), target).toString()); //$NON-NLS-1$
}
/**
* @param startts
* @param startnanos
* @param starttz
* @throws ParseException
* @since 4.3
*/
private Timestamp getTimestamp(String startts,
int startnanos,
String starttz) throws ParseException {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); //$NON-NLS-1$
df.setTimeZone(TimeZone.getTimeZone(starttz));
Timestamp ts = new Timestamp(df.parse(startts).getTime());
ts.setNanos(startnanos);
return ts;
}
@Test public void testDST() {
helpTestSame("2005-10-30 02:39:10", 1, "America/Chicago", //$NON-NLS-1$ //$NON-NLS-2$
"GMT-05:00"); //$NON-NLS-1$
// ambiguous times are defaulted to standard time equivalent
helpTestSame("2005-10-30 01:39:10", 1, "America/Chicago", //$NON-NLS-1$ //$NON-NLS-2$
"GMT"); //$NON-NLS-1$
// test to ensure a time not representable in DST is converted correctly
helpTestSame("2005-04-03 02:39:10", 1, "GMT", //$NON-NLS-1$ //$NON-NLS-2$
"America/Chicago"); //$NON-NLS-1$
//expected is in DST
helpTestChange("2005-10-30 02:39:10.1", "GMT", "2005-10-29 21:39:10.1"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
//expected is in standard time
helpTestChange("2005-10-30 10:39:10.1", "GMT", "2005-10-30 04:39:10.1"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
@Test public void testTimezone() {
helpTestSame("2004-06-29 15:39:10", 1, "GMT-06:00", //$NON-NLS-1$ //$NON-NLS-2$
"GMT-05:00"); //$NON-NLS-1$
}
@Test public void testTimezone2() {
helpTestSame("2004-06-29 15:39:10", 1, "GMT-08:00", //$NON-NLS-1$ //$NON-NLS-2$
"GMT-06:00"); //$NON-NLS-1$
}
@Test public void testTimezone3() {
helpTestSame("2004-08-31 18:25:54", 1, "Europe/London", //$NON-NLS-1$ //$NON-NLS-2$
"GMT"); //$NON-NLS-1$
}
@Test public void testTimezoneOverMidnight() {
helpTestSame("2004-06-30 23:39:10", 1, "America/Los_Angeles", //$NON-NLS-1$ //$NON-NLS-2$
"America/Chicago"); //$NON-NLS-1$
}
@Test public void testCase2852() {
helpTestSame("2005-05-17 22:35:33", 508659, "GMT", //$NON-NLS-1$ //$NON-NLS-2$
"America/New_York"); //$NON-NLS-1$
}
@Test public void testCreateDate() {
Timestamp t = Timestamp.valueOf("2004-06-30 23:39:10.1201"); //$NON-NLS-1$
Date date = TimestampWithTimezone.createDate(t);
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(date.getTime());
assertEquals(cal.get(Calendar.HOUR_OF_DAY), 0);
assertEquals(cal.get(Calendar.MINUTE), 0);
assertEquals(cal.get(Calendar.SECOND), 0);
assertEquals(cal.get(Calendar.MILLISECOND), 0);
assertEquals(cal.get(Calendar.YEAR), 2004);
assertEquals(cal.get(Calendar.MONTH), Calendar.JUNE);
assertEquals(cal.get(Calendar.DATE), 30);
}
@Test public void testCreateTime() {
Timestamp t = Timestamp.valueOf("2004-06-30 23:39:10.1201"); //$NON-NLS-1$
Time date = TimestampWithTimezone.createTime(t);
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(date.getTime());
assertEquals(cal.get(Calendar.HOUR_OF_DAY), 23);
assertEquals(cal.get(Calendar.MINUTE), 39);
assertEquals(cal.get(Calendar.SECOND), 10);
assertEquals(cal.get(Calendar.MILLISECOND), 0);
assertEquals(cal.get(Calendar.YEAR), 1970);
assertEquals(cal.get(Calendar.MONTH), Calendar.JANUARY);
assertEquals(cal.get(Calendar.DATE), 1);
}
/**
* Even though the id of the timezones are different, this should not change the result
*/
@Test public void testDateToDateConversion() {
Date t = Date.valueOf("2004-06-30"); //$NON-NLS-1$
Date converted = TimestampWithTimezone.createDate(t, TimeZone.getTimeZone("America/Chicago"), Calendar.getInstance(TimeZone.getTimeZone("US/Central"))); //$NON-NLS-1$ //$NON-NLS-2$
assertEquals(t.getTime(), converted.getTime());
}
@Test public void testDateToDateConversion1() {
Date t = Date.valueOf("2004-06-30"); //$NON-NLS-1$
Date converted = TimestampWithTimezone.createDate(t, TimeZone.getTimeZone("America/Chicago"), Calendar.getInstance(TimeZone.getTimeZone("GMT"))); //$NON-NLS-1$ //$NON-NLS-2$
Calendar cal = Calendar.getInstance();
cal.setTime(converted);
assertEquals(0, cal.get(Calendar.MILLISECOND));
}
}