/*
* Copyright 2001-2005 Stephen Colebourne
*
* 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 org.joda.time.tz;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.DateTimeFormatterBuilder;
/**
* Test cases for DateTimeZoneBuilder.
*
* @author Brian S O'Neill
*/
public class TestBuilder extends TestCase {
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
public static TestSuite suite() {
return new TestSuite(TestBuilder.class);
}
static final DateTimeFormatter OFFSET_FORMATTER = new DateTimeFormatterBuilder()
.appendTimeZoneOffset(null, true, 2, 4)
.toFormatter();
// Each row is {transition, nameKey, standardOffset, offset}
static final String[][] AMERICA_LOS_ANGELES_DATA = {
{null, "LMT", "-07:52:58", "-07:52:58"},
{"1883-11-18T19:52:58.000Z", "PST", "-08:00", "-08:00"},
{"1918-03-31T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1918-10-27T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1919-03-30T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1919-10-26T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1942-02-09T02:00:00.000-08:00", "PWT", "-08:00", "-07:00"},
{"1945-08-14T23:00:00.000Z", "PPT", "-08:00", "-07:00"},
{"1945-09-30T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1948-03-14T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1949-01-01T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1950-04-30T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1950-09-24T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1951-04-29T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1951-09-30T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1952-04-27T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1952-09-28T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1953-04-26T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1953-09-27T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1954-04-25T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1954-09-26T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1955-04-24T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1955-09-25T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1956-04-29T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1956-09-30T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1957-04-28T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1957-09-29T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1958-04-27T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1958-09-28T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1959-04-26T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1959-09-27T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1960-04-24T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1960-09-25T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1961-04-30T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1961-09-24T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1962-04-29T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1962-10-28T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1963-04-28T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1963-10-27T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1964-04-26T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1964-10-25T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1965-04-25T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1965-10-31T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1966-04-24T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1966-10-30T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1967-04-30T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1967-10-29T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1968-04-28T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1968-10-27T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1969-04-27T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1969-10-26T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1970-04-26T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1970-10-25T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1971-04-25T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1971-10-31T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1972-04-30T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1972-10-29T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1973-04-29T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1973-10-28T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1974-01-06T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1974-10-27T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1975-02-23T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1975-10-26T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1976-04-25T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1976-10-31T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1977-04-24T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1977-10-30T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1978-04-30T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1978-10-29T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1979-04-29T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1979-10-28T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1980-04-27T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1980-10-26T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1981-04-26T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1981-10-25T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1982-04-25T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1982-10-31T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1983-04-24T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1983-10-30T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1984-04-29T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1984-10-28T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1985-04-28T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1985-10-27T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1986-04-27T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1986-10-26T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1987-04-05T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1987-10-25T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1988-04-03T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1988-10-30T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1989-04-02T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1989-10-29T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1990-04-01T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1990-10-28T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1991-04-07T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1991-10-27T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1992-04-05T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1992-10-25T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1993-04-04T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1993-10-31T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1994-04-03T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1994-10-30T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1995-04-02T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1995-10-29T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1996-04-07T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1996-10-27T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1997-04-06T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1997-10-26T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1998-04-05T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1998-10-25T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"1999-04-04T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"1999-10-31T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
{"2000-04-02T02:00:00.000-08:00", "PDT", "-08:00", "-07:00"},
{"2000-10-29T02:00:00.000-07:00", "PST", "-08:00", "-08:00"},
};
static DateTimeZoneBuilder buildAmericaLosAngelesBuilder() {
return new DateTimeZoneBuilder()
.addCutover(-2147483648, 'w', 1, 1, 0, false, 0)
.setStandardOffset(-28378000)
.setFixedSavings("LMT", 0)
.addCutover(1883, 'w', 11, 18, 0, false, 43200000)
.setStandardOffset(-28800000)
.addRecurringSavings("PDT", 3600000, 1918, 1919, 'w', 3, -1, 7, false, 7200000)
.addRecurringSavings("PST", 0, 1918, 1919, 'w', 10, -1, 7, false, 7200000)
.addRecurringSavings("PWT", 3600000, 1942, 1942, 'w', 2, 9, 0, false, 7200000)
.addRecurringSavings("PPT", 3600000, 1945, 1945, 'u', 8, 14, 0, false, 82800000)
.addRecurringSavings("PST", 0, 1945, 1945, 'w', 9, 30, 0, false, 7200000)
.addRecurringSavings("PDT", 3600000, 1948, 1948, 'w', 3, 14, 0, false, 7200000)
.addRecurringSavings("PST", 0, 1949, 1949, 'w', 1, 1, 0, false, 7200000)
.addRecurringSavings("PDT", 3600000, 1950, 1966, 'w', 4, -1, 7, false, 7200000)
.addRecurringSavings("PST", 0, 1950, 1961, 'w', 9, -1, 7, false, 7200000)
.addRecurringSavings("PST", 0, 1962, 1966, 'w', 10, -1, 7, false, 7200000)
.addRecurringSavings("PST", 0, 1967, 2147483647, 'w', 10, -1, 7, false, 7200000)
.addRecurringSavings("PDT", 3600000, 1967, 1973, 'w', 4, -1, 7, false, 7200000)
.addRecurringSavings("PDT", 3600000, 1974, 1974, 'w', 1, 6, 0, false, 7200000)
.addRecurringSavings("PDT", 3600000, 1975, 1975, 'w', 2, 23, 0, false, 7200000)
.addRecurringSavings("PDT", 3600000, 1976, 1986, 'w', 4, -1, 7, false, 7200000)
.addRecurringSavings("PDT", 3600000, 1987, 2147483647, 'w', 4, 1, 7, true, 7200000);
}
static DateTimeZone buildAmericaLosAngeles() {
return buildAmericaLosAngelesBuilder().toDateTimeZone("America/Los_Angeles", true);
}
private DateTimeZone originalDateTimeZone = null;
public TestBuilder(String name) {
super(name);
}
protected void setUp() throws Exception {
originalDateTimeZone = DateTimeZone.getDefault();
DateTimeZone.setDefault(DateTimeZone.UTC);
}
protected void tearDown() throws Exception {
DateTimeZone.setDefault(originalDateTimeZone);
}
public void testID() {
DateTimeZone tz = buildAmericaLosAngeles();
assertEquals("America/Los_Angeles", tz.getID());
assertEquals(false, tz.isFixed());
}
public void testForwardTransitions() {
DateTimeZone tz = buildAmericaLosAngeles();
testForwardTransitions(tz, AMERICA_LOS_ANGELES_DATA);
}
static void testForwardTransitions(DateTimeZone tz, String[][] data) {
long instant = Long.MIN_VALUE;
for (int i=0; i<data.length; i++) {
String[] row = data[i];
long expectedInstant = instant;
if (row[0] != null) {
instant = tz.nextTransition(instant);
expectedInstant = new DateTime(row[0]).getMillis();
}
String expectedKey = row[1];
int expectedStandardOffset = -(int) OFFSET_FORMATTER.parseMillis(row[2]);
int expectedOffset = -(int) OFFSET_FORMATTER.parseMillis(row[3]);
assertEquals(expectedInstant, instant);
assertEquals(expectedKey, tz.getNameKey(instant));
assertEquals(expectedStandardOffset, tz.getStandardOffset(instant));
assertEquals(expectedOffset, tz.getOffset(instant));
// Sample a few instants between transitions.
if (i < data.length - 1) {
long nextInstant = new DateTime(data[i + 1][0]).getMillis();
long span = (nextInstant - instant) / 10;
for (int j=1; j<10; j++) {
long between = instant + j * span;
assertEquals(expectedKey, tz.getNameKey(between));
assertEquals(expectedStandardOffset, tz.getStandardOffset(between));
assertEquals(expectedOffset, tz.getOffset(between));
}
}
}
}
public void testReverseTransitions() {
DateTimeZone tz = buildAmericaLosAngeles();
testReverseTransitions(tz, AMERICA_LOS_ANGELES_DATA);
}
static void testReverseTransitions(DateTimeZone tz, String[][] data) {
long instant = new DateTime(data[data.length - 1][0]).getMillis();
for (int i=data.length; --i>=1; ) {
String[] row = data[i];
String[] prevRow = data[i - 1];
instant = tz.previousTransition(instant);
long expectedInstant = new DateTime(row[0]).getMillis() - 1;
String expectedKey = prevRow[1];
int expectedStandardOffset = -(int) OFFSET_FORMATTER.parseMillis(prevRow[2]);
int expectedOffset = -(int) OFFSET_FORMATTER.parseMillis(prevRow[3]);
assertEquals(expectedInstant, instant);
assertEquals(expectedKey, tz.getNameKey(instant));
assertEquals(expectedStandardOffset, tz.getStandardOffset(instant));
assertEquals(expectedOffset, tz.getOffset(instant));
}
}
public void testSerialization() throws IOException {
DateTimeZone tz = testSerialization
(buildAmericaLosAngelesBuilder(), "America/Los_Angeles");
assertEquals(false, tz.isFixed());
testForwardTransitions(tz, AMERICA_LOS_ANGELES_DATA);
testReverseTransitions(tz, AMERICA_LOS_ANGELES_DATA);
}
static DateTimeZone testSerialization(DateTimeZoneBuilder builder, String id)
throws IOException
{
ByteArrayOutputStream out = new ByteArrayOutputStream();
builder.writeTo("America/Los_Angeles", out);
ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
DateTimeZone tz = DateTimeZoneBuilder.readFrom(in, id);
assertEquals(id, tz.getID());
return tz;
}
public void testFixed() throws IOException {
DateTimeZoneBuilder builder = new DateTimeZoneBuilder()
.setStandardOffset(3600000)
.setFixedSavings("LMT", 0);
DateTimeZone tz = builder.toDateTimeZone("Test", true);
for (int i=0; i<2; i++) {
assertEquals("Test", tz.getID());
assertEquals(true, tz.isFixed());
assertEquals(3600000, tz.getOffset(0));
assertEquals(3600000, tz.getStandardOffset(0));
assertEquals(0, tz.nextTransition(0));
assertEquals(0, tz.previousTransition(0));
tz = testSerialization(builder, "Test");
}
}
}