/* * Copyright 2001-2014 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.format; import java.util.Locale; import junit.framework.TestCase; import junit.framework.TestSuite; import org.joda.time.Chronology; import org.joda.time.DateTimeFieldType; import org.joda.time.DateTimeZone; import org.joda.time.chrono.BuddhistChronology; import org.joda.time.chrono.ISOChronology; /** * Test. */ public class TestDateTimeParserBucket extends TestCase { private static final DateTimeZone PARIS = DateTimeZone.forID("Europe/Paris"); private static final DateTimeZone LONDON = DateTimeZone.forID("Europe/London"); private static final Chronology BUDDHIST_UTC = BuddhistChronology.getInstanceUTC(); private static final Chronology BUDDHIST_PARIS = BuddhistChronology.getInstance(PARIS); private static final Chronology ISO_UTC = ISOChronology.getInstanceUTC(); private static final DateTimeZone ZONE_0400 = DateTimeZone.forOffsetHours(4); private static final Chronology ISO_0400 = ISOChronology.getInstance(ZONE_0400); private static final int MILLIS_PER_HOUR = 3600000; private static final int MILLIS_PER_MINUTE = 60000; private static final int OFFSET_0400 = 4 * MILLIS_PER_HOUR; private static final Locale LOCALE = Locale.CANADA; public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } public static TestSuite suite() { return new TestSuite(TestDateTimeParserBucket.class); } public TestDateTimeParserBucket(String name) { super(name); } //----------------------------------------------------------------------- @SuppressWarnings("deprecation") public void testConstructor_3arg() { DateTimeParserBucket test = new DateTimeParserBucket(100, BUDDHIST_PARIS, LOCALE); assertEquals(BUDDHIST_UTC, test.getChronology()); assertEquals(LOCALE, test.getLocale()); assertEquals(null, test.getPivotYear()); assertEquals(null, test.getOffsetInteger()); assertEquals(PARIS, test.getZone()); } @SuppressWarnings("deprecation") public void testConstructor_4arg() { DateTimeParserBucket test = new DateTimeParserBucket(100, BUDDHIST_PARIS, LOCALE, 2010); assertEquals(BUDDHIST_UTC, test.getChronology()); assertEquals(LOCALE, test.getLocale()); assertEquals((Integer) 2010, test.getPivotYear()); assertEquals(null, test.getOffsetInteger()); assertEquals(PARIS, test.getZone()); } public void testConstructor_5arg() { DateTimeParserBucket test = new DateTimeParserBucket(100, BUDDHIST_PARIS, LOCALE, 2010, 2001); assertEquals(BUDDHIST_UTC, test.getChronology()); assertEquals(LOCALE, test.getLocale()); assertEquals((Integer) 2010, test.getPivotYear()); assertEquals(null, test.getOffsetInteger()); assertEquals(PARIS, test.getZone()); } @SuppressWarnings("deprecation") public void testSetPivotYear() { DateTimeParserBucket test = new DateTimeParserBucket(100, BUDDHIST_PARIS, LOCALE, 2010, 2001); assertEquals((Integer) 2010, test.getPivotYear()); test.setPivotYear(null); assertEquals(null, test.getPivotYear()); test.setPivotYear(2030); assertEquals((Integer) 2030, test.getPivotYear()); } public void testSetOffset() { DateTimeParserBucket test = new DateTimeParserBucket(100, BUDDHIST_PARIS, LOCALE, 2010, 2001); assertEquals(null, test.getOffsetInteger()); test.setOffset((Integer) 1000); assertEquals((Integer) 1000, test.getOffsetInteger()); test.setOffset(null); assertEquals(null, test.getOffsetInteger()); } public void testSetZone() { DateTimeParserBucket test = new DateTimeParserBucket(100, BUDDHIST_PARIS, LOCALE, 2010, 2001); assertEquals(PARIS, test.getZone()); test.setZone(LONDON); assertEquals(LONDON, test.getZone()); } public void testCompute() { DateTimeParserBucket test = new DateTimeParserBucket(100, ISO_0400, LOCALE, 2000, 2000); assertEquals(100 - OFFSET_0400, test.computeMillis()); assertEquals(100 - OFFSET_0400, test.computeMillis(false)); // note that computeMillis(true) differs depending on whether fields are saved or not assertEquals(100 - OFFSET_0400, test.computeMillis(true)); } public void testSaveCompute() { DateTimeParserBucket test = new DateTimeParserBucket(100, ISO_0400, LOCALE, 2000, 2000); test.saveField(DateTimeFieldType.hourOfDay(), 2); assertEquals(2 * MILLIS_PER_HOUR + 100 - OFFSET_0400, test.computeMillis()); assertEquals(2 * MILLIS_PER_HOUR + 100 - OFFSET_0400, test.computeMillis(false)); test.saveField(DateTimeFieldType.hourOfDay(), 5); assertEquals(5 * MILLIS_PER_HOUR + 100 - OFFSET_0400, test.computeMillis(false)); assertEquals(5 * MILLIS_PER_HOUR - OFFSET_0400, test.computeMillis(true)); assertEquals(5 * MILLIS_PER_HOUR + 100 - OFFSET_0400, test.computeMillis(false)); } public void testSaveRestoreState() { DateTimeParserBucket test = new DateTimeParserBucket(100, ISO_0400, LOCALE, 2000, 2000); test.saveField(DateTimeFieldType.hourOfDay(), 2); assertEquals(2 * MILLIS_PER_HOUR + 100 - OFFSET_0400, test.computeMillis(false)); Object state = test.saveState(); assertEquals(2 * MILLIS_PER_HOUR + 100 - OFFSET_0400, test.computeMillis(false)); test.saveField(DateTimeFieldType.minuteOfHour(), 6); assertEquals(2 * MILLIS_PER_HOUR + 6 * MILLIS_PER_MINUTE + 100 - OFFSET_0400, test.computeMillis(false)); assertEquals(true, test.restoreState(state)); assertEquals(2 * MILLIS_PER_HOUR + 100 - OFFSET_0400, test.computeMillis(false)); test.saveField(DateTimeFieldType.minuteOfHour(), 7); assertEquals(2 * MILLIS_PER_HOUR + 7 * MILLIS_PER_MINUTE + 100 - OFFSET_0400, test.computeMillis(false)); assertEquals(true, test.restoreState(state)); assertEquals(2 * MILLIS_PER_HOUR + 100 - OFFSET_0400, test.computeMillis(false)); } public void testSaveRestoreState_avoidSideEffects() { // computeMillis() has side effects, so check works without it DateTimeParserBucket test = new DateTimeParserBucket(100, ISO_0400, LOCALE, 2000, 2000); test.saveField(DateTimeFieldType.hourOfDay(), 2); Object state = test.saveState(); test.saveField(DateTimeFieldType.minuteOfHour(), 6); assertEquals(true, test.restoreState(state)); test.saveField(DateTimeFieldType.minuteOfHour(), 7); assertEquals(2 * MILLIS_PER_HOUR + 7 * MILLIS_PER_MINUTE + 100 - OFFSET_0400, test.computeMillis(false)); assertEquals(true, test.restoreState(state)); assertEquals(2 * MILLIS_PER_HOUR + 100 - OFFSET_0400, test.computeMillis(false)); } public void testSaveRestoreState_offset() { DateTimeParserBucket test = new DateTimeParserBucket(100, ISO_0400, LOCALE, 2000, 2000); test.saveField(DateTimeFieldType.hourOfDay(), 2); assertEquals(2 * MILLIS_PER_HOUR + 100 - OFFSET_0400, test.computeMillis(false)); Object state = test.saveState(); assertEquals(2 * MILLIS_PER_HOUR + 100 - OFFSET_0400, test.computeMillis(false)); test.setOffset((Integer) 0); assertEquals(2 * MILLIS_PER_HOUR + 100, test.computeMillis(false)); assertEquals(true, test.restoreState(state)); assertEquals(2 * MILLIS_PER_HOUR + 100 - OFFSET_0400, test.computeMillis(false)); } public void testSaveRestoreState_zone() { DateTimeParserBucket test = new DateTimeParserBucket(100, ISO_0400, LOCALE, 2000, 2000); test.saveField(DateTimeFieldType.hourOfDay(), 2); assertEquals(2 * MILLIS_PER_HOUR + 100 - OFFSET_0400, test.computeMillis(false)); Object state = test.saveState(); assertEquals(2 * MILLIS_PER_HOUR + 100 - OFFSET_0400, test.computeMillis(false)); test.setZone(DateTimeZone.UTC); assertEquals(2 * MILLIS_PER_HOUR + 100, test.computeMillis(false)); assertEquals(true, test.restoreState(state)); assertEquals(2 * MILLIS_PER_HOUR + 100 - OFFSET_0400, test.computeMillis(false)); } public void testSaveRestoreState_text() { DateTimeParserBucket test = new DateTimeParserBucket(100, ISO_0400, LOCALE, 2000, 2000); test.saveField(DateTimeFieldType.hourOfDay(), "2", Locale.ENGLISH); assertEquals(2 * MILLIS_PER_HOUR + 100 - OFFSET_0400, test.computeMillis(false)); Object state = test.saveState(); assertEquals(2 * MILLIS_PER_HOUR + 100 - OFFSET_0400, test.computeMillis(false)); test.saveField(DateTimeFieldType.minuteOfHour(), "6", Locale.ENGLISH); assertEquals(2 * MILLIS_PER_HOUR + 6 * MILLIS_PER_MINUTE + 100 - OFFSET_0400, test.computeMillis(false)); assertEquals(true, test.restoreState(state)); assertEquals(2 * MILLIS_PER_HOUR + 100 - OFFSET_0400, test.computeMillis(false)); } public void testSaveRestoreState_twoStates() { DateTimeParserBucket test = new DateTimeParserBucket(100, ISO_0400, LOCALE, 2000, 2000); test.saveField(DateTimeFieldType.hourOfDay(), 2); assertEquals(2 * MILLIS_PER_HOUR + 100 - OFFSET_0400, test.computeMillis(false)); Object state1 = test.saveState(); assertEquals(2 * MILLIS_PER_HOUR + 100 - OFFSET_0400, test.computeMillis(false)); test.saveField(DateTimeFieldType.minuteOfHour(), 6); assertEquals(2 * MILLIS_PER_HOUR + 6 * MILLIS_PER_MINUTE + 100 - OFFSET_0400, test.computeMillis(false)); Object state2 = test.saveState(); assertEquals(2 * MILLIS_PER_HOUR + 6 * MILLIS_PER_MINUTE + 100 - OFFSET_0400, test.computeMillis(false)); test.saveField(DateTimeFieldType.secondOfMinute(), 8); assertEquals(2 * MILLIS_PER_HOUR + 6 * MILLIS_PER_MINUTE + 8000 + 100 - OFFSET_0400, test.computeMillis(false)); assertEquals(true, test.restoreState(state2)); assertEquals(2 * MILLIS_PER_HOUR + 6 * MILLIS_PER_MINUTE + 100 - OFFSET_0400, test.computeMillis(false)); assertEquals(true, test.restoreState(state1)); assertEquals(2 * MILLIS_PER_HOUR + 100 - OFFSET_0400, test.computeMillis(false)); assertEquals(true, test.restoreState(state2)); assertEquals(2 * MILLIS_PER_HOUR + 6 * MILLIS_PER_MINUTE + 100 - OFFSET_0400, test.computeMillis(false)); assertEquals(true, test.restoreState(state1)); assertEquals(2 * MILLIS_PER_HOUR + 100 - OFFSET_0400, test.computeMillis(false)); } public void testSaveRestoreState_sameStates() { DateTimeParserBucket test = new DateTimeParserBucket(100, ISO_0400, LOCALE, 2000, 2000); test.saveField(DateTimeFieldType.hourOfDay(), 2); assertEquals(2 * MILLIS_PER_HOUR + 100 - OFFSET_0400, test.computeMillis(false)); Object state1 = test.saveState(); Object state2 = test.saveState(); assertEquals(2 * MILLIS_PER_HOUR + 100 - OFFSET_0400, test.computeMillis(false)); test.saveField(DateTimeFieldType.minuteOfHour(), 6); assertEquals(2 * MILLIS_PER_HOUR + 6 * MILLIS_PER_MINUTE + 100 - OFFSET_0400, test.computeMillis(false)); assertEquals(true, test.restoreState(state2)); assertEquals(2 * MILLIS_PER_HOUR + 100 - OFFSET_0400, test.computeMillis(false)); test.saveField(DateTimeFieldType.minuteOfHour(), 8); assertEquals(2 * MILLIS_PER_HOUR + 8 * MILLIS_PER_MINUTE + 100 - OFFSET_0400, test.computeMillis(false)); assertEquals(true, test.restoreState(state1)); assertEquals(2 * MILLIS_PER_HOUR + 100 - OFFSET_0400, test.computeMillis(false)); assertEquals(true, test.restoreState(state2)); assertEquals(2 * MILLIS_PER_HOUR + 100 - OFFSET_0400, test.computeMillis(false)); assertEquals(true, test.restoreState(state1)); assertEquals(2 * MILLIS_PER_HOUR + 100 - OFFSET_0400, test.computeMillis(false)); } public void testSaveRestoreState_badType() { DateTimeParserBucket bucket1 = new DateTimeParserBucket(100, ISO_0400, LOCALE, 2000, 2000); DateTimeParserBucket bucket2 = new DateTimeParserBucket(100, BUDDHIST_PARIS, LOCALE, 2000, 2000); assertEquals(false, bucket1.restoreState(null)); assertEquals(false, bucket1.restoreState("")); assertEquals(false, bucket2.restoreState(bucket1.saveState())); } //------------------------------------------------------------------------- public void testReset() { DateTimeParserBucket test = new DateTimeParserBucket(100, ISO_0400, LOCALE, 2000, 2000); assertEquals(ISO_UTC, test.getChronology()); assertEquals(LOCALE, test.getLocale()); assertEquals((Integer) 2000, test.getPivotYear()); assertEquals(null, test.getOffsetInteger()); assertEquals(ZONE_0400, test.getZone()); test.setOffset((Integer) 200); test.setZone(LONDON); test.saveField(DateTimeFieldType.hourOfDay(), 2); assertEquals(2 * MILLIS_PER_HOUR + 100 - 200, test.computeMillis(false)); assertEquals((Integer) 200, test.getOffsetInteger()); assertEquals(LONDON, test.getZone()); test.reset(); assertEquals(ISO_UTC, test.getChronology()); assertEquals(LOCALE, test.getLocale()); assertEquals((Integer) 2000, test.getPivotYear()); assertEquals(null, test.getOffsetInteger()); assertEquals(ZONE_0400, test.getZone()); assertEquals(100 - OFFSET_0400, test.computeMillis(false)); } public void testParse() { DateTimeParserBucket test = new DateTimeParserBucket(0, ISO_0400, LOCALE, 2000, 2000); DateTimeParser parser = new DateTimeParser() { public int parseInto(DateTimeParserBucket bucket, String text, int position) { bucket.saveField(DateTimeFieldType.hourOfDay(), 2); bucket.saveField(DateTimeFieldType.minuteOfHour(), 6); return position + 1; } public int estimateParsedLength() { return 1; } }; long millis = test.parseMillis(parser, "A"); assertEquals(2 * MILLIS_PER_HOUR + 6 * MILLIS_PER_MINUTE - OFFSET_0400, millis); millis = test.parseMillis(parser, "B"); assertEquals(2 * MILLIS_PER_HOUR + 6 * MILLIS_PER_MINUTE - OFFSET_0400, millis); millis = test.parseMillis(parser, "C"); assertEquals(2 * MILLIS_PER_HOUR + 6 * MILLIS_PER_MINUTE - OFFSET_0400, millis); } }