001    /*
002     *  Copyright 2001-2011 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.format;
017    
018    import java.io.CharArrayWriter;
019    import java.util.Locale;
020    import java.util.TimeZone;
021    
022    import junit.framework.TestCase;
023    import junit.framework.TestSuite;
024    
025    import org.joda.time.Chronology;
026    import org.joda.time.DateTime;
027    import org.joda.time.DateTimeConstants;
028    import org.joda.time.DateTimeUtils;
029    import org.joda.time.DateTimeZone;
030    import org.joda.time.LocalDate;
031    import org.joda.time.LocalDateTime;
032    import org.joda.time.LocalTime;
033    import org.joda.time.MutableDateTime;
034    import org.joda.time.ReadablePartial;
035    import org.joda.time.chrono.BuddhistChronology;
036    import org.joda.time.chrono.GJChronology;
037    import org.joda.time.chrono.ISOChronology;
038    
039    /**
040     * This class is a Junit unit test for DateTime Formating.
041     *
042     * @author Stephen Colebourne
043     */
044    public class TestDateTimeFormatter extends TestCase {
045    
046        private static final DateTimeZone UTC = DateTimeZone.UTC;
047        private static final DateTimeZone PARIS = DateTimeZone.forID("Europe/Paris");
048        private static final DateTimeZone LONDON = DateTimeZone.forID("Europe/London");
049        private static final DateTimeZone TOKYO = DateTimeZone.forID("Asia/Tokyo");
050        private static final DateTimeZone NEWYORK = DateTimeZone.forID("America/New_York");
051        private static final Chronology ISO_UTC = ISOChronology.getInstanceUTC();
052        private static final Chronology ISO_PARIS = ISOChronology.getInstance(PARIS);
053        private static final Chronology BUDDHIST_PARIS = BuddhistChronology.getInstance(PARIS);
054    
055        long y2002days = 365 + 365 + 366 + 365 + 365 + 365 + 366 + 365 + 365 + 365 + 
056                         366 + 365 + 365 + 365 + 366 + 365 + 365 + 365 + 366 + 365 + 
057                         365 + 365 + 366 + 365 + 365 + 365 + 366 + 365 + 365 + 365 +
058                         366 + 365;
059        // 2002-06-09
060        private long TEST_TIME_NOW =
061                (y2002days + 31L + 28L + 31L + 30L + 31L + 9L -1L) * DateTimeConstants.MILLIS_PER_DAY;
062    
063        private DateTimeZone originalDateTimeZone = null;
064        private TimeZone originalTimeZone = null;
065        private Locale originalLocale = null;
066        private DateTimeFormatter f = null;
067        private DateTimeFormatter g = null;
068    
069        public static void main(String[] args) {
070            junit.textui.TestRunner.run(suite());
071        }
072    
073        public static TestSuite suite() {
074            return new TestSuite(TestDateTimeFormatter.class);
075        }
076    
077        public TestDateTimeFormatter(String name) {
078            super(name);
079        }
080    
081        protected void setUp() throws Exception {
082            DateTimeUtils.setCurrentMillisFixed(TEST_TIME_NOW);
083            originalDateTimeZone = DateTimeZone.getDefault();
084            originalTimeZone = TimeZone.getDefault();
085            originalLocale = Locale.getDefault();
086            DateTimeZone.setDefault(LONDON);
087            TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
088            Locale.setDefault(Locale.UK);
089            f = new DateTimeFormatterBuilder()
090                    .appendDayOfWeekShortText()
091                    .appendLiteral(' ')
092                    .append(ISODateTimeFormat.dateTimeNoMillis())
093                    .toFormatter();
094            g = ISODateTimeFormat.dateTimeNoMillis();
095        }
096    
097        protected void tearDown() throws Exception {
098            DateTimeUtils.setCurrentMillisSystem();
099            DateTimeZone.setDefault(originalDateTimeZone);
100            TimeZone.setDefault(originalTimeZone);
101            Locale.setDefault(originalLocale);
102            originalDateTimeZone = null;
103            originalTimeZone = null;
104            originalLocale = null;
105            f = null;
106            g = null;
107        }
108    
109        //-----------------------------------------------------------------------
110        public void testPrint_simple() {
111            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
112            assertEquals("Wed 2004-06-09T10:20:30Z", f.print(dt));
113            
114            dt = dt.withZone(PARIS);
115            assertEquals("Wed 2004-06-09T12:20:30+02:00", f.print(dt));
116            
117            dt = dt.withZone(NEWYORK);
118            assertEquals("Wed 2004-06-09T06:20:30-04:00", f.print(dt));
119            
120            dt = dt.withChronology(BUDDHIST_PARIS);
121            assertEquals("Wed 2547-06-09T12:20:30+02:00", f.print(dt));
122        }
123    
124        //-----------------------------------------------------------------------
125        public void testPrint_locale() {
126            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
127            assertEquals("mer. 2004-06-09T10:20:30Z", f.withLocale(Locale.FRENCH).print(dt));
128            assertEquals("Wed 2004-06-09T10:20:30Z", f.withLocale(null).print(dt));
129        }
130    
131        //-----------------------------------------------------------------------
132        public void testPrint_zone() {
133            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
134            assertEquals("Wed 2004-06-09T06:20:30-04:00", f.withZone(NEWYORK).print(dt));
135            assertEquals("Wed 2004-06-09T12:20:30+02:00", f.withZone(PARIS).print(dt));
136            assertEquals("Wed 2004-06-09T10:20:30Z", f.withZone(null).print(dt));
137            
138            dt = dt.withZone(NEWYORK);
139            assertEquals("Wed 2004-06-09T06:20:30-04:00", f.withZone(NEWYORK).print(dt));
140            assertEquals("Wed 2004-06-09T12:20:30+02:00", f.withZone(PARIS).print(dt));
141            assertEquals("Wed 2004-06-09T10:20:30Z", f.withZoneUTC().print(dt));
142            assertEquals("Wed 2004-06-09T06:20:30-04:00", f.withZone(null).print(dt));
143        }
144    
145        //-----------------------------------------------------------------------
146        public void testPrint_chrono() {
147            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
148            assertEquals("Wed 2004-06-09T12:20:30+02:00", f.withChronology(ISO_PARIS).print(dt));
149            assertEquals("Wed 2547-06-09T12:20:30+02:00", f.withChronology(BUDDHIST_PARIS).print(dt));
150            assertEquals("Wed 2004-06-09T10:20:30Z", f.withChronology(null).print(dt));
151            
152            dt = dt.withChronology(BUDDHIST_PARIS);
153            assertEquals("Wed 2004-06-09T12:20:30+02:00", f.withChronology(ISO_PARIS).print(dt));
154            assertEquals("Wed 2547-06-09T12:20:30+02:00", f.withChronology(BUDDHIST_PARIS).print(dt));
155            assertEquals("Wed 2004-06-09T10:20:30Z", f.withChronology(ISO_UTC).print(dt));
156            assertEquals("Wed 2547-06-09T12:20:30+02:00", f.withChronology(null).print(dt));
157        }
158    
159        //-----------------------------------------------------------------------
160        public void testPrint_bufferMethods() throws Exception {
161            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
162            StringBuffer buf = new StringBuffer();
163            f.printTo(buf, dt);
164            assertEquals("Wed 2004-06-09T10:20:30Z", buf.toString());
165            
166            buf = new StringBuffer();
167            f.printTo(buf, dt.getMillis());
168            assertEquals("Wed 2004-06-09T11:20:30+01:00", buf.toString());
169            
170            buf = new StringBuffer();
171            ISODateTimeFormat.yearMonthDay().printTo(buf, dt.toYearMonthDay());
172            assertEquals("2004-06-09", buf.toString());
173            
174            buf = new StringBuffer();
175            try {
176                ISODateTimeFormat.yearMonthDay().printTo(buf, (ReadablePartial) null);
177                fail();
178            } catch (IllegalArgumentException ex) {}
179        }
180    
181        //-----------------------------------------------------------------------
182        public void testPrint_writerMethods() throws Exception {
183            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
184            CharArrayWriter out = new CharArrayWriter();
185            f.printTo(out, dt);
186            assertEquals("Wed 2004-06-09T10:20:30Z", out.toString());
187            
188            out = new CharArrayWriter();
189            f.printTo(out, dt.getMillis());
190            assertEquals("Wed 2004-06-09T11:20:30+01:00", out.toString());
191            
192            out = new CharArrayWriter();
193            ISODateTimeFormat.yearMonthDay().printTo(out, dt.toYearMonthDay());
194            assertEquals("2004-06-09", out.toString());
195            
196            out = new CharArrayWriter();
197            try {
198                ISODateTimeFormat.yearMonthDay().printTo(out, (ReadablePartial) null);
199                fail();
200            } catch (IllegalArgumentException ex) {}
201        }
202    
203        //-----------------------------------------------------------------------
204        public void testPrint_appendableMethods() throws Exception {
205            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
206            StringBuilder buf = new StringBuilder();
207            f.printTo(buf, dt);
208            assertEquals("Wed 2004-06-09T10:20:30Z", buf.toString());
209            
210            buf = new StringBuilder();
211            f.printTo(buf, dt.getMillis());
212            assertEquals("Wed 2004-06-09T11:20:30+01:00", buf.toString());
213            
214            buf = new StringBuilder();
215            ISODateTimeFormat.yearMonthDay().printTo(buf, dt.toLocalDate());
216            assertEquals("2004-06-09", buf.toString());
217            
218            buf = new StringBuilder();
219            try {
220                ISODateTimeFormat.yearMonthDay().printTo(buf, (ReadablePartial) null);
221                fail();
222            } catch (IllegalArgumentException ex) {}
223        }
224    
225        //-----------------------------------------------------------------------
226        public void testPrint_chrono_and_zone() {
227            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
228            assertEquals("Wed 2004-06-09T10:20:30Z",
229                    f.withChronology(null).withZone(null).print(dt));
230            assertEquals("Wed 2004-06-09T12:20:30+02:00",
231                    f.withChronology(ISO_PARIS).withZone(null).print(dt));
232            assertEquals("Wed 2004-06-09T12:20:30+02:00",
233                    f.withChronology(ISO_PARIS).withZone(PARIS).print(dt));
234            assertEquals("Wed 2004-06-09T06:20:30-04:00",
235                    f.withChronology(ISO_PARIS).withZone(NEWYORK).print(dt));
236            assertEquals("Wed 2004-06-09T06:20:30-04:00",
237                    f.withChronology(null).withZone(NEWYORK).print(dt));
238            
239            dt = dt.withChronology(ISO_PARIS);
240            assertEquals("Wed 2004-06-09T12:20:30+02:00",
241                    f.withChronology(null).withZone(null).print(dt));
242            assertEquals("Wed 2004-06-09T12:20:30+02:00",
243                    f.withChronology(ISO_PARIS).withZone(null).print(dt));
244            assertEquals("Wed 2004-06-09T12:20:30+02:00",
245                    f.withChronology(ISO_PARIS).withZone(PARIS).print(dt));
246            assertEquals("Wed 2004-06-09T06:20:30-04:00",
247                    f.withChronology(ISO_PARIS).withZone(NEWYORK).print(dt));
248            assertEquals("Wed 2004-06-09T06:20:30-04:00",
249                    f.withChronology(null).withZone(NEWYORK).print(dt));
250            
251            dt = dt.withChronology(BUDDHIST_PARIS);
252            assertEquals("Wed 2547-06-09T12:20:30+02:00",
253                    f.withChronology(null).withZone(null).print(dt));
254            assertEquals("Wed 2004-06-09T12:20:30+02:00",
255                    f.withChronology(ISO_PARIS).withZone(null).print(dt));
256            assertEquals("Wed 2004-06-09T12:20:30+02:00",
257                    f.withChronology(ISO_PARIS).withZone(PARIS).print(dt));
258            assertEquals("Wed 2004-06-09T06:20:30-04:00",
259                    f.withChronology(ISO_PARIS).withZone(NEWYORK).print(dt));
260            assertEquals("Wed 2547-06-09T06:20:30-04:00",
261                    f.withChronology(null).withZone(NEWYORK).print(dt));
262        }
263    
264        public void testWithGetLocale() {
265            DateTimeFormatter f2 = f.withLocale(Locale.FRENCH);
266            assertEquals(Locale.FRENCH, f2.getLocale());
267            assertSame(f2, f2.withLocale(Locale.FRENCH));
268            
269            f2 = f.withLocale(null);
270            assertEquals(null, f2.getLocale());
271            assertSame(f2, f2.withLocale(null));
272        }
273    
274        public void testWithGetZone() {
275            DateTimeFormatter f2 = f.withZone(PARIS);
276            assertEquals(PARIS, f2.getZone());
277            assertSame(f2, f2.withZone(PARIS));
278            
279            f2 = f.withZone(null);
280            assertEquals(null, f2.getZone());
281            assertSame(f2, f2.withZone(null));
282        }
283    
284        public void testWithGetChronology() {
285            DateTimeFormatter f2 = f.withChronology(BUDDHIST_PARIS);
286            assertEquals(BUDDHIST_PARIS, f2.getChronology());
287            assertSame(f2, f2.withChronology(BUDDHIST_PARIS));
288            
289            f2 = f.withChronology(null);
290            assertEquals(null, f2.getChronology());
291            assertSame(f2, f2.withChronology(null));
292        }
293    
294        public void testWithGetPivotYear() {
295            DateTimeFormatter f2 = f.withPivotYear(13);
296            assertEquals(new Integer(13), f2.getPivotYear());
297            assertSame(f2, f2.withPivotYear(13));
298            
299            f2 = f.withPivotYear(new Integer(14));
300            assertEquals(new Integer(14), f2.getPivotYear());
301            assertSame(f2, f2.withPivotYear(new Integer(14)));
302            
303            f2 = f.withPivotYear(null);
304            assertEquals(null, f2.getPivotYear());
305            assertSame(f2, f2.withPivotYear(null));
306        }
307    
308        public void testWithGetOffsetParsedMethods() {
309            DateTimeFormatter f2 = f;
310            assertEquals(false, f2.isOffsetParsed());
311            assertEquals(null, f2.getZone());
312            
313            f2 = f.withOffsetParsed();
314            assertEquals(true, f2.isOffsetParsed());
315            assertEquals(null, f2.getZone());
316            
317            f2 = f2.withZone(PARIS);
318            assertEquals(false, f2.isOffsetParsed());
319            assertEquals(PARIS, f2.getZone());
320            
321            f2 = f2.withOffsetParsed();
322            assertEquals(true, f2.isOffsetParsed());
323            assertEquals(null, f2.getZone());
324            
325            f2 = f.withOffsetParsed();
326            assertNotSame(f, f2);
327            DateTimeFormatter f3 = f2.withOffsetParsed();
328            assertSame(f2, f3);
329        }
330    
331        public void testPrinterParserMethods() {
332            DateTimeFormatter f2 = new DateTimeFormatter(f.getPrinter(), f.getParser());
333            assertEquals(f.getPrinter(), f2.getPrinter());
334            assertEquals(f.getParser(), f2.getParser());
335            assertEquals(true, f2.isPrinter());
336            assertEquals(true, f2.isParser());
337            assertNotNull(f2.print(0L));
338            assertNotNull(f2.parseDateTime("Thu 1970-01-01T00:00:00Z"));
339            
340            f2 = new DateTimeFormatter(f.getPrinter(), null);
341            assertEquals(f.getPrinter(), f2.getPrinter());
342            assertEquals(null, f2.getParser());
343            assertEquals(true, f2.isPrinter());
344            assertEquals(false, f2.isParser());
345            assertNotNull(f2.print(0L));
346            try {
347                f2.parseDateTime("Thu 1970-01-01T00:00:00Z");
348                fail();
349            } catch (UnsupportedOperationException ex) {}
350            
351            f2 = new DateTimeFormatter(null, f.getParser());
352            assertEquals(null, f2.getPrinter());
353            assertEquals(f.getParser(), f2.getParser());
354            assertEquals(false, f2.isPrinter());
355            assertEquals(true, f2.isParser());
356            try {
357                f2.print(0L);
358                fail();
359            } catch (UnsupportedOperationException ex) {}
360            assertNotNull(f2.parseDateTime("Thu 1970-01-01T00:00:00Z"));
361        }
362    
363        //-----------------------------------------------------------------------
364        public void testParseLocalDate_simple() {
365            assertEquals(new LocalDate(2004, 6, 9), g.parseLocalDate("2004-06-09T10:20:30Z"));
366            assertEquals(new LocalDate(2004, 6, 9), g.parseLocalDate("2004-06-09T10:20:30+18:00"));
367            assertEquals(new LocalDate(2004, 6, 9), g.parseLocalDate("2004-06-09T10:20:30-18:00"));
368            assertEquals(new LocalDate(2004, 6, 9, BUDDHIST_PARIS),
369                    g.withChronology(BUDDHIST_PARIS).parseLocalDate("2004-06-09T10:20:30Z"));
370            try {
371                g.parseDateTime("ABC");
372                fail();
373            } catch (IllegalArgumentException ex) {}
374        }
375    
376        public void testParseLocalDate_yearOfEra() {
377            Chronology chrono = GJChronology.getInstanceUTC();
378            DateTimeFormatter f = DateTimeFormat
379                .forPattern("YYYY-MM GG")
380                .withChronology(chrono)
381                .withLocale(Locale.UK);
382            
383            LocalDate date = new LocalDate(2005, 10, 1, chrono);
384            assertEquals(date, f.parseLocalDate("2005-10 AD"));
385            assertEquals(date, f.parseLocalDate("2005-10 CE"));
386            
387            date = new LocalDate(-2005, 10, 1, chrono);
388            assertEquals(date, f.parseLocalDate("2005-10 BC"));
389            assertEquals(date, f.parseLocalDate("2005-10 BCE"));
390        }
391    
392        public void testParseLocalDate_yearOfCentury() {
393            Chronology chrono = GJChronology.getInstanceUTC();
394            DateTimeFormatter f = DateTimeFormat
395                .forPattern("yy M d")
396                .withChronology(chrono)
397                .withLocale(Locale.UK)
398                .withPivotYear(2050);
399            
400            LocalDate date = new LocalDate(2050, 8, 4, chrono);
401            assertEquals(date, f.parseLocalDate("50 8 4"));
402        }
403    
404        public void testParseLocalDate_monthDay_feb29() {
405            Chronology chrono = GJChronology.getInstanceUTC();
406            DateTimeFormatter f = DateTimeFormat
407                .forPattern("M d")
408                .withChronology(chrono)
409                .withLocale(Locale.UK);
410            
411            assertEquals(new LocalDate(2000, 2, 29, chrono), f.parseLocalDate("2 29"));
412        }
413    
414        public void testParseLocalDate_monthDay_withDefaultYear_feb29() {
415            Chronology chrono = GJChronology.getInstanceUTC();
416            DateTimeFormatter f = DateTimeFormat
417                .forPattern("M d")
418                .withChronology(chrono)
419                .withLocale(Locale.UK)
420                .withDefaultYear(2012);
421            
422            assertEquals(new LocalDate(2012, 2, 29, chrono), f.parseLocalDate("2 29"));
423        }
424    
425        public void testParseLocalDate_weekyear_month_week_2010() {
426            Chronology chrono = GJChronology.getInstanceUTC();
427            DateTimeFormatter f = DateTimeFormat.forPattern("xxxx-MM-ww").withChronology(chrono);
428            assertEquals(new LocalDate(2010, 1, 4, chrono), f.parseLocalDate("2010-01-01"));
429        }
430    
431        public void testParseLocalDate_weekyear_month_week_2011() {
432            Chronology chrono = GJChronology.getInstanceUTC();
433            DateTimeFormatter f = DateTimeFormat.forPattern("xxxx-MM-ww").withChronology(chrono);
434            assertEquals(new LocalDate(2011, 1, 3, chrono), f.parseLocalDate("2011-01-01"));
435        }
436    
437        public void testParseLocalDate_weekyear_month_week_2012() {
438            Chronology chrono = GJChronology.getInstanceUTC();
439            DateTimeFormatter f = DateTimeFormat.forPattern("xxxx-MM-ww").withChronology(chrono);
440            assertEquals(new LocalDate(2012, 1, 2, chrono), f.parseLocalDate("2012-01-01"));
441        }
442    
443    // This test fails, but since more related tests pass with the extra loop in DateTimeParserBucket
444    // I'm going to leave the change in and ignore this test
445    //    public void testParseLocalDate_weekyear_month_week_2013() {
446    //        Chronology chrono = GJChronology.getInstanceUTC();
447    //        DateTimeFormatter f = DateTimeFormat.forPattern("xxxx-MM-ww").withChronology(chrono);
448    //        assertEquals(new LocalDate(2012, 12, 31, chrono), f.parseLocalDate("2013-01-01"));
449    //    }
450    
451        public void testParseLocalDate_year_month_week_2010() {
452            Chronology chrono = GJChronology.getInstanceUTC();
453            DateTimeFormatter f = DateTimeFormat.forPattern("yyyy-MM-ww").withChronology(chrono);
454            assertEquals(new LocalDate(2010, 1, 4, chrono), f.parseLocalDate("2010-01-01"));
455        }
456    
457        public void testParseLocalDate_year_month_week_2011() {
458            Chronology chrono = GJChronology.getInstanceUTC();
459            DateTimeFormatter f = DateTimeFormat.forPattern("yyyy-MM-ww").withChronology(chrono);
460            assertEquals(new LocalDate(2011, 1, 3, chrono), f.parseLocalDate("2011-01-01"));
461        }
462    
463        public void testParseLocalDate_year_month_week_2012() {
464            Chronology chrono = GJChronology.getInstanceUTC();
465            DateTimeFormatter f = DateTimeFormat.forPattern("yyyy-MM-ww").withChronology(chrono);
466            assertEquals(new LocalDate(2012, 1, 2, chrono), f.parseLocalDate("2012-01-01"));
467        }
468    
469        public void testParseLocalDate_year_month_week_2013() {
470            Chronology chrono = GJChronology.getInstanceUTC();
471            DateTimeFormatter f = DateTimeFormat.forPattern("yyyy-MM-ww").withChronology(chrono);
472            assertEquals(new LocalDate(2012, 12, 31, chrono), f.parseLocalDate("2013-01-01"));  // 2013-01-01 would be better, but this is OK
473        }
474    
475        public void testParseLocalDate_year_month_week_2014() {
476            Chronology chrono = GJChronology.getInstanceUTC();
477            DateTimeFormatter f = DateTimeFormat.forPattern("yyyy-MM-ww").withChronology(chrono);
478            assertEquals(new LocalDate(2013, 12, 30, chrono), f.parseLocalDate("2014-01-01"));  // 2014-01-01 would be better, but this is OK
479        }
480    
481        public void testParseLocalDate_year_month_week_2015() {
482            Chronology chrono = GJChronology.getInstanceUTC();
483            DateTimeFormatter f = DateTimeFormat.forPattern("yyyy-MM-ww").withChronology(chrono);
484            assertEquals(new LocalDate(2014, 12, 29, chrono), f.parseLocalDate("2015-01-01"));  // 2015-01-01 would be better, but this is OK
485        }
486    
487        public void testParseLocalDate_year_month_week_2016() {
488            Chronology chrono = GJChronology.getInstanceUTC();
489            DateTimeFormatter f = DateTimeFormat.forPattern("yyyy-MM-ww").withChronology(chrono);
490            assertEquals(new LocalDate(2016, 1, 4, chrono), f.parseLocalDate("2016-01-01"));
491        }
492    
493        //-----------------------------------------------------------------------
494        public void testParseLocalTime_simple() {
495            assertEquals(new LocalTime(10, 20, 30), g.parseLocalTime("2004-06-09T10:20:30Z"));
496            assertEquals(new LocalTime(10, 20, 30), g.parseLocalTime("2004-06-09T10:20:30+18:00"));
497            assertEquals(new LocalTime(10, 20, 30), g.parseLocalTime("2004-06-09T10:20:30-18:00"));
498            assertEquals(new LocalTime(10, 20, 30, 0, BUDDHIST_PARIS),
499                    g.withChronology(BUDDHIST_PARIS).parseLocalTime("2004-06-09T10:20:30Z"));
500            try {
501                g.parseDateTime("ABC");
502                fail();
503            } catch (IllegalArgumentException ex) {}
504        }
505    
506        //-----------------------------------------------------------------------
507        public void testParseLocalDateTime_simple() {
508            assertEquals(new LocalDateTime(2004, 6, 9, 10, 20, 30), g.parseLocalDateTime("2004-06-09T10:20:30Z"));
509            assertEquals(new LocalDateTime(2004, 6, 9, 10, 20, 30), g.parseLocalDateTime("2004-06-09T10:20:30+18:00"));
510            assertEquals(new LocalDateTime(2004, 6, 9, 10, 20, 30), g.parseLocalDateTime("2004-06-09T10:20:30-18:00"));
511            assertEquals(new LocalDateTime(2004, 6, 9, 10, 20, 30, 0, BUDDHIST_PARIS),
512                    g.withChronology(BUDDHIST_PARIS).parseLocalDateTime("2004-06-09T10:20:30Z"));
513            try {
514                g.parseDateTime("ABC");
515                fail();
516            } catch (IllegalArgumentException ex) {}
517        }
518    
519        public void testParseLocalDateTime_monthDay_feb29() {
520            Chronology chrono = GJChronology.getInstanceUTC();
521            DateTimeFormatter f = DateTimeFormat
522                .forPattern("M d H m")
523                .withChronology(chrono)
524                .withLocale(Locale.UK);
525            
526            assertEquals(new LocalDateTime(2000, 2, 29, 13, 40, 0, 0, chrono), f.parseLocalDateTime("2 29 13 40"));
527        }
528    
529        public void testParseLocalDateTime_monthDay_withDefaultYear_feb29() {
530            Chronology chrono = GJChronology.getInstanceUTC();
531            DateTimeFormatter f = DateTimeFormat
532                .forPattern("M d H m")
533                .withChronology(chrono)
534                .withLocale(Locale.UK)
535                .withDefaultYear(2012);
536            
537            assertEquals(new LocalDateTime(2012, 2, 29, 13, 40, 0, 0, chrono), f.parseLocalDateTime("2 29 13 40"));
538        }
539    
540        //-----------------------------------------------------------------------
541        public void testParseDateTime_simple() {
542            DateTime expect = null;
543            expect = new DateTime(2004, 6, 9, 11, 20, 30, 0, LONDON);
544            assertEquals(expect, g.parseDateTime("2004-06-09T10:20:30Z"));
545            
546            try {
547                g.parseDateTime("ABC");
548                fail();
549            } catch (IllegalArgumentException ex) {}
550        }
551    
552        public void testParseDateTime_zone() {
553            DateTime expect = null;
554            expect = new DateTime(2004, 6, 9, 11, 20, 30, 0, LONDON);
555            assertEquals(expect, g.withZone(LONDON).parseDateTime("2004-06-09T10:20:30Z"));
556            
557            expect = new DateTime(2004, 6, 9, 11, 20, 30, 0, LONDON);
558            assertEquals(expect, g.withZone(null).parseDateTime("2004-06-09T10:20:30Z"));
559            
560            expect = new DateTime(2004, 6, 9, 12, 20, 30, 0, PARIS);
561            assertEquals(expect, g.withZone(PARIS).parseDateTime("2004-06-09T10:20:30Z"));
562        }
563    
564        public void testParseDateTime_zone2() {
565            DateTime expect = null;
566            expect = new DateTime(2004, 6, 9, 11, 20, 30, 0, LONDON);
567            assertEquals(expect, g.withZone(LONDON).parseDateTime("2004-06-09T06:20:30-04:00"));
568            
569            expect = new DateTime(2004, 6, 9, 11, 20, 30, 0, LONDON);
570            assertEquals(expect, g.withZone(null).parseDateTime("2004-06-09T06:20:30-04:00"));
571            
572            expect = new DateTime(2004, 6, 9, 12, 20, 30, 0, PARIS);
573            assertEquals(expect, g.withZone(PARIS).parseDateTime("2004-06-09T06:20:30-04:00"));
574        }
575    
576        public void testParseDateTime_zone3() {
577            DateTimeFormatter h = new DateTimeFormatterBuilder()
578            .append(ISODateTimeFormat.date())
579            .appendLiteral('T')
580            .append(ISODateTimeFormat.timeElementParser())
581            .toFormatter();
582            
583            DateTime expect = null;
584            expect = new DateTime(2004, 6, 9, 10, 20, 30, 0, LONDON);
585            assertEquals(expect, h.withZone(LONDON).parseDateTime("2004-06-09T10:20:30"));
586            
587            expect = new DateTime(2004, 6, 9, 10, 20, 30, 0, LONDON);
588            assertEquals(expect, h.withZone(null).parseDateTime("2004-06-09T10:20:30"));
589            
590            expect = new DateTime(2004, 6, 9, 10, 20, 30, 0, PARIS);
591            assertEquals(expect, h.withZone(PARIS).parseDateTime("2004-06-09T10:20:30"));
592        }
593    
594        public void testParseDateTime_simple_precedence() {
595            DateTime expect = null;
596            // use correct day of week
597            expect = new DateTime(2004, 6, 9, 11, 20, 30, 0, LONDON);
598            assertEquals(expect, f.parseDateTime("Wed 2004-06-09T10:20:30Z"));
599            
600            // use wrong day of week
601            expect = new DateTime(2004, 6, 7, 11, 20, 30, 0, LONDON);
602            // DayOfWeek takes precedence, because week < month in length
603            assertEquals(expect, f.parseDateTime("Mon 2004-06-09T10:20:30Z"));
604        }
605    
606        public void testParseDateTime_offsetParsed() {
607            DateTime expect = null;
608            expect = new DateTime(2004, 6, 9, 10, 20, 30, 0, UTC);
609            assertEquals(expect, g.withOffsetParsed().parseDateTime("2004-06-09T10:20:30Z"));
610            
611            expect = new DateTime(2004, 6, 9, 6, 20, 30, 0, DateTimeZone.forOffsetHours(-4));
612            assertEquals(expect, g.withOffsetParsed().parseDateTime("2004-06-09T06:20:30-04:00"));
613            
614            expect = new DateTime(2004, 6, 9, 10, 20, 30, 0, UTC);
615            assertEquals(expect, g.withZone(PARIS).withOffsetParsed().parseDateTime("2004-06-09T10:20:30Z"));
616            expect = new DateTime(2004, 6, 9, 12, 20, 30, 0, PARIS);
617            assertEquals(expect, g.withOffsetParsed().withZone(PARIS).parseDateTime("2004-06-09T10:20:30Z"));
618        }
619    
620        public void testParseDateTime_chrono() {
621            DateTime expect = null;
622            expect = new DateTime(2004, 6, 9, 12, 20, 30, 0, PARIS);
623            assertEquals(expect, g.withChronology(ISO_PARIS).parseDateTime("2004-06-09T10:20:30Z"));
624            
625            expect = new DateTime(2004, 6, 9, 11, 20, 30, 0,LONDON);
626            assertEquals(expect, g.withChronology(null).parseDateTime("2004-06-09T10:20:30Z"));
627            
628            expect = new DateTime(2547, 6, 9, 12, 20, 30, 0, BUDDHIST_PARIS);
629            assertEquals(expect, g.withChronology(BUDDHIST_PARIS).parseDateTime("2547-06-09T10:20:30Z"));
630            
631            expect = new DateTime(2004, 6, 9, 10, 29, 51, 0, BUDDHIST_PARIS); // zone is +00:09:21 in 1451
632            assertEquals(expect, g.withChronology(BUDDHIST_PARIS).parseDateTime("2004-06-09T10:20:30Z"));
633        }
634    
635        //-----------------------------------------------------------------------
636        public void testParseMutableDateTime_simple() {
637            MutableDateTime expect = null;
638            expect = new MutableDateTime(2004, 6, 9, 11, 20, 30, 0, LONDON);
639            assertEquals(expect, g.parseMutableDateTime("2004-06-09T10:20:30Z"));
640            
641            try {
642                g.parseMutableDateTime("ABC");
643                fail();
644            } catch (IllegalArgumentException ex) {}
645        }
646    
647        public void testParseMutableDateTime_zone() {
648            MutableDateTime expect = null;
649            expect = new MutableDateTime(2004, 6, 9, 11, 20, 30, 0, LONDON);
650            assertEquals(expect, g.withZone(LONDON).parseMutableDateTime("2004-06-09T10:20:30Z"));
651            
652            expect = new MutableDateTime(2004, 6, 9, 11, 20, 30, 0, LONDON);
653            assertEquals(expect, g.withZone(null).parseMutableDateTime("2004-06-09T10:20:30Z"));
654            
655            expect = new MutableDateTime(2004, 6, 9, 12, 20, 30, 0, PARIS);
656            assertEquals(expect, g.withZone(PARIS).parseMutableDateTime("2004-06-09T10:20:30Z"));
657        }
658    
659        public void testParseMutableDateTime_zone2() {
660            MutableDateTime expect = null;
661            expect = new MutableDateTime(2004, 6, 9, 11, 20, 30, 0, LONDON);
662            assertEquals(expect, g.withZone(LONDON).parseMutableDateTime("2004-06-09T06:20:30-04:00"));
663            
664            expect = new MutableDateTime(2004, 6, 9, 11, 20, 30, 0, LONDON);
665            assertEquals(expect, g.withZone(null).parseMutableDateTime("2004-06-09T06:20:30-04:00"));
666            
667            expect = new MutableDateTime(2004, 6, 9, 12, 20, 30, 0, PARIS);
668            assertEquals(expect, g.withZone(PARIS).parseMutableDateTime("2004-06-09T06:20:30-04:00"));
669        }
670    
671        public void testParseMutableDateTime_zone3() {
672            DateTimeFormatter h = new DateTimeFormatterBuilder()
673            .append(ISODateTimeFormat.date())
674            .appendLiteral('T')
675            .append(ISODateTimeFormat.timeElementParser())
676            .toFormatter();
677            
678            MutableDateTime expect = null;
679            expect = new MutableDateTime(2004, 6, 9, 10, 20, 30, 0, LONDON);
680            assertEquals(expect, h.withZone(LONDON).parseMutableDateTime("2004-06-09T10:20:30"));
681            
682            expect = new MutableDateTime(2004, 6, 9, 10, 20, 30, 0, LONDON);
683            assertEquals(expect, h.withZone(null).parseMutableDateTime("2004-06-09T10:20:30"));
684            
685            expect = new MutableDateTime(2004, 6, 9, 10, 20, 30, 0, PARIS);
686            assertEquals(expect, h.withZone(PARIS).parseMutableDateTime("2004-06-09T10:20:30"));
687        }
688    
689        public void testParseMutableDateTime_simple_precedence() {
690            MutableDateTime expect = null;
691            // use correct day of week
692            expect = new MutableDateTime(2004, 6, 9, 11, 20, 30, 0, LONDON);
693            assertEquals(expect, f.parseDateTime("Wed 2004-06-09T10:20:30Z"));
694            
695            // use wrong day of week
696            expect = new MutableDateTime(2004, 6, 7, 11, 20, 30, 0, LONDON);
697            // DayOfWeek takes precedence, because week < month in length
698            assertEquals(expect, f.parseDateTime("Mon 2004-06-09T10:20:30Z"));
699        }
700    
701        public void testParseMutableDateTime_offsetParsed() {
702            MutableDateTime expect = null;
703            expect = new MutableDateTime(2004, 6, 9, 10, 20, 30, 0, UTC);
704            assertEquals(expect, g.withOffsetParsed().parseMutableDateTime("2004-06-09T10:20:30Z"));
705            
706            expect = new MutableDateTime(2004, 6, 9, 6, 20, 30, 0, DateTimeZone.forOffsetHours(-4));
707            assertEquals(expect, g.withOffsetParsed().parseMutableDateTime("2004-06-09T06:20:30-04:00"));
708            
709            expect = new MutableDateTime(2004, 6, 9, 10, 20, 30, 0, UTC);
710            assertEquals(expect, g.withZone(PARIS).withOffsetParsed().parseMutableDateTime("2004-06-09T10:20:30Z"));
711            expect = new MutableDateTime(2004, 6, 9, 12, 20, 30, 0, PARIS);
712            assertEquals(expect, g.withOffsetParsed().withZone(PARIS).parseMutableDateTime("2004-06-09T10:20:30Z"));
713        }
714    
715        public void testParseMutableDateTime_chrono() {
716            MutableDateTime expect = null;
717            expect = new MutableDateTime(2004, 6, 9, 12, 20, 30, 0, PARIS);
718            assertEquals(expect, g.withChronology(ISO_PARIS).parseMutableDateTime("2004-06-09T10:20:30Z"));
719            
720            expect = new MutableDateTime(2004, 6, 9, 11, 20, 30, 0,LONDON);
721            assertEquals(expect, g.withChronology(null).parseMutableDateTime("2004-06-09T10:20:30Z"));
722            
723            expect = new MutableDateTime(2547, 6, 9, 12, 20, 30, 0, BUDDHIST_PARIS);
724            assertEquals(expect, g.withChronology(BUDDHIST_PARIS).parseMutableDateTime("2547-06-09T10:20:30Z"));
725            
726            expect = new MutableDateTime(2004, 6, 9, 10, 29, 51, 0, BUDDHIST_PARIS); // zone is +00:09:21 in 1451
727            assertEquals(expect, g.withChronology(BUDDHIST_PARIS).parseMutableDateTime("2004-06-09T10:20:30Z"));
728        }
729    
730        //-----------------------------------------------------------------------
731        public void testParseInto_simple() {
732            MutableDateTime expect = null;
733            expect = new MutableDateTime(2004, 6, 9, 11, 20, 30, 0, LONDON);
734            MutableDateTime result = new MutableDateTime(0L);
735            assertEquals(20, g.parseInto(result, "2004-06-09T10:20:30Z", 0));
736            assertEquals(expect, result);
737            
738            try {
739                g.parseInto(null, "2004-06-09T10:20:30Z", 0);
740                fail();
741            } catch (IllegalArgumentException ex) {}
742            
743            assertEquals(~0, g.parseInto(result, "ABC", 0));
744            assertEquals(~10, g.parseInto(result, "2004-06-09", 0));
745            assertEquals(~13, g.parseInto(result, "XX2004-06-09T", 2));
746        }
747    
748        public void testParseInto_zone() {
749            MutableDateTime expect = null;
750            MutableDateTime result = null;
751            expect = new MutableDateTime(2004, 6, 9, 11, 20, 30, 0, LONDON);
752            result = new MutableDateTime(0L);
753            assertEquals(20, g.withZone(LONDON).parseInto(result, "2004-06-09T10:20:30Z", 0));
754            assertEquals(expect, result);
755            
756            expect = new MutableDateTime(2004, 6, 9, 11, 20, 30, 0, LONDON);
757            result = new MutableDateTime(0L);
758            assertEquals(20, g.withZone(null).parseInto(result, "2004-06-09T10:20:30Z", 0));
759            assertEquals(expect, result);
760            
761            expect = new MutableDateTime(2004, 6, 9, 12, 20, 30, 0, PARIS);
762            result = new MutableDateTime(0L);
763            assertEquals(20, g.withZone(PARIS).parseInto(result, "2004-06-09T10:20:30Z", 0));
764            assertEquals(expect, result);
765        }
766    
767        public void testParseInto_zone2() {
768            MutableDateTime expect = null;
769            MutableDateTime result = null;
770            expect = new MutableDateTime(2004, 6, 9, 11, 20, 30, 0, LONDON);
771            result = new MutableDateTime(0L);
772            assertEquals(25, g.withZone(LONDON).parseInto(result, "2004-06-09T06:20:30-04:00", 0));
773            assertEquals(expect, result);
774            
775            expect = new MutableDateTime(2004, 6, 9, 11, 20, 30, 0, LONDON);
776            assertEquals(25, g.withZone(null).parseInto(result, "2004-06-09T06:20:30-04:00", 0));
777            assertEquals(expect, result);
778            
779            expect = new MutableDateTime(2004, 6, 9, 12, 20, 30, 0, PARIS);
780            assertEquals(25, g.withZone(PARIS).parseInto(result, "2004-06-09T06:20:30-04:00", 0));
781            assertEquals(expect, result);
782        }
783    
784        public void testParseInto_zone3() {
785            DateTimeFormatter h = new DateTimeFormatterBuilder()
786            .append(ISODateTimeFormat.date())
787            .appendLiteral('T')
788            .append(ISODateTimeFormat.timeElementParser())
789            .toFormatter();
790            
791            MutableDateTime expect = null;
792            MutableDateTime result = null;
793            expect = new MutableDateTime(2004, 6, 9, 10, 20, 30, 0, LONDON);
794            result = new MutableDateTime(0L);
795            assertEquals(19, h.withZone(LONDON).parseInto(result, "2004-06-09T10:20:30", 0));
796            assertEquals(expect, result);
797            
798            expect = new MutableDateTime(2004, 6, 9, 10, 20, 30, 0, LONDON);
799            result = new MutableDateTime(0L);
800            assertEquals(19, h.withZone(null).parseInto(result, "2004-06-09T10:20:30", 0));
801            assertEquals(expect, result);
802            
803            expect = new MutableDateTime(2004, 6, 9, 10, 20, 30, 0, PARIS);
804            result = new MutableDateTime(0L);
805            assertEquals(19, h.withZone(PARIS).parseInto(result, "2004-06-09T10:20:30", 0));
806            assertEquals(expect, result);
807        }
808    
809        public void testParseInto_simple_precedence() {
810            MutableDateTime expect = null;
811            MutableDateTime result = null;
812            expect = new MutableDateTime(2004, 6, 7, 11, 20, 30, 0, LONDON);
813            result = new MutableDateTime(0L);
814            // DayOfWeek takes precedence, because week < month in length
815            assertEquals(24, f.parseInto(result, "Mon 2004-06-09T10:20:30Z", 0));
816            assertEquals(expect, result);
817        }
818    
819        public void testParseInto_offsetParsed() {
820            MutableDateTime expect = null;
821            MutableDateTime result = null;
822            expect = new MutableDateTime(2004, 6, 9, 10, 20, 30, 0, UTC);
823            result = new MutableDateTime(0L);
824            assertEquals(20, g.withOffsetParsed().parseInto(result, "2004-06-09T10:20:30Z", 0));
825            assertEquals(expect, result);
826            
827            expect = new MutableDateTime(2004, 6, 9, 6, 20, 30, 0, DateTimeZone.forOffsetHours(-4));
828            result = new MutableDateTime(0L);
829            assertEquals(25, g.withOffsetParsed().parseInto(result, "2004-06-09T06:20:30-04:00", 0));
830            assertEquals(expect, result);
831            
832            expect = new MutableDateTime(2004, 6, 9, 10, 20, 30, 0, UTC);
833            result = new MutableDateTime(0L);
834            assertEquals(20, g.withZone(PARIS).withOffsetParsed().parseInto(result, "2004-06-09T10:20:30Z", 0));
835            assertEquals(expect, result);
836            expect = new MutableDateTime(2004, 6, 9, 12, 20, 30, 0, PARIS);
837            result = new MutableDateTime(0L);
838            assertEquals(20, g.withOffsetParsed().withZone(PARIS).parseInto(result, "2004-06-09T10:20:30Z", 0));
839            assertEquals(expect, result);
840        }
841    
842        public void testParseInto_chrono() {
843            MutableDateTime expect = null;
844            MutableDateTime result = null;
845            expect = new MutableDateTime(2004, 6, 9, 12, 20, 30, 0, PARIS);
846            result = new MutableDateTime(0L);
847            assertEquals(20, g.withChronology(ISO_PARIS).parseInto(result, "2004-06-09T10:20:30Z", 0));
848            assertEquals(expect, result);
849            
850            expect = new MutableDateTime(2004, 6, 9, 11, 20, 30, 0, LONDON);
851            result = new MutableDateTime(0L);
852            assertEquals(20, g.withChronology(null).parseInto(result, "2004-06-09T10:20:30Z", 0));
853            assertEquals(expect, result);
854            
855            expect = new MutableDateTime(2547, 6, 9, 12, 20, 30, 0, BUDDHIST_PARIS);
856            result = new MutableDateTime(0L);
857            assertEquals(20, g.withChronology(BUDDHIST_PARIS).parseInto(result, "2547-06-09T10:20:30Z", 0));
858            assertEquals(expect, result);
859            
860            expect = new MutableDateTime(2004, 6, 9, 10, 29, 51, 0, BUDDHIST_PARIS);
861            result = new MutableDateTime(0L);
862            assertEquals(20, g.withChronology(BUDDHIST_PARIS).parseInto(result, "2004-06-09T10:20:30Z", 0));
863            assertEquals(expect, result);
864        }
865    
866        public void testParseInto_monthOnly() {
867            DateTimeFormatter f = DateTimeFormat.forPattern("M").withLocale(Locale.UK);
868            MutableDateTime result = new MutableDateTime(2004, 1, 9, 12, 20, 30, 0, LONDON);
869            assertEquals(1, f.parseInto(result, "5", 0));
870            assertEquals(new MutableDateTime(2004, 5, 9, 12, 20, 30, 0, LONDON), result);
871        }
872    
873        public void testParseInto_monthOnly_baseStartYear() {
874            DateTimeFormatter f = DateTimeFormat.forPattern("M").withLocale(Locale.UK);
875            MutableDateTime result = new MutableDateTime(2004, 1, 1, 12, 20, 30, 0, TOKYO);
876            assertEquals(1, f.parseInto(result, "5", 0));
877            assertEquals(new MutableDateTime(2004, 5, 1, 12, 20, 30, 0, TOKYO), result);
878        }
879    
880        public void testParseInto_monthOnly_parseStartYear() {
881            DateTimeFormatter f = DateTimeFormat.forPattern("M").withLocale(Locale.UK);
882            MutableDateTime result = new MutableDateTime(2004, 2, 1, 12, 20, 30, 0, TOKYO);
883            assertEquals(1, f.parseInto(result, "1", 0));
884            assertEquals(new MutableDateTime(2004, 1, 1, 12, 20, 30, 0, TOKYO), result);
885        }
886    
887        public void testParseInto_monthOnly_baseEndYear() {
888            DateTimeFormatter f = DateTimeFormat.forPattern("M").withLocale(Locale.UK);
889            MutableDateTime result = new MutableDateTime(2004, 12, 31, 12, 20, 30, 0, TOKYO);
890            assertEquals(1, f.parseInto(result, "5", 0));
891            assertEquals(new MutableDateTime(2004, 5, 31, 12, 20, 30, 0, TOKYO), result);
892       }
893    
894        public void testParseInto_monthOnly_parseEndYear() {
895            DateTimeFormatter f = DateTimeFormat.forPattern("M").withLocale(Locale.UK);
896            MutableDateTime result = new MutableDateTime(2004, 1, 31, 12, 20, 30, 0,TOKYO);
897            assertEquals(2, f.parseInto(result, "12", 0));
898            assertEquals(new MutableDateTime(2004, 12, 31, 12, 20, 30, 0, TOKYO), result);
899        }
900    
901        public void testParseInto_monthDay_feb29() {
902            DateTimeFormatter f = DateTimeFormat.forPattern("M d").withLocale(Locale.UK);
903            MutableDateTime result = new MutableDateTime(2004, 1, 9, 12, 20, 30, 0, LONDON);
904            assertEquals(4, f.parseInto(result, "2 29", 0));
905            assertEquals(new MutableDateTime(2004, 2, 29, 12, 20, 30, 0, LONDON), result);
906        }
907    
908        public void testParseInto_monthDay_withDefaultYear_feb29() {
909            DateTimeFormatter f = DateTimeFormat.forPattern("M d").withDefaultYear(2012);
910            MutableDateTime result = new MutableDateTime(2004, 1, 9, 12, 20, 30, 0, LONDON);
911            assertEquals(4, f.parseInto(result, "2 29", 0));
912            assertEquals(new MutableDateTime(2004, 2, 29, 12, 20, 30, 0, LONDON), result);
913        }
914    
915        public void testParseMillis_fractionOfSecondLong() {
916            DateTimeFormatter f = new DateTimeFormatterBuilder()
917                .appendSecondOfDay(2).appendLiteral('.').appendFractionOfSecond(1, 9)
918                    .toFormatter().withZoneUTC();
919            assertEquals(10512, f.parseMillis("10.5123456"));
920            assertEquals(10512, f.parseMillis("10.512999"));
921        }
922    
923        //-----------------------------------------------------------------------
924        // Ensure time zone name switches properly at the zone DST transition.
925        public void testZoneNameNearTransition() {
926            DateTime inDST_1  = new DateTime(2005, 10, 30, 1, 0, 0, 0, NEWYORK);
927            DateTime inDST_2  = new DateTime(2005, 10, 30, 1, 59, 59, 999, NEWYORK);
928            DateTime onDST    = new DateTime(2005, 10, 30, 2, 0, 0, 0, NEWYORK);
929            DateTime outDST   = new DateTime(2005, 10, 30, 2, 0, 0, 1, NEWYORK);
930            DateTime outDST_2 = new DateTime(2005, 10, 30, 2, 0, 1, 0, NEWYORK);
931    
932            DateTimeFormatter fmt = DateTimeFormat.forPattern("yyy-MM-dd HH:mm:ss.S zzzz");
933            assertEquals("2005-10-30 01:00:00.0 Eastern Daylight Time", fmt.print(inDST_1));
934            assertEquals("2005-10-30 01:59:59.9 Eastern Daylight Time", fmt.print(inDST_2));
935            assertEquals("2005-10-30 02:00:00.0 Eastern Standard Time", fmt.print(onDST));
936            assertEquals("2005-10-30 02:00:00.0 Eastern Standard Time", fmt.print(outDST));
937            assertEquals("2005-10-30 02:00:01.0 Eastern Standard Time", fmt.print(outDST_2));
938        }
939    
940        // Ensure time zone name switches properly at the zone DST transition.
941        public void testZoneShortNameNearTransition() {
942            DateTime inDST_1  = new DateTime(2005, 10, 30, 1, 0, 0, 0, NEWYORK);
943            DateTime inDST_2  = new DateTime(2005, 10, 30, 1, 59, 59, 999, NEWYORK);
944            DateTime onDST    = new DateTime(2005, 10, 30, 2, 0, 0, 0, NEWYORK);
945            DateTime outDST   = new DateTime(2005, 10, 30, 2, 0, 0, 1, NEWYORK);
946            DateTime outDST_2 = new DateTime(2005, 10, 30, 2, 0, 1, 0, NEWYORK);
947    
948            DateTimeFormatter fmt = DateTimeFormat.forPattern("yyy-MM-dd HH:mm:ss.S z");
949            assertEquals("2005-10-30 01:00:00.0 EDT", fmt.print(inDST_1));
950            assertEquals("2005-10-30 01:59:59.9 EDT", fmt.print(inDST_2));
951            assertEquals("2005-10-30 02:00:00.0 EST", fmt.print(onDST));
952            assertEquals("2005-10-30 02:00:00.0 EST", fmt.print(outDST));
953            assertEquals("2005-10-30 02:00:01.0 EST", fmt.print(outDST_2));
954        }
955    
956    }