001    /*
002     *  Copyright 2001-2006 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.util.Locale;
019    import java.util.TimeZone;
020    
021    import junit.framework.TestCase;
022    import junit.framework.TestSuite;
023    
024    import org.joda.time.Chronology;
025    import org.joda.time.DateTime;
026    import org.joda.time.DateTimeConstants;
027    import org.joda.time.DateTimeFieldType;
028    import org.joda.time.DateTimeUtils;
029    import org.joda.time.DateTimeZone;
030    import org.joda.time.chrono.GJChronology;
031    
032    /**
033     * This class is a Junit unit test for DateTime Formating.
034     *
035     * @author Stephen Colebourne
036     * @author Fredrik Borgh
037     */
038    public class TestDateTimeFormat extends TestCase {
039    
040        private static final DateTimeZone UTC = DateTimeZone.UTC;
041        private static final DateTimeZone PARIS = DateTimeZone.forID("Europe/Paris");
042        private static final DateTimeZone LONDON = DateTimeZone.forID("Europe/London");
043        private static final DateTimeZone TOKYO = DateTimeZone.forID("Asia/Tokyo");
044        private static final DateTimeZone NEWYORK = DateTimeZone.forID("America/New_York");
045    
046        long y2002days = 365 + 365 + 366 + 365 + 365 + 365 + 366 + 365 + 365 + 365 + 
047                         366 + 365 + 365 + 365 + 366 + 365 + 365 + 365 + 366 + 365 + 
048                         365 + 365 + 366 + 365 + 365 + 365 + 366 + 365 + 365 + 365 +
049                         366 + 365;
050        // 2002-06-09
051        private long TEST_TIME_NOW =
052                (y2002days + 31L + 28L + 31L + 30L + 31L + 9L -1L) * DateTimeConstants.MILLIS_PER_DAY;
053    
054        private DateTimeZone originalDateTimeZone = null;
055        private TimeZone originalTimeZone = null;
056        private Locale originalLocale = null;
057    
058        public static void main(String[] args) {
059            junit.textui.TestRunner.run(suite());
060        }
061    
062        public static TestSuite suite() {
063            return new TestSuite(TestDateTimeFormat.class);
064        }
065    
066        public TestDateTimeFormat(String name) {
067            super(name);
068        }
069    
070        protected void setUp() throws Exception {
071            DateTimeUtils.setCurrentMillisFixed(TEST_TIME_NOW);
072            originalDateTimeZone = DateTimeZone.getDefault();
073            originalTimeZone = TimeZone.getDefault();
074            originalLocale = Locale.getDefault();
075            DateTimeZone.setDefault(LONDON);
076            TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
077            Locale.setDefault(Locale.UK);
078        }
079    
080        protected void tearDown() throws Exception {
081            DateTimeUtils.setCurrentMillisSystem();
082            DateTimeZone.setDefault(originalDateTimeZone);
083            TimeZone.setDefault(originalTimeZone);
084            Locale.setDefault(originalLocale);
085            originalDateTimeZone = null;
086            originalTimeZone = null;
087            originalLocale = null;
088        }
089    
090        //-----------------------------------------------------------------------
091        public void testSubclassableConstructor() {
092            DateTimeFormat f = new DateTimeFormat() {
093                // test constructor is protected
094            };
095            assertNotNull(f);
096        }
097    
098        //-----------------------------------------------------------------------
099        public void testFormat_era() {
100            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
101            DateTimeFormatter f = DateTimeFormat.forPattern("G").withLocale(Locale.UK);
102            assertEquals(dt.toString(), "AD", f.print(dt));
103            
104            dt = dt.withZone(NEWYORK);
105            assertEquals(dt.toString(), "AD", f.print(dt));
106            
107            dt = dt.withZone(PARIS);
108            assertEquals(dt.toString(), "AD", f.print(dt));
109        }
110    
111        //-----------------------------------------------------------------------
112        public void testFormat_centuryOfEra() {
113            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
114            DateTimeFormatter f = DateTimeFormat.forPattern("C").withLocale(Locale.UK);
115            assertEquals(dt.toString(), "20", f.print(dt));
116            
117            dt = dt.withZone(NEWYORK);
118            assertEquals(dt.toString(), "20", f.print(dt));
119            
120            dt = dt.withZone(TOKYO);
121            assertEquals(dt.toString(), "20", f.print(dt));
122            
123            dt = new DateTime(-123, 6, 9, 10, 20, 30, 40, UTC);
124            assertEquals(dt.toString(), "1", f.print(dt));
125        }
126    
127        //-----------------------------------------------------------------------
128        public void testFormat_yearOfEra() {
129            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
130            DateTimeFormatter f = DateTimeFormat.forPattern("Y").withLocale(Locale.UK);
131            assertEquals(dt.toString(), "2004", f.print(dt));
132            
133            dt = dt.withZone(NEWYORK);
134            assertEquals(dt.toString(), "2004", f.print(dt));
135            
136            dt = dt.withZone(TOKYO);
137            assertEquals(dt.toString(), "2004", f.print(dt));
138            
139            dt = new DateTime(-123, 6, 9, 10, 20, 30, 40, UTC);
140            assertEquals(dt.toString(), "124", f.print(dt));  // 124th year of BCE
141        }        
142    
143        public void testFormat_yearOfEra_twoDigit() {
144            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
145            DateTimeFormatter f = DateTimeFormat.forPattern("YY").withLocale(Locale.UK);
146            assertEquals(dt.toString(), "04", f.print(dt));
147            
148            dt = new DateTime(-123, 6, 9, 10, 20, 30, 40, UTC);
149            assertEquals(dt.toString(), "23", f.print(dt));
150            
151            // current time set to 2002-06-09
152            f = f.withZoneUTC();
153            DateTime expect = null;
154            expect = new DateTime(2004, 1, 1, 0, 0, 0, 0, UTC);
155            assertEquals(expect, f.parseDateTime("04"));
156            
157            expect = new DateTime(1922, 1, 1, 0, 0, 0, 0, UTC);
158            assertEquals(expect, f.parseDateTime("22"));
159            
160            expect = new DateTime(2021, 1, 1, 0, 0, 0, 0, UTC);
161            assertEquals(expect, f.parseDateTime("21"));
162    
163            // Added tests to ensure single sign digit parse fails properly
164            try {
165                f.parseDateTime("-");
166                fail();
167            } catch (IllegalArgumentException ex) {}
168    
169            try {
170                f.parseDateTime("+");
171                fail();
172            } catch (IllegalArgumentException ex) {}
173    
174            // Added tests for pivot year setting
175            f = f.withPivotYear(new Integer(2050));
176            expect = new DateTime(2000, 1, 1, 0, 0, 0, 0, UTC);
177            assertEquals(expect, f.parseDateTime("00"));
178    
179            expect = new DateTime(2099, 1, 1, 0, 0, 0, 0, UTC);
180            assertEquals(expect, f.parseDateTime("99"));
181    
182            // Added tests to ensure two digit parsing is lenient for DateTimeFormat
183            f = DateTimeFormat.forPattern("YY").withLocale(Locale.UK);
184            f = f.withZoneUTC();
185            f.parseDateTime("5");
186            f.parseDateTime("005");
187            f.parseDateTime("+50");
188            f.parseDateTime("-50");
189        }
190    
191        public void testFormat_yearOfEraParse() {
192            Chronology chrono = GJChronology.getInstanceUTC();
193    
194            DateTimeFormatter f = DateTimeFormat
195                .forPattern("YYYY-MM GG")
196                .withChronology(chrono)
197                .withLocale(Locale.UK);
198    
199            DateTime dt = new DateTime(2005, 10, 1, 0, 0, 0, 0, chrono);
200            assertEquals(dt, f.parseDateTime("2005-10 AD"));
201            assertEquals(dt, f.parseDateTime("2005-10 CE"));
202    
203            dt = new DateTime(-2005, 10, 1, 0, 0, 0, 0, chrono);
204            assertEquals(dt, f.parseDateTime("2005-10 BC"));
205            assertEquals(dt, f.parseDateTime("2005-10 BCE"));
206        }        
207    
208        //-----------------------------------------------------------------------
209        public void testFormat_year() {
210            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
211            DateTimeFormatter f = DateTimeFormat.forPattern("y").withLocale(Locale.UK);
212            assertEquals(dt.toString(), "2004", f.print(dt));
213            
214            dt = dt.withZone(NEWYORK);
215            assertEquals(dt.toString(), "2004", f.print(dt));
216            
217            dt = dt.withZone(TOKYO);
218            assertEquals(dt.toString(), "2004", f.print(dt));
219            
220            dt = new DateTime(-123, 6, 9, 10, 20, 30, 40, UTC);
221            assertEquals(dt.toString(), "-123", f.print(dt));
222    
223            // Added tests to ensure single sign digit parse fails properly
224            try {
225                f.parseDateTime("-");
226                fail();
227            } catch (IllegalArgumentException ex) {}
228    
229            try {
230                f.parseDateTime("+");
231                fail();
232            } catch (IllegalArgumentException ex) {}
233        }
234    
235        public void testFormat_year_twoDigit() {
236            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
237            DateTimeFormatter f = DateTimeFormat.forPattern("yy").withLocale(Locale.UK);
238            assertEquals(dt.toString(), "04", f.print(dt));
239            
240            dt = new DateTime(-123, 6, 9, 10, 20, 30, 40, UTC);
241            assertEquals(dt.toString(), "23", f.print(dt));
242            
243            // current time set to 2002-06-09
244            f = f.withZoneUTC();
245            DateTime expect = null;
246            expect = new DateTime(2004, 1, 1, 0, 0, 0, 0, UTC);
247            assertEquals(expect, f.parseDateTime("04"));
248            
249            expect = new DateTime(1922, 1, 1, 0, 0, 0, 0, UTC);
250            assertEquals(expect, f.parseDateTime("22"));
251            
252            expect = new DateTime(2021, 1, 1, 0, 0, 0, 0, UTC);
253            assertEquals(expect, f.parseDateTime("21"));
254    
255            // Added tests to ensure single sign digit parse fails properly
256            try {
257                f.parseDateTime("-");
258                fail();
259            } catch (IllegalArgumentException ex) {}
260    
261            try {
262                f.parseDateTime("+");
263                fail();
264            } catch (IllegalArgumentException ex) {}
265    
266            // Added tests for pivot year setting
267            f = f.withPivotYear(new Integer(2050));
268            expect = new DateTime(2000, 1, 1, 0, 0, 0, 0, UTC);
269            assertEquals(expect, f.parseDateTime("00"));
270    
271            expect = new DateTime(2099, 1, 1, 0, 0, 0, 0, UTC);
272            assertEquals(expect, f.parseDateTime("99"));
273    
274            // Added tests to ensure two digit parsing is strict by default for
275            // DateTimeFormatterBuilder
276            f = new DateTimeFormatterBuilder().appendTwoDigitYear(2000).toFormatter();
277            f = f.withZoneUTC();
278            try {
279                f.parseDateTime("5");
280                fail();
281            } catch (IllegalArgumentException ex) {}
282            try {
283                f.parseDateTime("005");
284                fail();
285            } catch (IllegalArgumentException ex) {}
286            try {
287                f.parseDateTime("+50");
288                fail();
289            } catch (IllegalArgumentException ex) {}
290            try {
291                f.parseDateTime("-50");
292                fail();
293            } catch (IllegalArgumentException ex) {}
294    
295            // Added tests to ensure two digit parsing is lenient for DateTimeFormat
296            f = DateTimeFormat.forPattern("yy").withLocale(Locale.UK);
297            f = f.withZoneUTC();
298            f.parseDateTime("5");
299            f.parseDateTime("005");
300            f.parseDateTime("+50");
301            f.parseDateTime("-50");
302    
303            // Added tests for lenient two digit parsing
304            f = new DateTimeFormatterBuilder().appendTwoDigitYear(2000, true).toFormatter();
305            f = f.withZoneUTC();
306            expect = new DateTime(2004, 1, 1, 0, 0, 0, 0, UTC);
307            assertEquals(expect, f.parseDateTime("04"));
308    
309            expect = new DateTime(4, 1, 1, 0, 0, 0, 0, UTC);
310            assertEquals(expect, f.parseDateTime("+04"));
311    
312            expect = new DateTime(-4, 1, 1, 0, 0, 0, 0, UTC);
313            assertEquals(expect, f.parseDateTime("-04"));
314    
315            expect = new DateTime(4, 1, 1, 0, 0, 0, 0, UTC);
316            assertEquals(expect, f.parseDateTime("4"));
317    
318            expect = new DateTime(-4, 1, 1, 0, 0, 0, 0, UTC);
319            assertEquals(expect, f.parseDateTime("-4"));
320    
321            expect = new DateTime(4, 1, 1, 0, 0, 0, 0, UTC);
322            assertEquals(expect, f.parseDateTime("004"));
323    
324            expect = new DateTime(4, 1, 1, 0, 0, 0, 0, UTC);
325            assertEquals(expect, f.parseDateTime("+004"));
326    
327            expect = new DateTime(-4, 1, 1, 0, 0, 0, 0, UTC);
328            assertEquals(expect, f.parseDateTime("-004"));
329    
330            expect = new DateTime(3004, 1, 1, 0, 0, 0, 0, UTC);
331            assertEquals(expect, f.parseDateTime("3004"));
332    
333            expect = new DateTime(3004, 1, 1, 0, 0, 0, 0, UTC);
334            assertEquals(expect, f.parseDateTime("+3004"));
335    
336            expect = new DateTime(-3004, 1, 1, 0, 0, 0, 0, UTC);
337            assertEquals(expect, f.parseDateTime("-3004"));
338    
339            try {
340                f.parseDateTime("-");
341                fail();
342            } catch (IllegalArgumentException ex) {}
343    
344            try {
345                f.parseDateTime("+");
346                fail();
347            } catch (IllegalArgumentException ex) {}
348        }
349    
350        public void testFormat_year_long() {
351            DateTime dt = new DateTime(278004, 6, 9, 10, 20, 30, 40, UTC);
352            DateTimeFormatter f = DateTimeFormat.forPattern("yyyy");
353            assertEquals(dt.toString(), "278004", f.print(dt));
354            
355            // for coverage
356            f = DateTimeFormat.forPattern("yyyyMMdd");
357            assertEquals(dt.toString(), "2780040609", f.print(dt));
358            
359            // for coverage
360            f = DateTimeFormat.forPattern("yyyyddMM");
361            assertEquals(dt.toString(), "2780040906", f.print(dt));
362        }
363    
364        //-----------------------------------------------------------------------
365        public void testFormat_weekyear() {
366            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
367            DateTimeFormatter f = DateTimeFormat.forPattern("x").withLocale(Locale.UK);
368            assertEquals(dt.toString(), "2004", f.print(dt));
369            
370            dt = dt.withZone(NEWYORK);
371            assertEquals(dt.toString(), "2004", f.print(dt));
372            
373            dt = dt.withZone(TOKYO);
374            assertEquals(dt.toString(), "2004", f.print(dt));
375            
376            dt = new DateTime(-123, 6, 9, 10, 20, 30, 40, UTC);
377            assertEquals(dt.toString(), "-123", f.print(dt));
378        }
379    
380        public void testFormat_weekyearOfEra_twoDigit() {
381            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
382            DateTimeFormatter f = DateTimeFormat.forPattern("xx").withLocale(Locale.UK);
383            assertEquals(dt.toString(), "04", f.print(dt));
384            
385            dt = new DateTime(-123, 6, 9, 10, 20, 30, 40, UTC);
386            assertEquals(dt.toString(), "23", f.print(dt));
387            
388            // current time set to 2002-06-09
389            f = f.withZoneUTC();
390            DateTime expect = null;
391            expect = new DateTime(2003, 12, 29, 0, 0, 0, 0, UTC);
392            assertEquals(expect, f.parseDateTime("04"));
393            
394            expect = new DateTime(1922, 1, 2, 0, 0, 0, 0, UTC);
395            assertEquals(expect, f.parseDateTime("22"));
396            
397            expect = new DateTime(2021, 1, 4, 0, 0, 0, 0, UTC);
398            assertEquals(expect, f.parseDateTime("21"));
399    
400            // Added tests to ensure single sign digit parse fails properly
401            try {
402                f.parseDateTime("-");
403                fail();
404            } catch (IllegalArgumentException ex) {}
405    
406            try {
407                f.parseDateTime("+");
408                fail();
409            } catch (IllegalArgumentException ex) {}
410    
411            // Added tests for pivot year setting
412            f = f.withPivotYear(new Integer(2050));
413            expect = new DateTime(2000, 1, 3, 0, 0, 0, 0, DateTimeZone.UTC);
414            assertEquals(expect, f.parseDateTime("00"));
415    
416            expect = new DateTime(2098, 12, 29, 0, 0, 0, 0, DateTimeZone.UTC);
417            assertEquals(expect, f.parseDateTime("99"));
418    
419            // Added tests to ensure two digit parsing is strict by default for
420            // DateTimeFormatterBuilder
421            f = new DateTimeFormatterBuilder().appendTwoDigitWeekyear(2000).toFormatter();
422            f = f.withZoneUTC();
423            try {
424                f.parseDateTime("5");
425                fail();
426            } catch (IllegalArgumentException ex) {}
427            try {
428                f.parseDateTime("005");
429                fail();
430            } catch (IllegalArgumentException ex) {}
431            try {
432                f.parseDateTime("+50");
433                fail();
434            } catch (IllegalArgumentException ex) {}
435            try {
436                f.parseDateTime("-50");
437                fail();
438            } catch (IllegalArgumentException ex) {}
439    
440            // Added tests to ensure two digit parsing is lenient for DateTimeFormat
441            f = DateTimeFormat.forPattern("xx").withLocale(Locale.UK);
442            f = f.withZoneUTC();
443            f.parseDateTime("5");
444            f.parseDateTime("005");
445            f.parseDateTime("+50");
446            f.parseDateTime("-50");
447    
448            // Added tests for lenient two digit parsing
449            f = new DateTimeFormatterBuilder().appendTwoDigitWeekyear(2000, true).toFormatter();
450            f = f.withZoneUTC();
451            expect = new DateTime(2003, 12, 29, 0, 0, 0, 0, UTC);
452            assertEquals(expect, f.parseDateTime("04"));
453    
454            expect = new DateTime(3, 12, 29, 0, 0, 0, 0, UTC);
455            assertEquals(expect, f.parseDateTime("+04"));
456    
457            expect = new DateTime(-4, 1, 1, 0, 0, 0, 0, UTC);
458            assertEquals(expect, f.parseDateTime("-04"));
459    
460            expect = new DateTime(3, 12, 29, 0, 0, 0, 0, UTC);
461            assertEquals(expect, f.parseDateTime("4"));
462    
463            expect = new DateTime(-4, 1, 1, 0, 0, 0, 0, UTC);
464            assertEquals(expect, f.parseDateTime("-4"));
465    
466            expect = new DateTime(3, 12, 29, 0, 0, 0, 0, UTC);
467            assertEquals(expect, f.parseDateTime("004"));
468    
469            expect = new DateTime(3, 12, 29, 0, 0, 0, 0, UTC);
470            assertEquals(expect, f.parseDateTime("+004"));
471    
472            expect = new DateTime(-4, 1, 1, 0, 0, 0, 0, UTC);
473            assertEquals(expect, f.parseDateTime("-004"));
474    
475            expect = new DateTime(3004, 1, 2, 0, 0, 0, 0, UTC);
476            assertEquals(expect, f.parseDateTime("3004"));
477    
478            expect = new DateTime(3004, 1, 2, 0, 0, 0, 0, UTC);
479            assertEquals(expect, f.parseDateTime("+3004"));
480    
481            expect = new DateTime(-3004, 1, 4, 0, 0, 0, 0, UTC);
482            assertEquals(expect, f.parseDateTime("-3004"));
483    
484            try {
485                f.parseDateTime("-");
486                fail();
487            } catch (IllegalArgumentException ex) {}
488    
489            try {
490                f.parseDateTime("+");
491                fail();
492            } catch (IllegalArgumentException ex) {}
493        }
494    
495        //-----------------------------------------------------------------------
496        public void testFormat_weekOfWeekyear() {
497            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
498            DateTimeFormatter f = DateTimeFormat.forPattern("w").withLocale(Locale.UK);
499            assertEquals(dt.toString(), "24", f.print(dt));
500            
501            dt = dt.withZone(NEWYORK);
502            assertEquals(dt.toString(), "24", f.print(dt));
503            
504            dt = dt.withZone(TOKYO);
505            assertEquals(dt.toString(), "24", f.print(dt));
506        }
507    
508        //-----------------------------------------------------------------------
509        public void testFormat_dayOfWeek() {
510            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
511            DateTimeFormatter f = DateTimeFormat.forPattern("e").withLocale(Locale.UK);
512            assertEquals(dt.toString(), "3", f.print(dt));
513            
514            dt = dt.withZone(NEWYORK);
515            assertEquals(dt.toString(), "3", f.print(dt));
516            
517            dt = dt.withZone(TOKYO);
518            assertEquals(dt.toString(), "3", f.print(dt));
519        }
520    
521        //-----------------------------------------------------------------------
522        public void testFormat_dayOfWeekShortText() {
523            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
524            DateTimeFormatter f = DateTimeFormat.forPattern("E").withLocale(Locale.UK);
525            assertEquals(dt.toString(), "Wed", f.print(dt));
526            
527            dt = dt.withZone(NEWYORK);
528            assertEquals(dt.toString(), "Wed", f.print(dt));
529            
530            dt = dt.withZone(TOKYO);
531            assertEquals(dt.toString(), "Wed", f.print(dt));
532            
533            f = f.withLocale(Locale.FRENCH);
534            assertEquals(dt.toString(), "mer.", f.print(dt));
535        }
536    
537        //-----------------------------------------------------------------------
538        public void testFormat_dayOfWeekText() {
539            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
540            DateTimeFormatter f = DateTimeFormat.forPattern("EEEE").withLocale(Locale.UK);
541            assertEquals(dt.toString(), "Wednesday", f.print(dt));
542            
543            dt = dt.withZone(NEWYORK);
544            assertEquals(dt.toString(), "Wednesday", f.print(dt));
545            
546            dt = dt.withZone(TOKYO);
547            assertEquals(dt.toString(), "Wednesday", f.print(dt));
548            
549            f = f.withLocale(Locale.FRENCH);
550            assertEquals(dt.toString(), "mercredi", f.print(dt));
551        }
552    
553        //-----------------------------------------------------------------------
554        public void testFormat_dayOfYearText() {
555            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
556            DateTimeFormatter f = DateTimeFormat.forPattern("D").withLocale(Locale.UK);
557            assertEquals(dt.toString(), "161", f.print(dt));
558            
559            dt = dt.withZone(NEWYORK);
560            assertEquals(dt.toString(), "161", f.print(dt));
561            
562            dt = dt.withZone(TOKYO);
563            assertEquals(dt.toString(), "161", f.print(dt));
564        }
565    
566        //-----------------------------------------------------------------------
567        public void testFormat_monthOfYear() {
568            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
569            DateTimeFormatter f = DateTimeFormat.forPattern("M").withLocale(Locale.UK);
570            assertEquals(dt.toString(), "6", f.print(dt));
571            
572            dt = dt.withZone(NEWYORK);
573            assertEquals(dt.toString(), "6", f.print(dt));
574            
575            dt = dt.withZone(TOKYO);
576            assertEquals(dt.toString(), "6", f.print(dt));
577        }
578    
579        //-----------------------------------------------------------------------
580        public void testFormat_monthOfYearShortText() {
581            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
582            DateTimeFormatter f = DateTimeFormat.forPattern("MMM").withLocale(Locale.UK);
583            assertEquals(dt.toString(), "Jun", f.print(dt));
584            
585            dt = dt.withZone(NEWYORK);
586            assertEquals(dt.toString(), "Jun", f.print(dt));
587            
588            dt = dt.withZone(TOKYO);
589            assertEquals(dt.toString(), "Jun", f.print(dt));
590            
591            f = f.withLocale(Locale.FRENCH);
592            assertEquals(dt.toString(), "juin", f.print(dt));
593        }
594    
595        //-----------------------------------------------------------------------
596        public void testFormat_monthOfYearText() {
597            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
598            DateTimeFormatter f = DateTimeFormat.forPattern("MMMM").withLocale(Locale.UK);
599            assertEquals(dt.toString(), "June", f.print(dt));
600            
601            dt = dt.withZone(NEWYORK);
602            assertEquals(dt.toString(), "June", f.print(dt));
603            
604            dt = dt.withZone(TOKYO);
605            assertEquals(dt.toString(), "June", f.print(dt));
606            
607            f = f.withLocale(Locale.FRENCH);
608            assertEquals(dt.toString(), "juin", f.print(dt));
609        }
610    
611        //-----------------------------------------------------------------------
612        public void testFormat_dayOfMonth() {
613            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
614            DateTimeFormatter f = DateTimeFormat.forPattern("d").withLocale(Locale.UK);
615            assertEquals(dt.toString(), "9", f.print(dt));
616            
617            dt = dt.withZone(NEWYORK);
618            assertEquals(dt.toString(), "9", f.print(dt));
619            
620            dt = dt.withZone(TOKYO);
621            assertEquals(dt.toString(), "9", f.print(dt));
622        }
623    
624        //-----------------------------------------------------------------------
625        public void testFormat_halfdayOfDay() {
626            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
627            DateTimeFormatter f = DateTimeFormat.forPattern("a").withLocale(Locale.UK);
628            assertEquals(dt.toString(), "AM", f.print(dt));
629            
630            dt = dt.withZone(NEWYORK);
631            assertEquals(dt.toString(), "AM", f.print(dt));
632            
633            dt = dt.withZone(TOKYO);
634            assertEquals(dt.toString(), "PM", f.print(dt));
635        }
636    
637        //-----------------------------------------------------------------------
638        public void testFormat_hourOfHalfday() {
639            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
640            DateTimeFormatter f = DateTimeFormat.forPattern("K").withLocale(Locale.UK);
641            assertEquals(dt.toString(), "10", f.print(dt));
642            
643            dt = dt.withZone(NEWYORK);
644            assertEquals(dt.toString(), "6", f.print(dt));
645            
646            dt = dt.withZone(TOKYO);
647            assertEquals(dt.toString(), "7", f.print(dt));
648            
649            dt = new DateTime(2004, 6, 9, 0, 0, 0, 0, UTC);
650            assertEquals(dt.toString(), "0", f.print(dt));
651        }
652    
653        //-----------------------------------------------------------------------
654        public void testFormat_clockhourOfHalfday() {
655            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
656            DateTimeFormatter f = DateTimeFormat.forPattern("h").withLocale(Locale.UK);
657            assertEquals(dt.toString(), "10", f.print(dt));
658            
659            dt = dt.withZone(NEWYORK);
660            assertEquals(dt.toString(), "6", f.print(dt));
661            
662            dt = dt.withZone(TOKYO);
663            assertEquals(dt.toString(), "7", f.print(dt));
664            
665            dt = new DateTime(2004, 6, 9, 0, 0, 0, 0, UTC);
666            assertEquals(dt.toString(), "12", f.print(dt));
667        }
668    
669        //-----------------------------------------------------------------------
670        public void testFormat_hourOfDay() {
671            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
672            DateTimeFormatter f = DateTimeFormat.forPattern("H").withLocale(Locale.UK);
673            assertEquals(dt.toString(), "10", f.print(dt));
674            
675            dt = dt.withZone(NEWYORK);
676            assertEquals(dt.toString(), "6", f.print(dt));
677            
678            dt = dt.withZone(TOKYO);
679            assertEquals(dt.toString(), "19", f.print(dt));
680            
681            dt = new DateTime(2004, 6, 9, 0, 0, 0, 0, UTC);
682            assertEquals(dt.toString(), "0", f.print(dt));
683        }
684    
685        //-----------------------------------------------------------------------
686        public void testFormat_clockhourOfDay() {
687            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
688            DateTimeFormatter f = DateTimeFormat.forPattern("k").withLocale(Locale.UK);
689            assertEquals(dt.toString(), "10", f.print(dt));
690            
691            dt = dt.withZone(NEWYORK);
692            assertEquals(dt.toString(), "6", f.print(dt));
693            
694            dt = dt.withZone(TOKYO);
695            assertEquals(dt.toString(), "19", f.print(dt));
696            
697            dt = new DateTime(2004, 6, 9, 0, 0, 0, 0, UTC);
698            assertEquals(dt.toString(), "24", f.print(dt));
699        }
700    
701        //-----------------------------------------------------------------------
702        public void testFormat_minute() {
703            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
704            DateTimeFormatter f = DateTimeFormat.forPattern("m").withLocale(Locale.UK);
705            assertEquals(dt.toString(), "20", f.print(dt));
706            
707            dt = dt.withZone(NEWYORK);
708            assertEquals(dt.toString(), "20", f.print(dt));
709            
710            dt = dt.withZone(TOKYO);
711            assertEquals(dt.toString(), "20", f.print(dt));
712        }
713    
714        //-----------------------------------------------------------------------
715        public void testFormat_second() {
716            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
717            DateTimeFormatter f = DateTimeFormat.forPattern("s").withLocale(Locale.UK);
718            assertEquals(dt.toString(), "30", f.print(dt));
719            
720            dt = dt.withZone(NEWYORK);
721            assertEquals(dt.toString(), "30", f.print(dt));
722            
723            dt = dt.withZone(TOKYO);
724            assertEquals(dt.toString(), "30", f.print(dt));
725        }
726    
727        //-----------------------------------------------------------------------
728        public void testFormat_fractionOfSecond() {
729            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
730            DateTimeFormatter f = DateTimeFormat.forPattern("SSS").withLocale(Locale.UK);
731            assertEquals(dt.toString(), "040", f.print(dt));
732            
733            dt = dt.withZone(NEWYORK);
734            assertEquals(dt.toString(), "040", f.print(dt));
735            
736            dt = dt.withZone(TOKYO);
737            assertEquals(dt.toString(), "040", f.print(dt));
738        }
739    
740        //-----------------------------------------------------------------------
741        public void testFormat_fractionOfSecondLong() {
742            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
743            DateTimeFormatter f = DateTimeFormat.forPattern("SSSSSS").withLocale(Locale.UK);
744            assertEquals(dt.toString(), "040000", f.print(dt));
745            
746            dt = dt.withZone(NEWYORK);
747            assertEquals(dt.toString(), "040000", f.print(dt));
748            
749            dt = dt.withZone(TOKYO);
750            assertEquals(dt.toString(), "040000", f.print(dt));
751        }
752    
753        //-----------------------------------------------------------------------
754        public void testFormat_zoneText() {
755            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
756            DateTimeFormatter f = DateTimeFormat.forPattern("z").withLocale(Locale.UK);
757            assertEquals(dt.toString(), "UTC", f.print(dt));
758            
759            dt = dt.withZone(NEWYORK);
760            assertEquals(dt.toString(), "EDT", f.print(dt));
761            
762            dt = dt.withZone(TOKYO);
763            assertEquals(dt.toString(), "JST", f.print(dt));
764        }
765    
766        public void testFormat_zoneLongText() {
767            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
768            DateTimeFormatter f = DateTimeFormat.forPattern("zzzz").withLocale(Locale.UK);
769            assertEquals(dt.toString(), "Coordinated Universal Time", f.print(dt));
770            
771            dt = dt.withZone(NEWYORK);
772            assertEquals(dt.toString(), "Eastern Daylight Time", f.print(dt));
773            
774            dt = dt.withZone(TOKYO);
775            assertEquals(dt.toString(), "Japan Standard Time", f.print(dt));
776        }
777    
778        //-----------------------------------------------------------------------
779        public void testFormat_zoneAmount() {
780            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
781            DateTimeFormatter f = DateTimeFormat.forPattern("Z").withLocale(Locale.UK);
782            assertEquals(dt.toString(), "+0000", f.print(dt));
783            
784            dt = dt.withZone(NEWYORK);
785            assertEquals(dt.toString(), "-0400", f.print(dt));
786            
787            dt = dt.withZone(TOKYO);
788            assertEquals(dt.toString(), "+0900", f.print(dt));
789        }
790    
791        public void testFormat_zoneAmountColon() {
792            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
793            DateTimeFormatter f = DateTimeFormat.forPattern("ZZ").withLocale(Locale.UK);
794            assertEquals(dt.toString(), "+00:00", f.print(dt));
795            
796            dt = dt.withZone(NEWYORK);
797            assertEquals(dt.toString(), "-04:00", f.print(dt));
798            
799            dt = dt.withZone(TOKYO);
800            assertEquals(dt.toString(), "+09:00", f.print(dt));
801        }
802    
803        public void testFormat_zoneAmountID() {
804            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
805            DateTimeFormatter f = DateTimeFormat.forPattern("ZZZ").withLocale(Locale.UK);
806            assertEquals(dt.toString(), "UTC", f.print(dt));
807            
808            dt = dt.withZone(NEWYORK);
809            assertEquals(dt.toString(), "America/New_York", f.print(dt));
810            
811            dt = dt.withZone(TOKYO);
812            assertEquals(dt.toString(), "Asia/Tokyo", f.print(dt));
813        }
814    
815        //-----------------------------------------------------------------------
816        public void testFormat_other() {
817            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
818            DateTimeFormatter f = DateTimeFormat.forPattern("'Hello' ''");
819            assertEquals("Hello '", f.print(dt));
820        }
821    
822        public void testFormat_invalid() {
823            try {
824                DateTimeFormat.forPattern(null);
825                fail();
826            } catch (IllegalArgumentException ex) {}
827            try {
828                DateTimeFormat.forPattern("");
829                fail();
830            } catch (IllegalArgumentException ex) {}
831            try {
832                DateTimeFormat.forPattern("A");
833                fail();
834            } catch (IllegalArgumentException ex) {}
835            try {
836                DateTimeFormat.forPattern("dd/mm/AA");
837                fail();
838            } catch (IllegalArgumentException ex) {}
839        }
840    
841        public void testFormat_samples() {
842            DateTime dt = new DateTime(2004, 6, 9, 10, 20, 30, 40, UTC);
843            DateTimeFormatter f = DateTimeFormat.forPattern("yyyy-MM-dd HH.mm.ss");
844            assertEquals("2004-06-09 10.20.30", f.print(dt));
845        }
846    
847        public void testFormat_shortBasicParse() {
848            // Tests special two digit parse to make sure it properly switches
849            // between lenient and strict parsing.
850    
851            DateTime dt = new DateTime(2004, 3, 9, 0, 0, 0, 0);
852    
853            DateTimeFormatter f = DateTimeFormat.forPattern("yyMMdd");
854            assertEquals(dt, f.parseDateTime("040309"));
855            try {
856                assertEquals(dt, f.parseDateTime("20040309"));
857                fail();
858            } catch (IllegalArgumentException ex) {}
859    
860            f = DateTimeFormat.forPattern("yy/MM/dd");
861            assertEquals(dt, f.parseDateTime("04/03/09"));
862            assertEquals(dt, f.parseDateTime("2004/03/09"));
863        }
864    
865        //-----------------------------------------------------------------------
866        public void testParse_pivotYear() {
867            DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("dd.MM.yy").withPivotYear(2050).withZoneUTC();
868            
869            DateTime date = dateFormatter.parseDateTime("25.12.15");
870            assertEquals(date.getYear(), 2015);
871            
872            date = dateFormatter.parseDateTime("25.12.00");
873            assertEquals(date.getYear(), 2000);
874            
875            date = dateFormatter.parseDateTime("25.12.99");
876            assertEquals(date.getYear(), 2099);
877        }
878    
879        public void testParse_pivotYear_ignored4DigitYear() {
880            DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("dd.MM.yyyy").withPivotYear(2050).withZoneUTC();
881            
882            DateTime date = dateFormatter.parseDateTime("25.12.15");
883            assertEquals(date.getYear(), 15);
884            
885            date = dateFormatter.parseDateTime("25.12.00");
886            assertEquals(date.getYear(), 0);
887            
888            date = dateFormatter.parseDateTime("25.12.99");
889            assertEquals(date.getYear(), 99);
890        }
891    
892        //-----------------------------------------------------------------------
893        public void testFormatParse_textMonthJanShort_UK() {
894            DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("dd MMM yyyy")
895                .withLocale(Locale.UK).withZoneUTC();
896            
897            String str = new DateTime(2007, 1, 23, 0, 0, 0, 0, UTC).toString(dateFormatter);
898            assertEquals(str, "23 Jan 2007");
899            DateTime date = dateFormatter.parseDateTime(str);
900            check(date, 2007, 1, 23);
901        }
902    
903        public void testFormatParse_textMonthJanShortLowerCase_UK() {
904            DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("dd MMM yyyy")
905                .withLocale(Locale.UK).withZoneUTC();
906            DateTime date = dateFormatter.parseDateTime("23 jan 2007");
907            check(date, 2007, 1, 23);
908        }
909    
910        public void testFormatParse_textMonthJanShortUpperCase_UK() {
911            DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("dd MMM yyyy")
912                .withLocale(Locale.UK).withZoneUTC();
913            DateTime date = dateFormatter.parseDateTime("23 JAN 2007");
914            check(date, 2007, 1, 23);
915        }
916    
917        public void testParse_textMonthJanLong_UK() {
918            DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("dd MMM yyyy")
919                .withLocale(Locale.UK).withZoneUTC();
920            
921            DateTime date = dateFormatter.parseDateTime("23 January 2007");
922            check(date, 2007, 1, 23);
923        }
924    
925        public void testFormatParse_textMonthJanLongLowerCase_UK() {
926            DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("dd MMM yyyy")
927                .withLocale(Locale.UK).withZoneUTC();
928            DateTime date = dateFormatter.parseDateTime("23 january 2007");
929            check(date, 2007, 1, 23);
930        }
931    
932        public void testFormatParse_textMonthJanLongUpperCase_UK() {
933            DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("dd MMM yyyy")
934                .withLocale(Locale.UK).withZoneUTC();
935            DateTime date = dateFormatter.parseDateTime("23 JANUARY 2007");
936            check(date, 2007, 1, 23);
937        }
938    
939        public void testFormatParse_textMonthJanShort_France() {
940            DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("dd MMM yyyy")
941                .withLocale(Locale.FRANCE).withZoneUTC();
942            
943            String str = new DateTime(2007, 1, 23, 0, 0, 0, 0, UTC).toString(dateFormatter);
944            assertEquals("23 janv. 2007", str);
945            DateTime date = dateFormatter.parseDateTime(str);
946            check(date, 2007, 1, 23);
947        }
948    
949        public void testFormatParse_textMonthJanLong_France() {
950            DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("dd MMM yyyy")
951                .withLocale(Locale.FRANCE).withZoneUTC();
952            
953            DateTime date = dateFormatter.parseDateTime("23 janvier 2007");
954            check(date, 2007, 1, 23);
955        }
956    
957        public void testFormatParse_textMonthApr_France() {
958            DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("dd MMM yyyy")
959                .withLocale(Locale.FRANCE).withZoneUTC();
960            
961            String str = new DateTime(2007, 2, 23, 0, 0, 0, 0, UTC).toString(dateFormatter);
962            assertEquals("23 f\u00E9vr. 2007", str);  // e acute
963            DateTime date = dateFormatter.parseDateTime(str);
964            check(date, 2007, 2, 23);
965        }
966    
967        public void testFormatParse_textMonthAtEnd_France() {
968            DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("dd MMM")
969                .withLocale(Locale.FRANCE).withZoneUTC();
970            
971            String str = new DateTime(2007, 6, 23, 0, 0, 0, 0, UTC).toString(dateFormatter);
972            assertEquals("23 juin", str);
973            DateTime date = dateFormatter.parseDateTime(str);
974            check(date, 2000, 6, 23);
975        }
976    
977        public void testFormatParse_textMonthAtEnd_France_withSpecifiedDefault() {
978            DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("dd MMM")
979                .withLocale(Locale.FRANCE).withZoneUTC().withDefaultYear(1980);
980            
981            String str = new DateTime(2007, 6, 23, 0, 0, 0, 0, UTC).toString(dateFormatter);
982            assertEquals("23 juin", str);
983            DateTime date = dateFormatter.parseDateTime(str);
984            check(date, 1980, 6, 23);
985        }
986    
987        public void testFormatParse_textMonthApr_Korean() {
988            DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("EEEE, d MMMM yyyy HH:mm")
989                .withLocale(Locale.KOREAN).withZoneUTC();
990            
991            String str = new DateTime(2007, 3, 8, 22, 0, 0, 0, UTC).toString(dateFormatter);
992            DateTime date = dateFormatter.parseDateTime(str);
993            assertEquals(new DateTime(2007, 3, 8, 22, 0, 0, 0, UTC), date);
994        }
995    
996        //-----------------------------------------------------------------------
997        public void testFormatParse_textHalfdayAM_UK() {
998            DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder()
999                .appendLiteral('$')
1000                .appendClockhourOfHalfday(2)
1001                .appendLiteral('-')
1002                .appendHalfdayOfDayText()
1003                .appendLiteral('-')
1004                .appendYear(4, 4)
1005                .toFormatter()
1006                .withLocale(Locale.UK).withZoneUTC();
1007            
1008            String str = new DateTime(2007, 6, 23, 18, 0, 0, 0, UTC).toString(dateFormatter);
1009            assertEquals("$06-PM-2007", str);
1010            DateTime date = dateFormatter.parseDateTime(str);
1011            check(date, 2007, 1, 1);
1012        }
1013    
1014        public void testFormatParse_textHalfdayAM_France() {
1015            DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder()
1016                .appendLiteral('$')
1017                .appendClockhourOfHalfday(2)
1018                .appendLiteral('-')
1019                .appendHalfdayOfDayText()
1020                .appendLiteral('-')
1021                .appendYear(4, 4)
1022                .toFormatter()
1023                .withLocale(Locale.FRANCE).withZoneUTC();
1024            
1025            String str = new DateTime(2007, 6, 23, 18, 0, 0, 0, UTC).toString(dateFormatter);
1026            assertEquals("$06-PM-2007", str);
1027            DateTime date = dateFormatter.parseDateTime(str);
1028            check(date, 2007, 1, 1);
1029        }
1030    
1031        //-----------------------------------------------------------------------
1032        public void testFormatParse_textEraAD_UK() {
1033            DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder()
1034                .appendLiteral('$')
1035                .appendEraText()
1036                .appendYear(4, 4)
1037                .toFormatter()
1038                .withLocale(Locale.UK).withZoneUTC();
1039            
1040            String str = new DateTime(2007, 6, 23, 0, 0, 0, 0, UTC).toString(dateFormatter);
1041            assertEquals("$AD2007", str);
1042            DateTime date = dateFormatter.parseDateTime(str);
1043            check(date, 2007, 1, 1);
1044        }
1045    
1046        public void testFormatParse_textEraAD_France() {
1047            DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder()
1048                .appendLiteral('$')
1049                .appendEraText()
1050                .appendYear(4, 4)
1051                .toFormatter()
1052                .withLocale(Locale.FRANCE).withZoneUTC();
1053            
1054            String str = new DateTime(2007, 6, 23, 0, 0, 0, 0, UTC).toString(dateFormatter);
1055            assertEquals("$ap. J.-C.2007", str);
1056            DateTime date = dateFormatter.parseDateTime(str);
1057            check(date, 2007, 1, 1);
1058        }
1059    
1060        public void testFormatParse_textEraBC_France() {
1061            DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder()
1062                .appendLiteral('$')
1063                .appendEraText()
1064                .appendYear(4, 4)
1065                .toFormatter()
1066                .withLocale(Locale.FRANCE).withZoneUTC();
1067            
1068            String str = new DateTime(-1, 6, 23, 0, 0, 0, 0, UTC).toString(dateFormatter);
1069            assertEquals("$BC-0001", str);
1070            DateTime date = dateFormatter.parseDateTime(str);
1071            check(date, -1, 1, 1);
1072        }
1073    
1074        //-----------------------------------------------------------------------
1075        public void testFormatParse_textYear_UK() {
1076            DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder()
1077                .appendLiteral('$')
1078                .appendText(DateTimeFieldType.year())
1079                .toFormatter()
1080                .withLocale(Locale.UK).withZoneUTC();
1081            
1082            String str = new DateTime(2007, 6, 23, 0, 0, 0, 0, UTC).toString(dateFormatter);
1083            assertEquals("$2007", str);
1084            try {
1085                dateFormatter.parseDateTime(str);
1086                fail();
1087            } catch (IllegalArgumentException ex) {
1088                // expected
1089            }
1090        }
1091    
1092        public void testFormatParse_textYear_France() {
1093            DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder()
1094                .appendLiteral('$')
1095                .appendText(DateTimeFieldType.year())
1096                .toFormatter()
1097                .withLocale(Locale.FRANCE).withZoneUTC();
1098            
1099            String str = new DateTime(2007, 6, 23, 0, 0, 0, 0, UTC).toString(dateFormatter);
1100            assertEquals("$2007", str);
1101            try {
1102                dateFormatter.parseDateTime(str);
1103                fail();
1104            } catch (IllegalArgumentException ex) {
1105                // expected
1106            }
1107        }
1108    
1109        //-----------------------------------------------------------------------
1110        public void testFormatParse_textAdjoiningHelloWorld_UK() {
1111            DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder()
1112                .appendLiteral('$')
1113                .appendDayOfMonth(2)
1114                .appendMonthOfYearShortText()
1115                .appendLiteral("HelloWorld")
1116                .toFormatter()
1117                .withLocale(Locale.UK).withZoneUTC();
1118            
1119            String str = new DateTime(2007, 6, 23, 0, 0, 0, 0, UTC).toString(dateFormatter);
1120            assertEquals("$23JunHelloWorld", str);
1121            dateFormatter.parseDateTime(str);
1122        }
1123    
1124        public void testFormatParse_textAdjoiningMonthDOW_UK() {
1125            DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder()
1126                .appendLiteral('$')
1127                .appendDayOfMonth(2)
1128                .appendMonthOfYearShortText()
1129                .appendDayOfWeekShortText()
1130                .toFormatter()
1131                .withLocale(Locale.UK).withZoneUTC();
1132            
1133            String str = new DateTime(2007, 6, 23, 0, 0, 0, 0, UTC).toString(dateFormatter);
1134            assertEquals("$23JunSat", str);
1135            dateFormatter.parseDateTime(str);
1136        }
1137    
1138        //-----------------------------------------------------------------------
1139        public void testFormatParse_zoneId_noColon() {
1140            DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("HH:mm Z").withZoneUTC();
1141            String str = new DateTime(2007, 6, 23, 1, 2, 0, 0, UTC).toString(dateFormatter);
1142            assertEquals("01:02 +0000", str);
1143            DateTime parsed = dateFormatter.parseDateTime(str);
1144            assertEquals(1, parsed.getHourOfDay());
1145            assertEquals(2, parsed.getMinuteOfHour());
1146        }
1147    
1148        public void testFormatParse_zoneId_noColon_parseZ() {
1149            DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("HH:mm Z").withZoneUTC();
1150            DateTime parsed = dateFormatter.parseDateTime("01:02 Z");
1151            assertEquals(1, parsed.getHourOfDay());
1152            assertEquals(2, parsed.getMinuteOfHour());
1153        }
1154    
1155        public void testFormatParse_zoneId_colon() {
1156            DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("HH:mm ZZ").withZoneUTC();
1157            String str = new DateTime(2007, 6, 23, 1, 2, 0, 0, UTC).toString(dateFormatter);
1158            assertEquals("01:02 +00:00", str);
1159            DateTime parsed = dateFormatter.parseDateTime(str);
1160            assertEquals(1, parsed.getHourOfDay());
1161            assertEquals(2, parsed.getMinuteOfHour());
1162        }
1163    
1164        public void testFormatParse_zoneId_colon_parseZ() {
1165            DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("HH:mm ZZ").withZoneUTC();
1166            DateTime parsed = dateFormatter.parseDateTime("01:02 Z");
1167            assertEquals(1, parsed.getHourOfDay());
1168            assertEquals(2, parsed.getMinuteOfHour());
1169        }
1170    
1171        //-----------------------------------------------------------------------
1172        private void check(DateTime test, int hour, int min, int sec) {
1173            assertEquals(hour, test.getYear());
1174            assertEquals(min, test.getMonthOfYear());
1175            assertEquals(sec, test.getDayOfMonth());
1176        }
1177    
1178    }