001    /*
002     *  Copyright 2001-2007 Stephen Colebourne
003     *
004     *  Licensed under the Apache License, Version 2.0 (the "License");
005     *  you may not use this file except in compliance with the License.
006     *  You may obtain a copy of the License at
007     *
008     *      http://www.apache.org/licenses/LICENSE-2.0
009     *
010     *  Unless required by applicable law or agreed to in writing, software
011     *  distributed under the License is distributed on an "AS IS" BASIS,
012     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     *  See the License for the specific language governing permissions and
014     *  limitations under the License.
015     */
016    package org.joda.time.chrono;
017    
018    import junit.framework.TestCase;
019    import junit.framework.TestSuite;
020    
021    import org.joda.time.Chronology;
022    import org.joda.time.DateTime;
023    import org.joda.time.DateTimeZone;
024    import org.joda.time.MockZone;
025    
026    /**
027     *
028     * @author Brian S O'Neill
029     * @author Blair Martin
030     */
031    public class TestLenientChronology extends TestCase {
032        public static void main(String[] args) {
033            junit.textui.TestRunner.run(suite());
034        }
035    
036        public static TestSuite suite() {
037            return new TestSuite(TestLenientChronology.class);
038        }
039    
040        public TestLenientChronology(String name) {
041            super(name);
042        }
043    
044        protected void setUp() throws Exception {
045        }
046    
047        protected void tearDown() throws Exception {
048        }
049    
050        //-----------------------------------------------------------------------
051        public void test_setYear() {
052            Chronology zone = LenientChronology.getInstance(ISOChronology.getInstanceUTC());
053            DateTime dt = new DateTime(2007, 1, 1, 0, 0 ,0, 0, zone);
054            assertEquals("2007-01-01T00:00:00.000Z", dt.toString());
055            dt = dt.withYear(2008);
056            assertEquals("2008-01-01T00:00:00.000Z", dt.toString());
057        }
058    
059        //-----------------------------------------------------------------------
060        public void test_setMonthOfYear() {
061            Chronology zone = LenientChronology.getInstance(ISOChronology.getInstanceUTC());
062            DateTime dt = new DateTime(2007, 1, 1, 0, 0 ,0, 0, zone);
063            assertEquals("2007-01-01T00:00:00.000Z", dt.toString());
064            dt = dt.withMonthOfYear(13);
065            assertEquals("2008-01-01T00:00:00.000Z", dt.toString());
066            dt = dt.withMonthOfYear(0);
067            assertEquals("2007-12-01T00:00:00.000Z", dt.toString());
068        }
069    
070        //-----------------------------------------------------------------------
071        public void test_setDayOfMonth() {
072            Chronology zone = LenientChronology.getInstance(ISOChronology.getInstanceUTC());
073            DateTime dt = new DateTime(2007, 1, 1, 0, 0 ,0, 0, zone);
074            assertEquals("2007-01-01T00:00:00.000Z", dt.toString());
075            dt = dt.withDayOfMonth(32);
076            assertEquals("2007-02-01T00:00:00.000Z", dt.toString());
077            dt = dt.withDayOfMonth(0);
078            assertEquals("2007-01-31T00:00:00.000Z", dt.toString());
079        }
080    
081        //-----------------------------------------------------------------------
082        public void test_setHourOfDay() {
083            Chronology zone = LenientChronology.getInstance(ISOChronology.getInstanceUTC());
084            DateTime dt = new DateTime(2007, 1, 1, 0, 0 ,0, 0, zone);
085            assertEquals("2007-01-01T00:00:00.000Z", dt.toString());
086            dt = dt.withHourOfDay(24);
087            assertEquals("2007-01-02T00:00:00.000Z", dt.toString());
088            dt = dt.withHourOfDay(-1);
089            assertEquals("2007-01-01T23:00:00.000Z", dt.toString());
090        }
091    
092        //-----------------------------------------------------------------------
093        //------------------------ Bug ------------------------------------------
094        //-----------------------------------------------------------------------
095        public void testNearDstTransition() {
096            // This is just a regression test. Test case provided by Blair Martin.
097    
098            int hour = 23;
099            DateTime dt;
100    
101            dt = new DateTime(2006, 10, 29, hour, 0, 0, 0,
102                              ISOChronology.getInstance(DateTimeZone.forID("America/Los_Angeles")));
103            assertEquals(hour, dt.getHourOfDay()); // OK - no LenientChronology
104    
105            dt = new DateTime(2006, 10, 29, hour, 0, 0, 0,
106                              LenientChronology.getInstance
107                              (ISOChronology.getInstance(DateTimeZone.forOffsetHours(-8))));
108            assertEquals(hour, dt.getHourOfDay()); // OK - no TZ ID
109    
110            dt = new DateTime(2006, 10, 29, hour, 0, 0, 0,
111                              LenientChronology.getInstance
112                              (ISOChronology.getInstance(DateTimeZone.forID("America/Los_Angeles"))));
113    
114            assertEquals(hour, dt.getHourOfDay()); // Used to fail - hour was 22
115        }
116    
117        //-----------------------------------------------------------------------
118        //------------------------ Bug [1755161] --------------------------------
119        //-----------------------------------------------------------------------
120        /** Mock zone simulating America/Grand_Turk cutover at midnight 2007-04-01 */
121        private static long CUTOVER_TURK = 1175403600000L;
122        private static int OFFSET_TURK = -18000000;  // -05:00
123        private static final DateTimeZone MOCK_TURK = new MockZone(CUTOVER_TURK, OFFSET_TURK, 3600);
124    
125        //-----------------------------------------------------------------------
126        public void test_MockTurkIsCorrect() {
127            DateTime pre = new DateTime(CUTOVER_TURK - 1L, MOCK_TURK);
128            assertEquals("2007-03-31T23:59:59.999-05:00", pre.toString());
129            DateTime at = new DateTime(CUTOVER_TURK, MOCK_TURK);
130            assertEquals("2007-04-01T01:00:00.000-04:00", at.toString());
131            DateTime post = new DateTime(CUTOVER_TURK + 1L, MOCK_TURK);
132            assertEquals("2007-04-01T01:00:00.001-04:00", post.toString());
133        }
134    
135        public void test_lenientChrononolgy_Chicago() {
136            DateTimeZone zone = DateTimeZone.forID("America/Chicago");
137            Chronology lenient = LenientChronology.getInstance(ISOChronology.getInstance(zone));
138            DateTime dt = new DateTime(2007, 3, 11, 2, 30, 0, 0, lenient);
139            assertEquals("2007-03-11T03:30:00.000-05:00", dt.toString());
140        }
141    
142        public void test_lenientChrononolgy_Turk() {
143            Chronology lenient = LenientChronology.getInstance(ISOChronology.getInstance(MOCK_TURK));
144            DateTime dt = new DateTime(2007, 4, 1, 0, 30, 0, 0, lenient);
145            assertEquals("2007-04-01T01:30:00.000-04:00", dt.toString());
146        }
147    
148        public void test_strictChrononolgy_Chicago() {
149            DateTimeZone zone = DateTimeZone.forID("America/Chicago");
150            Chronology lenient = StrictChronology.getInstance(ISOChronology.getInstance(zone));
151            try {
152                new DateTime(2007, 3, 11, 2, 30, 0, 0, lenient);
153                fail();
154            } catch (IllegalArgumentException ex) {
155                // expected
156            }
157        }
158    
159        public void test_isoChrononolgy_Chicago() {
160            DateTimeZone zone = DateTimeZone.forID("America/Chicago");
161            Chronology lenient = ISOChronology.getInstance(zone);
162            try {
163                new DateTime(2007, 3, 11, 2, 30, 0, 0, lenient);
164                fail();
165            } catch (IllegalArgumentException ex) {
166                // expected
167            }
168        }
169    
170    }