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.util.LinkedHashMap;
019    import java.util.Locale;
020    import java.util.Map;
021    
022    import junit.framework.TestCase;
023    import junit.framework.TestSuite;
024    
025    import org.joda.time.DateTime;
026    import org.joda.time.DateTimeFieldType;
027    import org.joda.time.DateTimeZone;
028    import org.joda.time.LocalDateTime;
029    
030    /**
031     * This class is a Junit unit test for DateTimeFormatterBuilder.
032     *
033     * @author Stephen Colebourne
034     * @author Brian S O'Neill
035     */
036    public class TestDateTimeFormatterBuilder extends TestCase {
037    
038        private static final DateTimeZone LONDON = DateTimeZone.forID("Europe/London");
039        private static final DateTimeZone PARIS = DateTimeZone.forID("Europe/Paris");
040        private static final DateTimeZone TOKYO = DateTimeZone.forID("Asia/Tokyo");
041        private static final DateTimeZone NEW_YORK = DateTimeZone.forID("America/New_York");
042        private static final DateTimeZone LOS_ANGELES = DateTimeZone.forID("America/Los_Angeles");
043    
044        public static void main(String[] args) {
045            junit.textui.TestRunner.run(suite());
046        }
047    
048        public static TestSuite suite() {
049            return new TestSuite(TestDateTimeFormatterBuilder.class);
050        }
051    
052        public TestDateTimeFormatterBuilder(String name) {
053            super(name);
054        }
055    
056        protected void setUp() throws Exception {
057        }
058    
059        protected void tearDown() throws Exception {
060        }
061    
062        //-----------------------------------------------------------------------
063        public void test_toFormatter() {
064            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder();
065            try {
066                bld.toFormatter();
067                fail();
068            } catch (UnsupportedOperationException ex) {}
069            bld.appendLiteral('X');
070            assertNotNull(bld.toFormatter());
071        }
072    
073        public void test_toPrinter() {
074            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder();
075            try {
076                bld.toPrinter();
077                fail();
078            } catch (UnsupportedOperationException ex) {}
079            bld.appendLiteral('X');
080            assertNotNull(bld.toPrinter());
081        }
082    
083        public void test_toParser() {
084            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder();
085            try {
086                bld.toParser();
087                fail();
088            } catch (UnsupportedOperationException ex) {}
089            bld.appendLiteral('X');
090            assertNotNull(bld.toParser());
091        }
092    
093        //-----------------------------------------------------------------------
094        public void test_canBuildFormatter() {
095            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder();
096            assertEquals(false, bld.canBuildFormatter());
097            bld.appendLiteral('X');
098            assertEquals(true, bld.canBuildFormatter());
099        }
100    
101        public void test_canBuildPrinter() {
102            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder();
103            assertEquals(false, bld.canBuildPrinter());
104            bld.appendLiteral('X');
105            assertEquals(true, bld.canBuildPrinter());
106        }
107    
108        public void test_canBuildParser() {
109            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder();
110            assertEquals(false, bld.canBuildParser());
111            bld.appendLiteral('X');
112            assertEquals(true, bld.canBuildParser());
113        }
114    
115        //-----------------------------------------------------------------------
116        public void test_append_Formatter() {
117            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder();
118            bld.appendLiteral('Y');
119            DateTimeFormatter f = bld.toFormatter();
120            
121            DateTimeFormatterBuilder bld2 = new DateTimeFormatterBuilder();
122            bld2.appendLiteral('X');
123            bld2.append(f);
124            bld2.appendLiteral('Z');
125            assertEquals("XYZ", bld2.toFormatter().print(0L));
126        }
127    
128        //-----------------------------------------------------------------------
129        public void test_append_Printer() {
130            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder();
131            bld.appendLiteral('Y');
132            DateTimePrinter p = bld.toPrinter();
133            
134            DateTimeFormatterBuilder bld2 = new DateTimeFormatterBuilder();
135            bld2.appendLiteral('X');
136            bld2.append(p);
137            bld2.appendLiteral('Z');
138            DateTimeFormatter f = bld2.toFormatter();
139            assertEquals(true, f.isPrinter());
140            assertEquals(false, f.isParser());
141            assertEquals("XYZ", f.print(0L));
142        }
143    
144        public void test_append_nullPrinter() {
145            try {
146                DateTimeFormatterBuilder bld2 = new DateTimeFormatterBuilder();
147                bld2.append((DateTimePrinter) null);
148                fail();
149            } catch (IllegalArgumentException ex) {
150                // expected
151            }
152        }
153    
154        //-----------------------------------------------------------------------
155        public void test_append_Parser() {
156            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder();
157            bld.appendLiteral('Y');
158            DateTimeParser p = bld.toParser();
159            
160            DateTimeFormatterBuilder bld2 = new DateTimeFormatterBuilder();
161            bld2.appendLiteral('X');
162            bld2.append(p);
163            bld2.appendLiteral('Z');
164            DateTimeFormatter f = bld2.toFormatter();
165            assertEquals(false, f.isPrinter());
166            assertEquals(true, f.isParser());
167            assertEquals(0, f.withZoneUTC().parseMillis("XYZ"));
168        }
169    
170        public void test_append_nullParser() {
171            try {
172                DateTimeFormatterBuilder bld2 = new DateTimeFormatterBuilder();
173                bld2.append((DateTimeParser) null);
174                fail();
175            } catch (IllegalArgumentException ex) {
176                // expected
177            }
178        }
179    
180        //-----------------------------------------------------------------------
181        public void test_append_Printer_nullParser() {
182            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder();
183            bld.appendLiteral('Y');
184            DateTimePrinter p = bld.toPrinter();
185            
186            try {
187                DateTimeFormatterBuilder bld2 = new DateTimeFormatterBuilder();
188                bld2.append(p, (DateTimeParser) null);
189                fail();
190            } catch (IllegalArgumentException ex) {
191                // expected
192            }
193        }
194    
195        public void test_append_nullPrinter_Parser() {
196            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder();
197            bld.appendLiteral('Y');
198            DateTimeParser p = bld.toParser();
199            
200            try {
201                DateTimeFormatterBuilder bld2 = new DateTimeFormatterBuilder();
202                bld2.append((DateTimePrinter) null, p);
203                fail();
204            } catch (IllegalArgumentException ex) {
205                // expected
206            }
207        }
208    
209        //-----------------------------------------------------------------------
210        public void test_appendOptional_Parser() {
211            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder();
212            bld.appendLiteral('Y');
213            DateTimeParser p = bld.toParser();
214            
215            DateTimeFormatterBuilder bld2 = new DateTimeFormatterBuilder();
216            bld2.appendLiteral('X');
217            bld2.appendOptional(p);
218            bld2.appendLiteral('Z');
219            DateTimeFormatter f = bld2.toFormatter();
220            assertEquals(false, f.isPrinter());
221            assertEquals(true, f.isParser());
222            assertEquals(0, f.withZoneUTC().parseMillis("XYZ"));
223        }
224    
225        public void test_appendOptional_nullParser() {
226            try {
227                DateTimeFormatterBuilder bld2 = new DateTimeFormatterBuilder();
228                bld2.appendOptional((DateTimeParser) null);
229                fail();
230            } catch (IllegalArgumentException ex) {
231                // expected
232            }
233        }
234    
235        //-----------------------------------------------------------------------
236        public void test_appendFixedDecimal() {
237            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder();
238            bld.appendFixedDecimal(DateTimeFieldType.year(), 4);
239            DateTimeFormatter f = bld.toFormatter();
240    
241            assertEquals("2007", f.print(new DateTime("2007-01-01")));
242            assertEquals("0123", f.print(new DateTime("123-01-01")));
243            assertEquals("0001", f.print(new DateTime("1-2-3")));
244            assertEquals("99999", f.print(new DateTime("99999-2-3")));
245            assertEquals("-0099", f.print(new DateTime("-99-2-3")));
246            assertEquals("0000", f.print(new DateTime("0-2-3")));
247    
248            assertEquals(2001, f.parseDateTime("2001").getYear());
249            try {
250                f.parseDateTime("-2001");
251                fail();
252            } catch (IllegalArgumentException e) {
253            }
254            try {
255                f.parseDateTime("200");
256                fail();
257            } catch (IllegalArgumentException e) {
258            }
259            try {
260                f.parseDateTime("20016");
261                fail();
262            } catch (IllegalArgumentException e) {
263            }
264    
265            bld = new DateTimeFormatterBuilder();
266            bld.appendFixedDecimal(DateTimeFieldType.hourOfDay(), 2);
267            bld.appendLiteral(':');
268            bld.appendFixedDecimal(DateTimeFieldType.minuteOfHour(), 2);
269            bld.appendLiteral(':');
270            bld.appendFixedDecimal(DateTimeFieldType.secondOfMinute(), 2);
271            f = bld.toFormatter();
272    
273            assertEquals("01:02:34", f.print(new DateTime("T1:2:34")));
274    
275            DateTime dt = f.parseDateTime("01:02:34");
276            assertEquals(1, dt.getHourOfDay());
277            assertEquals(2, dt.getMinuteOfHour());
278            assertEquals(34, dt.getSecondOfMinute());
279    
280            try {
281                f.parseDateTime("0145:02:34");
282                fail();
283            } catch (IllegalArgumentException e) {
284            }
285            try {
286                f.parseDateTime("01:0:34");
287                fail();
288            } catch (IllegalArgumentException e) {
289            }
290        }
291    
292        //-----------------------------------------------------------------------
293        public void test_appendFixedSignedDecimal() {
294            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder();
295            bld.appendFixedSignedDecimal(DateTimeFieldType.year(), 4);
296            DateTimeFormatter f = bld.toFormatter();
297    
298            assertEquals("2007", f.print(new DateTime("2007-01-01")));
299            assertEquals("0123", f.print(new DateTime("123-01-01")));
300            assertEquals("0001", f.print(new DateTime("1-2-3")));
301            assertEquals("99999", f.print(new DateTime("99999-2-3")));
302            assertEquals("-0099", f.print(new DateTime("-99-2-3")));
303            assertEquals("0000", f.print(new DateTime("0-2-3")));
304    
305            assertEquals(2001, f.parseDateTime("2001").getYear());
306            assertEquals(-2001, f.parseDateTime("-2001").getYear());
307            assertEquals(2001, f.parseDateTime("+2001").getYear());
308            try {
309                f.parseDateTime("20016");
310                fail();
311            } catch (IllegalArgumentException e) {
312            }
313        }
314    
315        //-----------------------------------------------------------------------
316        public void test_appendTimeZoneId() {
317            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder();
318            bld.appendTimeZoneId();
319            DateTimeFormatter f = bld.toFormatter();
320            
321            assertEquals("Asia/Tokyo", f.print(new DateTime(2007, 3, 4, 0, 0, 0, TOKYO)));
322            assertEquals(TOKYO, f.parseDateTime("Asia/Tokyo").getZone());
323            try {
324                f.parseDateTime("Nonsense");
325                fail();
326            } catch (IllegalArgumentException e) {
327            }
328        }
329    
330        public void test_printParseZoneTokyo() {
331            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder()
332                .appendPattern("yyyy-MM-dd HH:mm ").appendTimeZoneId();
333            DateTimeFormatter f = bld.toFormatter();
334            
335            DateTime dt = new DateTime(2007, 3, 4, 12, 30, 0, TOKYO);
336            assertEquals("2007-03-04 12:30 Asia/Tokyo", f.print(dt));
337            assertEquals(dt, f.parseDateTime("2007-03-04 12:30 Asia/Tokyo"));
338        }
339    
340        public void test_printParseZoneParis() {
341            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder()
342                .appendPattern("yyyy-MM-dd HH:mm ").appendTimeZoneId();
343            DateTimeFormatter f = bld.toFormatter();
344            
345            DateTime dt = new DateTime(2007, 3, 4, 12, 30, 0, PARIS);
346            assertEquals("2007-03-04 12:30 Europe/Paris", f.print(dt));
347            assertEquals(dt, f.parseDateTime("2007-03-04 12:30 Europe/Paris"));
348            assertEquals(dt, f.withOffsetParsed().parseDateTime("2007-03-04 12:30 Europe/Paris"));
349        }
350    
351        public void test_printParseZoneDawsonCreek() {  // clashes with shorter Dawson
352            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder()
353                .appendPattern("yyyy-MM-dd HH:mm ").appendTimeZoneId();
354            DateTimeFormatter f = bld.toFormatter();
355            
356            DateTime dt = new DateTime(2007, 3, 4, 12, 30, 0, DateTimeZone.forID("America/Dawson_Creek"));
357            assertEquals("2007-03-04 12:30 America/Dawson_Creek", f.print(dt));
358            assertEquals(dt, f.parseDateTime("2007-03-04 12:30 America/Dawson_Creek"));
359        }
360    
361        public void test_printParseZoneBahiaBanderas() {
362            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder()
363                .appendPattern("yyyy-MM-dd HH:mm ").appendTimeZoneId();
364            DateTimeFormatter f = bld.toFormatter();
365            
366            DateTime dt = new DateTime(2007, 3, 4, 12, 30, 0, DateTimeZone.forID("America/Bahia_Banderas"));
367            assertEquals("2007-03-04 12:30 America/Bahia_Banderas", f.print(dt));
368            assertEquals(dt, f.parseDateTime("2007-03-04 12:30 America/Bahia_Banderas"));
369        }
370    
371        public void test_printParseOffset() {
372            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder()
373                .appendPattern("yyyy-MM-dd HH:mm ").appendTimeZoneOffset("Z", true, 2, 2);
374            DateTimeFormatter f = bld.toFormatter();
375            
376            DateTime dt = new DateTime(2007, 3, 4, 12, 30, 0, TOKYO);
377            assertEquals("2007-03-04 12:30 +09:00", f.print(dt));
378            assertEquals(dt.withZone(DateTimeZone.getDefault()), f.parseDateTime("2007-03-04 12:30 +09:00"));
379            assertEquals(dt, f.withZone(TOKYO).parseDateTime("2007-03-04 12:30 +09:00"));
380            assertEquals(dt.withZone(DateTimeZone.forOffsetHours(9)), f.withOffsetParsed().parseDateTime("2007-03-04 12:30 +09:00"));
381        }
382    
383        public void test_printParseOffsetAndZone() {
384            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder()
385                .appendPattern("yyyy-MM-dd HH:mm ").appendTimeZoneOffset("Z", true, 2, 2).appendLiteral(' ').appendTimeZoneId();
386            DateTimeFormatter f = bld.toFormatter();
387            
388            DateTime dt = new DateTime(2007, 3, 4, 12, 30, 0, TOKYO);
389            assertEquals("2007-03-04 12:30 +09:00 Asia/Tokyo", f.print(dt));
390            assertEquals(dt, f.withZone(TOKYO).parseDateTime("2007-03-04 12:30 +09:00 Asia/Tokyo"));
391            assertEquals(dt.withZone(PARIS), f.withZone(PARIS).parseDateTime("2007-03-04 12:30 +09:00 Asia/Tokyo"));
392            assertEquals(dt.withZone(DateTimeZone.forOffsetHours(9)), f.withOffsetParsed().parseDateTime("2007-03-04 12:30 +09:00 Asia/Tokyo"));
393        }
394    
395        public void test_parseWrongOffset() {
396            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder()
397                .appendPattern("yyyy-MM-dd HH:mm ").appendTimeZoneOffset("Z", true, 2, 2);
398            DateTimeFormatter f = bld.toFormatter();
399            
400            DateTime expected = new DateTime(2007, 3, 4, 12, 30, 0, DateTimeZone.forOffsetHours(7));
401            // parses offset time then adjusts to requested zone
402            assertEquals(expected.withZone(TOKYO), f.withZone(TOKYO).parseDateTime("2007-03-04 12:30 +07:00"));
403            // parses offset time returning offset zone
404            assertEquals(expected, f.withOffsetParsed().parseDateTime("2007-03-04 12:30 +07:00"));
405            // parses offset time then converts to default zone
406            assertEquals(expected.withZone(DateTimeZone.getDefault()), f.parseDateTime("2007-03-04 12:30 +07:00"));
407        }
408    
409        public void test_parseWrongOffsetAndZone() {
410            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder()
411                .appendPattern("yyyy-MM-dd HH:mm ").appendTimeZoneOffset("Z", true, 2, 2).appendLiteral(' ').appendTimeZoneId();
412            DateTimeFormatter f = bld.toFormatter();
413            
414            DateTime expected = new DateTime(2007, 3, 4, 12, 30, 0, DateTimeZone.forOffsetHours(7));
415            // parses offset time then adjusts to parsed zone
416            assertEquals(expected.withZone(TOKYO), f.parseDateTime("2007-03-04 12:30 +07:00 Asia/Tokyo"));
417            // parses offset time then adjusts to requested zone
418            assertEquals(expected.withZone(TOKYO), f.withZone(TOKYO).parseDateTime("2007-03-04 12:30 +07:00 Asia/Tokyo"));
419            // parses offset time returning offset zone (ignores zone)
420            assertEquals(expected, f.withOffsetParsed().parseDateTime("2007-03-04 12:30 +07:00 Asia/Tokyo"));
421        }
422    
423        //-----------------------------------------------------------------------
424        public void test_localPrintParseZoneTokyo() {
425            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder()
426                .appendPattern("yyyy-MM-dd HH:mm ").appendTimeZoneId();
427            DateTimeFormatter f = bld.toFormatter();
428            
429            DateTime dt = new DateTime(2007, 3, 4, 12, 30, 0, TOKYO);
430            assertEquals("2007-03-04 12:30 Asia/Tokyo", f.print(dt));
431            
432            LocalDateTime expected = new LocalDateTime(2007, 3, 4, 12, 30);
433            assertEquals(expected, f.parseLocalDateTime("2007-03-04 12:30 Asia/Tokyo"));
434        }
435    
436        public void test_localPrintParseOffset() {
437            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder()
438                .appendPattern("yyyy-MM-dd HH:mm ").appendTimeZoneOffset("Z", true, 2, 2);
439            DateTimeFormatter f = bld.toFormatter();
440            
441            DateTime dt = new DateTime(2007, 3, 4, 12, 30, 0, TOKYO);
442            assertEquals("2007-03-04 12:30 +09:00", f.print(dt));
443            
444            LocalDateTime expected = new LocalDateTime(2007, 3, 4, 12, 30);
445            assertEquals(expected, f.parseLocalDateTime("2007-03-04 12:30 +09:00"));
446            assertEquals(expected, f.withZone(TOKYO).parseLocalDateTime("2007-03-04 12:30 +09:00"));
447            assertEquals(expected, f.withOffsetParsed().parseLocalDateTime("2007-03-04 12:30 +09:00"));
448        }
449    
450        public void test_localPrintParseOffsetAndZone() {
451            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder()
452                .appendPattern("yyyy-MM-dd HH:mm ").appendTimeZoneOffset("Z", true, 2, 2).appendLiteral(' ').appendTimeZoneId();
453            DateTimeFormatter f = bld.toFormatter();
454            
455            DateTime dt = new DateTime(2007, 3, 4, 12, 30, 0, TOKYO);
456            assertEquals("2007-03-04 12:30 +09:00 Asia/Tokyo", f.print(dt));
457            
458            LocalDateTime expected = new LocalDateTime(2007, 3, 4, 12, 30);
459            assertEquals(expected, f.withZone(TOKYO).parseLocalDateTime("2007-03-04 12:30 +09:00 Asia/Tokyo"));
460            assertEquals(expected, f.withZone(PARIS).parseLocalDateTime("2007-03-04 12:30 +09:00 Asia/Tokyo"));
461        }
462    
463        public void test_localParseWrongOffsetAndZone() {
464            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder()
465                .appendPattern("yyyy-MM-dd HH:mm ").appendTimeZoneOffset("Z", true, 2, 2).appendLiteral(' ').appendTimeZoneId();
466            DateTimeFormatter f = bld.toFormatter();
467            
468            LocalDateTime expected = new LocalDateTime(2007, 3, 4, 12, 30);
469            // parses offset time then adjusts to parsed zone
470            assertEquals(expected, f.parseLocalDateTime("2007-03-04 12:30 +07:00 Asia/Tokyo"));
471            // parses offset time then adjusts to requested zone
472            assertEquals(expected, f.withZone(TOKYO).parseLocalDateTime("2007-03-04 12:30 +07:00 Asia/Tokyo"));
473            // parses offset time returning offset zone (ignores zone)
474            assertEquals(expected, f.withOffsetParsed().parseLocalDateTime("2007-03-04 12:30 +07:00 Asia/Tokyo"));
475        }
476    
477        //-----------------------------------------------------------------------
478        public void test_printParseShortName() {
479            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder()
480                .appendPattern("yyyy-MM-dd HH:mm ").appendTimeZoneShortName();
481            DateTimeFormatter f = bld.toFormatter().withLocale(Locale.ENGLISH);
482            
483            assertEquals(true, f.isPrinter());
484            assertEquals(false, f.isParser());
485            DateTime dt1 = new DateTime(2011, 1, 4, 12, 30, 0, LONDON);
486            assertEquals("2011-01-04 12:30 GMT", f.print(dt1));
487            DateTime dt2 = new DateTime(2011, 7, 4, 12, 30, 0, LONDON);
488            assertEquals("2011-07-04 12:30 BST", f.print(dt2));
489            try {
490                f.parseDateTime("2007-03-04 12:30 GMT");
491                fail();
492            } catch (UnsupportedOperationException e) {
493            }
494        }
495    
496        public void test_printParseShortNameWithLookup() {
497            Map<String, DateTimeZone> lookup = new LinkedHashMap<String, DateTimeZone>();
498            lookup.put("GMT", LONDON);
499            lookup.put("BST", LONDON);
500            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder()
501                .appendPattern("yyyy-MM-dd HH:mm ").appendTimeZoneShortName(lookup);
502            DateTimeFormatter f = bld.toFormatter().withLocale(Locale.ENGLISH);
503            
504            assertEquals(true, f.isPrinter());
505            assertEquals(true, f.isParser());
506            DateTime dt1 = new DateTime(2011, 1, 4, 12, 30, 0, LONDON);
507            assertEquals("2011-01-04 12:30 GMT", f.print(dt1));
508            DateTime dt2 = new DateTime(2011, 7, 4, 12, 30, 0, LONDON);
509            assertEquals("2011-07-04 12:30 BST", f.print(dt2));
510            
511            assertEquals(dt1, f.parseDateTime("2011-01-04 12:30 GMT"));
512            assertEquals(dt2, f.parseDateTime("2011-07-04 12:30 BST"));
513            try {
514                f.parseDateTime("2007-03-04 12:30 EST");
515                fail();
516            } catch (IllegalArgumentException e) {
517            }
518        }
519    
520        public void test_printParseShortNameWithAutoLookup() {
521            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder()
522                .appendPattern("yyyy-MM-dd HH:mm ").appendTimeZoneShortName(null);
523            DateTimeFormatter f = bld.toFormatter().withLocale(Locale.ENGLISH);
524            
525            assertEquals(true, f.isPrinter());
526            assertEquals(true, f.isParser());
527            DateTime dt1 = new DateTime(2011, 1, 4, 12, 30, 0, NEW_YORK);
528            assertEquals("2011-01-04 12:30 EST", f.print(dt1));
529            DateTime dt2 = new DateTime(2011, 7, 4, 12, 30, 0, NEW_YORK);
530            assertEquals("2011-07-04 12:30 EDT", f.print(dt2));
531            DateTime dt3 = new DateTime(2011, 1, 4, 12, 30, 0, LOS_ANGELES);
532            assertEquals("2011-01-04 12:30 PST", f.print(dt3));
533            DateTime dt4 = new DateTime(2011, 7, 4, 12, 30, 0, LOS_ANGELES);
534            assertEquals("2011-07-04 12:30 PDT", f.print(dt4));
535            
536            assertEquals(dt1.getZone() + " " + f.parseDateTime("2011-01-04 12:30 EST").getZone(), dt1, f.parseDateTime("2011-01-04 12:30 EST"));
537            assertEquals(dt2, f.parseDateTime("2011-07-04 12:30 EDT"));
538            assertEquals(dt3, f.parseDateTime("2011-01-04 12:30 PST"));
539            assertEquals(dt4, f.parseDateTime("2011-07-04 12:30 PDT"));
540            try {
541                f.parseDateTime("2007-03-04 12:30 PPP");
542                fail();
543            } catch (IllegalArgumentException e) {
544            }
545        }
546    
547        //-----------------------------------------------------------------------
548        public void test_printParseLongName() {
549            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder()
550                .appendPattern("yyyy-MM-dd HH:mm ").appendTimeZoneName();
551            DateTimeFormatter f = bld.toFormatter().withLocale(Locale.ENGLISH);
552            
553            assertEquals(true, f.isPrinter());
554            assertEquals(false, f.isParser());
555            DateTime dt1 = new DateTime(2011, 1, 4, 12, 30, 0, LONDON);
556            assertEquals("2011-01-04 12:30 Greenwich Mean Time", f.print(dt1));
557            DateTime dt2 = new DateTime(2011, 7, 4, 12, 30, 0, LONDON);
558            assertEquals("2011-07-04 12:30 British Summer Time", f.print(dt2));
559            try {
560                f.parseDateTime("2007-03-04 12:30 GMT");
561                fail();
562            } catch (UnsupportedOperationException e) {
563            }
564        }
565    
566        public void test_printParseLongNameWithLookup() {
567            Map<String, DateTimeZone> lookup = new LinkedHashMap<String, DateTimeZone>();
568            lookup.put("Greenwich Mean Time", LONDON);
569            lookup.put("British Summer Time", LONDON);
570            DateTimeFormatterBuilder bld = new DateTimeFormatterBuilder()
571                .appendPattern("yyyy-MM-dd HH:mm ").appendTimeZoneName(lookup);
572            DateTimeFormatter f = bld.toFormatter().withLocale(Locale.ENGLISH);
573            
574            assertEquals(true, f.isPrinter());
575            assertEquals(true, f.isParser());
576            DateTime dt1 = new DateTime(2011, 1, 4, 12, 30, 0, LONDON);
577            assertEquals("2011-01-04 12:30 Greenwich Mean Time", f.print(dt1));
578            DateTime dt2 = new DateTime(2011, 7, 4, 12, 30, 0, LONDON);
579            assertEquals("2011-07-04 12:30 British Summer Time", f.print(dt2));
580            
581            assertEquals(dt1, f.parseDateTime("2011-01-04 12:30 Greenwich Mean Time"));
582            assertEquals(dt2, f.parseDateTime("2011-07-04 12:30 British Summer Time"));
583            try {
584                f.parseDateTime("2007-03-04 12:30 EST");
585                fail();
586            } catch (IllegalArgumentException e) {
587            }
588        }
589    
590    }