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.DateTime;
025    import org.joda.time.DateTimeZone;
026    
027    /**
028     * This class is a Junit unit test for ISODateTimeFormat parsing.
029     *
030     * @author Stephen Colebourne
031     */
032    public class TestISODateTimeFormatParsing extends TestCase {
033    
034        private DateTimeZone originalDateTimeZone = null;
035        private TimeZone originalTimeZone = null;
036        private Locale originalLocale = null;
037    
038        public static void main(String[] args) {
039            junit.textui.TestRunner.run(suite());
040        }
041    
042        public static TestSuite suite() {
043            return new TestSuite(TestISODateTimeFormatParsing.class);
044        }
045    
046        public TestISODateTimeFormatParsing(String name) {
047            super(name);
048        }
049    
050        protected void setUp() throws Exception {
051            originalDateTimeZone = DateTimeZone.getDefault();
052            originalTimeZone = TimeZone.getDefault();
053            originalLocale = Locale.getDefault();
054            DateTimeZone.setDefault(DateTimeZone.forID("Europe/London"));
055            TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
056            Locale.setDefault(Locale.UK);
057        }
058    
059        protected void tearDown() throws Exception {
060            DateTimeZone.setDefault(originalDateTimeZone);
061            TimeZone.setDefault(originalTimeZone);
062            Locale.setDefault(originalLocale);
063            originalDateTimeZone = null;
064            originalTimeZone = null;
065            originalLocale = null;
066        }
067    
068        //-----------------------------------------------------------------------
069        public void test_dateParser() {
070            DateTimeFormatter parser = ISODateTimeFormat.dateParser();
071            assertParse(parser, true, "2006-06-09");
072            assertParse(parser, true, "2006-W27-3");
073            assertParse(parser, true, "2006-123");
074            assertParse(parser, true, "2006-06-09T+02:00");
075            assertParse(parser, true, "2006-W27-3T+02:00");
076            assertParse(parser, true, "2006-123T+02:00");
077            
078            assertParse(parser, false, "2006-06-09T10:20:30.040");
079            assertParse(parser, false, "2006-W27-3T10:20:30.040");
080            assertParse(parser, false, "2006-123T10:20:30.040");
081            assertParse(parser, false, "2006-06-09T10:20:30.040+02:00");
082            assertParse(parser, false, "2006-W27-3T10:20:30.040+02:00");
083            assertParse(parser, false, "2006-123T10:20:30.040+02:00");
084            
085            assertParse(parser, false, "T10:20:30.040");
086            assertParse(parser, false, "T10.5");
087            assertParse(parser, false, "T10:20:30.040+02:00");
088            assertParse(parser, false, "T10.5+02:00");
089            
090            assertParse(parser, false, "10:20:30.040");
091            assertParse(parser, false, "10.5");
092            assertParse(parser, false, "10:20:30.040+02:00");
093            assertParse(parser, false, "10.5+02:00");
094        }
095    
096        //-----------------------------------------------------------------------
097        public void test_localDateParser() {
098            DateTimeFormatter parser = ISODateTimeFormat.localDateParser();
099            assertEquals(DateTimeZone.UTC, parser.getZone());
100            assertParse(parser, true, "2006-06-09");
101            assertParse(parser, true, "2006-W27-3");
102            assertParse(parser, true, "2006-123");
103            assertParse(parser, false, "2006-06-09T+02:00");
104            assertParse(parser, false, "2006-W27-3T+02:00");
105            assertParse(parser, false, "2006-123T+02:00");
106            
107            assertParse(parser, false, "2006-06-09T10:20:30.040");
108            assertParse(parser, false, "2006-W27-3T10:20:30.040");
109            assertParse(parser, false, "2006-123T10:20:30.040");
110            assertParse(parser, false, "2006-06-09T10:20:30.040+02:00");
111            assertParse(parser, false, "2006-W27-3T10:20:30.040+02:00");
112            assertParse(parser, false, "2006-123T10:20:30.040+02:00");
113            
114            assertParse(parser, false, "T10:20:30.040");
115            assertParse(parser, false, "T10.5");
116            assertParse(parser, false, "T10:20:30.040+02:00");
117            assertParse(parser, false, "T10.5+02:00");
118            
119            assertParse(parser, false, "10:20:30.040");
120            assertParse(parser, false, "10.5");
121            assertParse(parser, false, "10:20:30.040+02:00");
122            assertParse(parser, false, "10.5+02:00");
123        }
124    
125        //-----------------------------------------------------------------------
126        public void test_dateElementParser() {
127            DateTimeFormatter parser = ISODateTimeFormat.dateElementParser();
128            assertParse(parser, "2006-06-09", new DateTime(2006, 6, 9, 0, 0, 0, 0));
129            assertParse(parser, "2006-06-9", new DateTime(2006, 6, 9, 0, 0, 0, 0));
130            assertParse(parser, "2006-6-09", new DateTime(2006, 6, 9, 0, 0, 0, 0));
131            assertParse(parser, "2006-6-9", new DateTime(2006, 6, 9, 0, 0, 0, 0));
132            assertParse(parser, true, "2006-W27-3");
133            assertParse(parser, true, "2006-123");
134            assertParse(parser, false, "2006-06-09T+02:00");
135            assertParse(parser, false, "2006-W27-3T+02:00");
136            assertParse(parser, false, "2006-123T+02:00");
137            
138            assertParse(parser, false, "2006-06-09T10:20:30.040");
139            assertParse(parser, false, "2006-W27-3T10:20:30.040");
140            assertParse(parser, false, "2006-123T10:20:30.040");
141            assertParse(parser, false, "2006-06-09T10:20:30.040+02:00");
142            assertParse(parser, false, "2006-W27-3T10:20:30.040+02:00");
143            assertParse(parser, false, "2006-123T10:20:30.040+02:00");
144            
145            assertParse(parser, false, "T10:20:30.040");
146            assertParse(parser, false, "T10.5");
147            assertParse(parser, false, "T10:20:30.040+02:00");
148            assertParse(parser, false, "T10.5+02:00");
149            
150            assertParse(parser, false, "10:20:30.040");
151            assertParse(parser, false, "10.5");
152            assertParse(parser, false, "10:20:30.040+02:00");
153            assertParse(parser, false, "10.5+02:00");
154        }
155    
156        //-----------------------------------------------------------------------
157        public void test_timeParser() {
158            DateTimeZone.setDefault(DateTimeZone.UTC);
159            DateTimeFormatter parser = ISODateTimeFormat.timeParser();
160            assertParse(parser, false, "2006-06-09");
161            assertParse(parser, false, "2006-W27-3");
162            assertParse(parser, false, "2006-123");
163            assertParse(parser, false, "2006-06-09T+02:00");
164            assertParse(parser, false, "2006-W27-3T+02:00");
165            assertParse(parser, false, "2006-123T+02:00");
166            
167            assertParse(parser, false, "2006-06-09T10:20:30.040");
168            assertParse(parser, false, "2006-W27-3T10:20:30.040");
169            assertParse(parser, false, "2006-123T10:20:30.040");
170            assertParse(parser, false, "2006-06-09T10:20:30.040+02:00");
171            assertParse(parser, false, "2006-W27-3T10:20:30.040+02:00");
172            assertParse(parser, false, "2006-123T10:20:30.040+02:00");
173            
174            assertParse(parser, "T10:20:30.040000000", new DateTime(1970, 1, 1, 10, 20, 30, 40));
175            assertParse(parser, "T10:20:30.004", new DateTime(1970, 1, 1, 10, 20, 30, 4));
176            assertParse(parser, "T10:20:30.040", new DateTime(1970, 1, 1, 10, 20, 30, 40));
177            assertParse(parser, "T10:20:30.400", new DateTime(1970, 1, 1, 10, 20, 30, 400));
178            assertParse(parser, "T10.5", new DateTime(1970, 1, 1, 10, 30, 0, 0));
179            assertParse(parser, "T10:20:30.040+02:00", new DateTime(1970, 1, 1, 8, 20, 30, 40));
180            assertParse(parser, "T10.5+02:00", new DateTime(1970, 1, 1, 8, 30, 0, 0));
181            
182            assertParse(parser, true, "10:20:30.040");
183            assertParse(parser, true, "10.5");
184            assertParse(parser, true, "10:20:30.040+02:00");
185            assertParse(parser, true, "10.5+02:00");
186        }
187    
188        //-----------------------------------------------------------------------
189        public void test_localTimeParser() {
190            DateTimeFormatter parser = ISODateTimeFormat.localTimeParser();
191            assertEquals(DateTimeZone.UTC, parser.getZone());
192            assertParse(parser, false, "2006-06-09");
193            assertParse(parser, false, "2006-W27-3");
194            assertParse(parser, false, "2006-123");
195            assertParse(parser, false, "2006-06-09T+02:00");
196            assertParse(parser, false, "2006-W27-3T+02:00");
197            assertParse(parser, false, "2006-123T+02:00");
198            
199            assertParse(parser, false, "2006-06-09T10:20:30.040");
200            assertParse(parser, false, "2006-W27-3T10:20:30.040");
201            assertParse(parser, false, "2006-123T10:20:30.040");
202            assertParse(parser, false, "2006-06-09T10:20:30.040+02:00");
203            assertParse(parser, false, "2006-W27-3T10:20:30.040+02:00");
204            assertParse(parser, false, "2006-123T10:20:30.040+02:00");
205            
206            assertParse(parser, true, "T10:20:30.040");
207            assertParse(parser, true, "T10.5");
208            assertParse(parser, false, "T10:20:30.040+02:00");
209            assertParse(parser, false, "T10.5+02:00");
210            
211            assertParse(parser, true, "10:20:30.040");
212            assertParse(parser, true, "10.5");
213            assertParse(parser, false, "10:20:30.040+02:00");
214            assertParse(parser, false, "10.5+02:00");
215            
216            assertParse(parser, true, "00:00:10.512345678");
217            assertEquals(10512, parser.parseMillis("00:00:10.512345678"));
218        }
219    
220        //-----------------------------------------------------------------------
221        public void test_timeElementParser() {
222            DateTimeFormatter parser = ISODateTimeFormat.timeElementParser();
223            assertParse(parser, false, "2006-06-09");
224            assertParse(parser, false, "2006-W27-3");
225            assertParse(parser, false, "2006-123");
226            assertParse(parser, false, "2006-06-09T+02:00");
227            assertParse(parser, false, "2006-W27-3T+02:00");
228            assertParse(parser, false, "2006-123T+02:00");
229            
230            assertParse(parser, false, "2006-06-09T10:20:30.040");
231            assertParse(parser, false, "2006-W27-3T10:20:30.040");
232            assertParse(parser, false, "2006-123T10:20:30.040");
233            assertParse(parser, false, "2006-06-09T10:20:30.040+02:00");
234            assertParse(parser, false, "2006-W27-3T10:20:30.040+02:00");
235            assertParse(parser, false, "2006-123T10:20:30.040+02:00");
236            
237            assertParse(parser, false, "T10:20:30.040");
238            assertParse(parser, false, "T10.5");
239            assertParse(parser, false, "T10:20:30.040+02:00");
240            assertParse(parser, false, "T10.5+02:00");
241            
242            assertParse(parser, true, "10:20:30.040");
243            assertParse(parser, true, "10.5");
244            assertParse(parser, false, "10:20:30.040+02:00");
245            assertParse(parser, false, "10.5+02:00");
246            
247            assertParse(parser, true, "00:00:10.512345678");
248            // result is offset by London DST in 1970-01-01
249            assertEquals(10512, parser.parseMillis("00:00:10.512345678") + DateTimeZone.getDefault().getOffset(0L));
250        }
251    
252        //-----------------------------------------------------------------------
253        public void test_dateTimeParser() {
254            DateTimeFormatter parser = ISODateTimeFormat.dateTimeParser();
255            assertParse(parser, true, "2006-06-09");
256            assertParse(parser, true, "2006-W27-3");
257            assertParse(parser, true, "2006-123");
258            assertParse(parser, true, "2006-06-09T+02:00");
259            assertParse(parser, true, "2006-W27-3T+02:00");
260            assertParse(parser, true, "2006-123T+02:00");
261            
262            assertParse(parser, true, "2006-06-09T10:20:30.040");
263            assertParse(parser, true, "2006-W27-3T10:20:30.040");
264            assertParse(parser, true, "2006-123T10:20:30.040");
265            assertParse(parser, true, "2006-06-09T10:20:30.040+02:00");
266            assertParse(parser, true, "2006-W27-3T10:20:30.040+02:00");
267            assertParse(parser, true, "2006-123T10:20:30.040+02:00");
268            
269            assertParse(parser, true, "T10:20:30.040");
270            assertParse(parser, true, "T10.5");
271            assertParse(parser, true, "T10:20:30.040+02:00");
272            assertParse(parser, true, "T10.5+02:00");
273            
274            assertParse(parser, false, "10:20:30.040");
275            assertParse(parser, false, "10.5");
276            assertParse(parser, false, "10:20:30.040+02:00");
277            assertParse(parser, false, "10.5+02:00");
278        }
279    
280        //-----------------------------------------------------------------------
281        public void test_dateOptionalTimeParser() {
282            DateTimeFormatter parser = ISODateTimeFormat.dateOptionalTimeParser();
283            assertParse(parser, true, "2006-06-09");
284            assertParse(parser, true, "2006-W27-3");
285            assertParse(parser, true, "2006-123");
286            assertParse(parser, true, "2006-06-09T+02:00");
287            assertParse(parser, true, "2006-W27-3T+02:00");
288            assertParse(parser, true, "2006-123T+02:00");
289            
290            assertParse(parser, true, "2006-06-09T10:20:30.040");
291            assertParse(parser, true, "2006-W27-3T10:20:30.040");
292            assertParse(parser, true, "2006-123T10:20:30.040");
293            assertParse(parser, true, "2006-06-09T10:20:30.040+02:00");
294            assertParse(parser, true, "2006-W27-3T10:20:30.040+02:00");
295            assertParse(parser, true, "2006-123T10:20:30.040+02:00");
296            
297            assertParse(parser, false, "T10:20:30.040");
298            assertParse(parser, false, "T10.5");
299            assertParse(parser, false, "T10:20:30.040+02:00");
300            assertParse(parser, false, "T10.5+02:00");
301            
302            assertParse(parser, false, "10:20:30.040");
303            assertParse(parser, false, "10.5");
304            assertParse(parser, false, "10:20:30.040+02:00");
305            assertParse(parser, false, "10.5+02:00");
306        }
307    
308        //-----------------------------------------------------------------------
309        public void test_localDateOptionalTimeParser() {
310            DateTimeFormatter parser = ISODateTimeFormat.localDateOptionalTimeParser();
311            assertEquals(DateTimeZone.UTC, parser.getZone());
312            assertParse(parser, true, "2006-06-09");
313            assertParse(parser, true, "2006-W27-3");
314            assertParse(parser, true, "2006-123");
315            assertParse(parser, false, "2006-06-09T+02:00");
316            assertParse(parser, false, "2006-W27-3T+02:00");
317            assertParse(parser, false, "2006-123T+02:00");
318            
319            assertParse(parser, true, "2006-06-09T10:20:30.040");
320            assertParse(parser, true, "2006-W27-3T10:20:30.040");
321            assertParse(parser, true, "2006-123T10:20:30.040");
322            assertParse(parser, false, "2006-06-09T10:20:30.040+02:00");
323            assertParse(parser, false, "2006-W27-3T10:20:30.040+02:00");
324            assertParse(parser, false, "2006-123T10:20:30.040+02:00");
325            
326            assertParse(parser, false, "T10:20:30.040");
327            assertParse(parser, false, "T10.5");
328            assertParse(parser, false, "T10:20:30.040+02:00");
329            assertParse(parser, false, "T10.5+02:00");
330            
331            assertParse(parser, false, "10:20:30.040");
332            assertParse(parser, false, "10.5");
333            assertParse(parser, false, "10:20:30.040+02:00");
334            assertParse(parser, false, "10.5+02:00");
335        }
336    
337        //-----------------------------------------------------------------------
338        //-----------------------------------------------------------------------
339        //-----------------------------------------------------------------------
340        public void test_date() {
341            DateTimeFormatter parser = ISODateTimeFormat.date();
342            assertParse(parser, "2006-02-04", new DateTime(2006, 2, 4, 0, 0, 0, 0));
343            assertParse(parser, "2006-2-04", new DateTime(2006, 2, 4, 0, 0, 0, 0));
344            assertParse(parser, "2006-02-4", new DateTime(2006, 2, 4, 0, 0, 0, 0));
345            assertParse(parser, "2006-2-4", new DateTime(2006, 2, 4, 0, 0, 0, 0));
346            assertParse(parser, false, "2006-02-");
347            assertParse(parser, false, "2006-02");
348            assertParse(parser, false, "2006--4");
349            assertParse(parser, false, "2006-1");
350            assertParse(parser, false, "2006");
351        }
352    
353        //-----------------------------------------------------------------------
354        public void test_time() {
355            DateTimeZone.setDefault(DateTimeZone.UTC);
356            DateTimeFormatter parser = ISODateTimeFormat.time();
357            assertParse(parser, "10:20:30.400999999Z", new DateTime(1970, 1, 1, 10, 20, 30, 400));
358            assertParse(parser, "10:20:30.400Z", new DateTime(1970, 1, 1, 10, 20, 30, 400));
359            assertParse(parser, "10:20:30.40Z", new DateTime(1970, 1, 1, 10, 20, 30, 400));
360            assertParse(parser, "10:20:30.4Z", new DateTime(1970, 1, 1, 10, 20, 30, 400));
361            assertParse(parser, "5:6:7.8Z", new DateTime(1970, 1, 1, 5, 6, 7, 800));
362            assertParse(parser, false, "10:20.400Z");
363            assertParse(parser, false, "10:2.400Z");
364            assertParse(parser, false, "10.400Z");
365            assertParse(parser, false, "1.400Z");
366        }
367    
368        //-----------------------------------------------------------------------
369        public void test_timeNoMillis() {
370            DateTimeZone.setDefault(DateTimeZone.UTC);
371            DateTimeFormatter parser = ISODateTimeFormat.timeNoMillis();
372            assertParse(parser, "10:20:30Z", new DateTime(1970, 1, 1, 10, 20, 30, 0));
373            assertParse(parser, "5:6:7Z", new DateTime(1970, 1, 1, 5, 6, 7, 0));
374            assertParse(parser, false, "10:20Z");
375            assertParse(parser, false, "10:2Z");
376            assertParse(parser, false, "10Z");
377            assertParse(parser, false, "1Z");
378        }
379    
380        //-----------------------------------------------------------------------
381        public void test_tTime() {
382            DateTimeZone.setDefault(DateTimeZone.UTC);
383            DateTimeFormatter parser = ISODateTimeFormat.tTime();
384            assertParse(parser, "T10:20:30.400999999Z", new DateTime(1970, 1, 1, 10, 20, 30, 400));
385            assertParse(parser, "T10:20:30.400Z", new DateTime(1970, 1, 1, 10, 20, 30, 400));
386            assertParse(parser, "T10:20:30.40Z", new DateTime(1970, 1, 1, 10, 20, 30, 400));
387            assertParse(parser, "T10:20:30.4Z", new DateTime(1970, 1, 1, 10, 20, 30, 400));
388            assertParse(parser, "T5:6:7.8Z", new DateTime(1970, 1, 1, 5, 6, 7, 800));
389            assertParse(parser, false, "T10:20.400Z");
390            assertParse(parser, false, "T102.400Z");
391            assertParse(parser, false, "T10.400Z");
392            assertParse(parser, false, "T1.400Z");
393        }
394    
395        //-----------------------------------------------------------------------
396        public void test_tTimeNoMillis() {
397            DateTimeZone.setDefault(DateTimeZone.UTC);
398            DateTimeFormatter parser = ISODateTimeFormat.tTimeNoMillis();
399            assertParse(parser, "T10:20:30Z", new DateTime(1970, 1, 1, 10, 20, 30, 0));
400            assertParse(parser, "T5:6:7Z", new DateTime(1970, 1, 1, 5, 6, 7, 0));
401            assertParse(parser, false, "T10:20Z");
402            assertParse(parser, false, "T10:2Z");
403            assertParse(parser, false, "T10Z");
404            assertParse(parser, false, "T1Z");
405        }
406    
407        //-----------------------------------------------------------------------
408        public void test_dateTime() {
409            DateTimeZone.setDefault(DateTimeZone.UTC);
410            DateTimeFormatter parser = ISODateTimeFormat.dateTime();
411            assertParse(parser, "2006-02-04T10:20:30.400999999Z", new DateTime(2006, 2, 4, 10, 20, 30, 400));
412            assertParse(parser, "2006-02-04T10:20:30.400Z", new DateTime(2006, 2, 4, 10, 20, 30, 400));
413            assertParse(parser, "2006-02-04T10:20:30.40Z", new DateTime(2006, 2, 4, 10, 20, 30, 400));
414            assertParse(parser, "2006-02-04T10:20:30.4Z", new DateTime(2006, 2, 4, 10, 20, 30, 400));
415            assertParse(parser, "2006-02-4T10:20:30.400Z", new DateTime(2006, 2, 4, 10, 20, 30, 400));
416            assertParse(parser, "2006-2-04T10:20:30.400Z", new DateTime(2006, 2, 4, 10, 20, 30, 400));
417            assertParse(parser, "2006-2-4T10:20:30.400Z", new DateTime(2006, 2, 4, 10, 20, 30, 400));
418            assertParse(parser, "2006-02-04T5:6:7.800Z", new DateTime(2006, 2, 4, 5, 6, 7, 800));
419            assertParse(parser, false, "2006-02-T10:20:30.400Z");
420            assertParse(parser, false, "2006-12T10:20:30.400Z");
421            assertParse(parser, false, "2006-1T10:20:30.400Z");
422            assertParse(parser, false, "2006T10:20:30.400Z");
423            assertParse(parser, false, "200T10:20:30.400Z");
424            assertParse(parser, false, "20T10:20:30.400Z");
425            assertParse(parser, false, "2T10:20:30.400Z");
426            assertParse(parser, false, "2006-02-04T10:20.400Z");
427            assertParse(parser, false, "2006-02-04T10:2.400Z");
428            assertParse(parser, false, "2006-02-04T10.400Z");
429            assertParse(parser, false, "2006-02-04T1.400Z");
430        }
431    
432        //-----------------------------------------------------------------------
433        public void test_dateTimeNoMillis() {
434            DateTimeZone.setDefault(DateTimeZone.UTC);
435            DateTimeFormatter parser = ISODateTimeFormat.dateTimeNoMillis();
436            assertParse(parser, "2006-02-04T10:20:30Z", new DateTime(2006, 2, 4, 10, 20, 30, 0));
437            assertParse(parser, "2006-02-4T10:20:30Z", new DateTime(2006, 2, 4, 10, 20, 30, 0));
438            assertParse(parser, "2006-2-04T10:20:30Z", new DateTime(2006, 2, 4, 10, 20, 30, 0));
439            assertParse(parser, "2006-2-4T10:20:30Z", new DateTime(2006, 2, 4, 10, 20, 30, 0));
440            assertParse(parser, "2006-02-04T5:6:7Z", new DateTime(2006, 2, 4, 5, 6, 7, 0));
441            assertParse(parser, false, "2006-02-T10:20:30Z");
442            assertParse(parser, false, "2006-12T10:20:30Z");
443            assertParse(parser, false, "2006-1T10:20:30Z");
444            assertParse(parser, false, "2006T10:20:30Z");
445            assertParse(parser, false, "200T10:20:30Z");
446            assertParse(parser, false, "20T10:20:30Z");
447            assertParse(parser, false, "2T10:20:30Z");
448            assertParse(parser, false, "2006-02-04T10:20Z");
449            assertParse(parser, false, "2006-02-04T10:2Z");
450            assertParse(parser, false, "2006-02-04T10Z");
451            assertParse(parser, false, "2006-02-04T1Z");
452        }
453    
454        //-----------------------------------------------------------------------
455        public void test_ordinalDate() {
456            DateTimeFormatter parser = ISODateTimeFormat.ordinalDate();
457            assertParse(parser, "2006-123", new DateTime(2006, 1, 1, 0, 0, 0, 0).withDayOfYear(123));
458            assertParse(parser, "2006-12", new DateTime(2006, 1, 1, 0, 0, 0, 0).withDayOfYear(12));
459            assertParse(parser, "2006-1", new DateTime(2006, 1, 1, 0, 0, 0, 0).withDayOfYear(1));
460            assertParse(parser, false, "2006-");
461            assertParse(parser, false, "2006");
462        }
463    
464        //-----------------------------------------------------------------------
465        public void test_ordinalDateTime() {
466            DateTimeZone.setDefault(DateTimeZone.UTC);
467            DateTimeFormatter parser = ISODateTimeFormat.ordinalDateTime();
468            assertParse(parser, "2006-123T10:20:30.400999999Z", new DateTime(2006, 1, 1, 10, 20, 30, 400).withDayOfYear(123));
469            assertParse(parser, "2006-123T10:20:30.400Z", new DateTime(2006, 1, 1, 10, 20, 30, 400).withDayOfYear(123));
470            assertParse(parser, "2006-123T10:20:30.40Z", new DateTime(2006, 1, 1, 10, 20, 30, 400).withDayOfYear(123));
471            assertParse(parser, "2006-123T10:20:30.4Z", new DateTime(2006, 1, 1, 10, 20, 30, 400).withDayOfYear(123));
472            assertParse(parser, "2006-12T10:20:30.400Z", new DateTime(2006, 1, 1, 10, 20, 30, 400).withDayOfYear(12));
473            assertParse(parser, "2006-1T10:20:30.400Z", new DateTime(2006, 1, 1, 10, 20, 30, 400).withDayOfYear(1));
474            assertParse(parser, "2006-123T5:6:7.800Z", new DateTime(2006, 1, 1, 5, 6, 7, 800).withDayOfYear(123));
475            assertParse(parser, false, "2006-T10:20:30.400Z");
476            assertParse(parser, false, "2006T10:20:30.400Z");
477            assertParse(parser, false, "2006-123T10:20.400Z");
478            assertParse(parser, false, "2006-123T10:2.400Z");
479            assertParse(parser, false, "2006-123T10.400Z");
480            assertParse(parser, false, "2006-123T1.400Z");
481        }
482    
483        //-----------------------------------------------------------------------
484        public void test_ordinalDateTimeNoMillis() {
485            DateTimeZone.setDefault(DateTimeZone.UTC);
486            DateTimeFormatter parser = ISODateTimeFormat.ordinalDateTimeNoMillis();
487            assertParse(parser, "2006-123T10:20:30Z", new DateTime(2006, 1, 1, 10, 20, 30, 0).withDayOfYear(123));
488            assertParse(parser, "2006-12T10:20:30Z", new DateTime(2006, 1, 1, 10, 20, 30, 0).withDayOfYear(12));
489            assertParse(parser, "2006-1T10:20:30Z", new DateTime(2006, 1, 1, 10, 20, 30, 0).withDayOfYear(1));
490            assertParse(parser, "2006-123T5:6:7Z", new DateTime(2006, 1, 1, 5, 6, 7, 0).withDayOfYear(123));
491            assertParse(parser, false, "2006-T10:20:30Z");
492            assertParse(parser, false, "2006T10:20:30Z");
493            assertParse(parser, false, "2006-123T10:20Z");
494            assertParse(parser, false, "2006-123T10:2Z");
495            assertParse(parser, false, "2006-123T10Z");
496            assertParse(parser, false, "2006-123T1Z");
497        }
498    
499        //-----------------------------------------------------------------------
500        public void test_weekDate() {
501            DateTimeFormatter parser = ISODateTimeFormat.weekDate();
502            assertParse(parser, "2006-W27-3", new DateTime(2006, 6, 1, 0, 0, 0, 0).withWeekOfWeekyear(27).withDayOfWeek(3));
503            assertParse(parser, "2006-W2-3", new DateTime(2006, 6, 1, 0, 0, 0, 0).withWeekOfWeekyear(2).withDayOfWeek(3));
504            assertParse(parser, false, "2006-W-3");
505            assertParse(parser, false, "2006-W27-");
506            assertParse(parser, false, "2006-W27");
507            assertParse(parser, false, "2006-W2");
508            assertParse(parser, false, "2006-W");
509        }
510    
511        //-----------------------------------------------------------------------
512        public void test_weekDateTime() {
513            DateTimeZone.setDefault(DateTimeZone.UTC);
514            DateTimeFormatter parser = ISODateTimeFormat.weekDateTime();
515            assertParse(parser, "2006-W27-3T10:20:30.400999999Z", new DateTime(2006, 6, 1, 10, 20, 30, 400).withWeekOfWeekyear(27).withDayOfWeek(3));
516            assertParse(parser, "2006-W27-3T10:20:30.400Z", new DateTime(2006, 6, 1, 10, 20, 30, 400).withWeekOfWeekyear(27).withDayOfWeek(3));
517            assertParse(parser, "2006-W27-3T10:20:30.40Z", new DateTime(2006, 6, 1, 10, 20, 30, 400).withWeekOfWeekyear(27).withDayOfWeek(3));
518            assertParse(parser, "2006-W27-3T10:20:30.4Z", new DateTime(2006, 6, 1, 10, 20, 30, 400).withWeekOfWeekyear(27).withDayOfWeek(3));
519            assertParse(parser, "2006-W2-3T10:20:30.400Z", new DateTime(2006, 6, 1, 10, 20, 30, 400).withWeekOfWeekyear(2).withDayOfWeek(3));
520            assertParse(parser, "2006-W27-3T5:6:7.800Z", new DateTime(2006, 6, 1, 5, 6, 7, 800).withWeekOfWeekyear(27).withDayOfWeek(3));
521            assertParse(parser, false, "2006-W27-T10:20:30.400Z");
522            assertParse(parser, false, "2006-W27T10:20:30.400Z");
523            assertParse(parser, false, "2006-W2T10:20:30.400Z");
524            assertParse(parser, false, "2006-W-3T10:20:30.400Z");
525            assertParse(parser, false, "2006-W27-3T10:20.400Z");
526            assertParse(parser, false, "2006-W27-3T10:2.400Z");
527            assertParse(parser, false, "2006-W27-3T10.400Z");
528            assertParse(parser, false, "2006-W27-3T1.400Z");
529        }
530    
531        //-----------------------------------------------------------------------
532        public void test_weekDateTimeNoMillis() {
533            DateTimeZone.setDefault(DateTimeZone.UTC);
534            DateTimeFormatter parser = ISODateTimeFormat.weekDateTimeNoMillis();
535            assertParse(parser, "2006-W27-3T10:20:30Z", new DateTime(2006, 6, 1, 10, 20, 30, 0).withWeekOfWeekyear(27).withDayOfWeek(3));
536            assertParse(parser, "2006-W2-3T10:20:30Z", new DateTime(2006, 6, 1, 10, 20, 30, 0).withWeekOfWeekyear(2).withDayOfWeek(3));
537            assertParse(parser, "2006-W27-3T5:6:7Z", new DateTime(2006, 6, 1, 5, 6, 7, 0).withWeekOfWeekyear(27).withDayOfWeek(3));
538            assertParse(parser, false, "2006-W27-T10:20:30Z");
539            assertParse(parser, false, "2006-W27T10:20:30Z");
540            assertParse(parser, false, "2006-W2T10:20:30Z");
541            assertParse(parser, false, "2006-W-3T10:20:30Z");
542            assertParse(parser, false, "2006-W27-3T10:20Z");
543            assertParse(parser, false, "2006-W27-3T10:2Z");
544            assertParse(parser, false, "2006-W27-3T10Z");
545            assertParse(parser, false, "2006-W27-3T1Z");
546        }
547    
548        //-----------------------------------------------------------------------
549        //-----------------------------------------------------------------------
550        //-----------------------------------------------------------------------
551        public void test_basicDate() {
552            DateTimeFormatter parser = ISODateTimeFormat.basicDate();
553            assertParse(parser, "20060204", new DateTime(2006, 2, 4, 0, 0, 0, 0));
554            assertParse(parser, false, "2006024");
555            assertParse(parser, false, "200602");
556            assertParse(parser, false, "20061");
557            assertParse(parser, false, "2006");
558        }
559    
560        //-----------------------------------------------------------------------
561        public void test_basicTime() {
562            DateTimeZone.setDefault(DateTimeZone.UTC);
563            DateTimeFormatter parser = ISODateTimeFormat.basicTime();
564            assertParse(parser, "102030.400999999Z", new DateTime(1970, 1, 1, 10, 20, 30, 400));
565            assertParse(parser, "102030.400Z", new DateTime(1970, 1, 1, 10, 20, 30, 400));
566            assertParse(parser, "102030.40Z", new DateTime(1970, 1, 1, 10, 20, 30, 400));
567            assertParse(parser, "102030.4Z", new DateTime(1970, 1, 1, 10, 20, 30, 400));
568            assertParse(parser, false, "10203.400Z");
569            assertParse(parser, false, "1020.400Z");
570            assertParse(parser, false, "102.400Z");
571            assertParse(parser, false, "10.400Z");
572            assertParse(parser, false, "1.400Z");
573        }
574    
575        //-----------------------------------------------------------------------
576        public void test_basicTimeNoMillis() {
577            DateTimeZone.setDefault(DateTimeZone.UTC);
578            DateTimeFormatter parser = ISODateTimeFormat.basicTimeNoMillis();
579            assertParse(parser, "102030Z", new DateTime(1970, 1, 1, 10, 20, 30, 0));
580            assertParse(parser, false, "10203Z");
581            assertParse(parser, false, "1020Z");
582            assertParse(parser, false, "102Z");
583            assertParse(parser, false, "10Z");
584            assertParse(parser, false, "1Z");
585        }
586    
587        //-----------------------------------------------------------------------
588        public void test_basicTTime() {
589            DateTimeZone.setDefault(DateTimeZone.UTC);
590            DateTimeFormatter parser = ISODateTimeFormat.basicTTime();
591            assertParse(parser, "T102030.400999999Z", new DateTime(1970, 1, 1, 10, 20, 30, 400));
592            assertParse(parser, "T102030.400Z", new DateTime(1970, 1, 1, 10, 20, 30, 400));
593            assertParse(parser, "T102030.40Z", new DateTime(1970, 1, 1, 10, 20, 30, 400));
594            assertParse(parser, "T102030.4Z", new DateTime(1970, 1, 1, 10, 20, 30, 400));
595            assertParse(parser, false, "T10203.400Z");
596            assertParse(parser, false, "T1020.400Z");
597            assertParse(parser, false, "T102.400Z");
598            assertParse(parser, false, "T10.400Z");
599            assertParse(parser, false, "T1.400Z");
600        }
601    
602        //-----------------------------------------------------------------------
603        public void test_basicTTimeNoMillis() {
604            DateTimeZone.setDefault(DateTimeZone.UTC);
605            DateTimeFormatter parser = ISODateTimeFormat.basicTTimeNoMillis();
606            assertParse(parser, "T102030Z", new DateTime(1970, 1, 1, 10, 20, 30, 0));
607            assertParse(parser, false, "T10203Z");
608            assertParse(parser, false, "T1020Z");
609            assertParse(parser, false, "T102Z");
610            assertParse(parser, false, "T10Z");
611            assertParse(parser, false, "T1Z");
612        }
613    
614        //-----------------------------------------------------------------------
615        public void test_basicDateTime() {
616            DateTimeZone.setDefault(DateTimeZone.UTC);
617            DateTimeFormatter parser = ISODateTimeFormat.basicDateTime();
618            assertParse(parser, "20061204T102030.400999999Z", new DateTime(2006, 12, 4, 10, 20, 30, 400));
619            assertParse(parser, "20061204T102030.400Z", new DateTime(2006, 12, 4, 10, 20, 30, 400));
620            assertParse(parser, "20061204T102030.40Z", new DateTime(2006, 12, 4, 10, 20, 30, 400));
621            assertParse(parser, "20061204T102030.4Z", new DateTime(2006, 12, 4, 10, 20, 30, 400));
622            assertParse(parser, false, "2006120T102030.400Z");
623            assertParse(parser, false, "200612T102030.400Z");
624            assertParse(parser, false, "20061T102030.400Z");
625            assertParse(parser, false, "2006T102030.400Z");
626            assertParse(parser, false, "200T102030.400Z");
627            assertParse(parser, false, "20T102030.400Z");
628            assertParse(parser, false, "2T102030.400Z");
629            assertParse(parser, false, "20061204T10203.400Z");
630            assertParse(parser, false, "20061204T1020.400Z");
631            assertParse(parser, false, "20061204T102.400Z");
632            assertParse(parser, false, "20061204T10.400Z");
633            assertParse(parser, false, "20061204T1.400Z");
634        }
635    
636        //-----------------------------------------------------------------------
637        public void test_basicDateTimeNoMillis() {
638            DateTimeZone.setDefault(DateTimeZone.UTC);
639            DateTimeFormatter parser = ISODateTimeFormat.basicDateTimeNoMillis();
640            assertParse(parser, "20061204T102030Z", new DateTime(2006, 12, 4, 10, 20, 30, 0));
641            assertParse(parser, false, "2006120T102030Z");
642            assertParse(parser, false, "200612T102030Z");
643            assertParse(parser, false, "20061T102030Z");
644            assertParse(parser, false, "2006T102030Z");
645            assertParse(parser, false, "200T102030Z");
646            assertParse(parser, false, "20T102030Z");
647            assertParse(parser, false, "2T102030Z");
648            assertParse(parser, false, "20061204T10203Z");
649            assertParse(parser, false, "20061204T1020Z");
650            assertParse(parser, false, "20061204T102Z");
651            assertParse(parser, false, "20061204T10Z");
652            assertParse(parser, false, "20061204T1Z");
653        }
654    
655        //-----------------------------------------------------------------------
656        public void test_basicOrdinalDate() {
657            DateTimeFormatter parser = ISODateTimeFormat.basicOrdinalDate();
658            assertParse(parser, "2006123", new DateTime(2006, 1, 1, 0, 0, 0, 0).withDayOfYear(123));
659            assertParse(parser, false, "200612");
660            assertParse(parser, false, "20061");
661            assertParse(parser, false, "2006");
662        }
663    
664        //-----------------------------------------------------------------------
665        public void test_basicOrdinalDateTime() {
666            DateTimeZone.setDefault(DateTimeZone.UTC);
667            DateTimeFormatter parser = ISODateTimeFormat.basicOrdinalDateTime();
668            assertParse(parser, "2006123T102030.400999999Z", new DateTime(2006, 1, 1, 10, 20, 30, 400).withDayOfYear(123));
669            assertParse(parser, "2006123T102030.400Z", new DateTime(2006, 1, 1, 10, 20, 30, 400).withDayOfYear(123));
670            assertParse(parser, "2006123T102030.40Z", new DateTime(2006, 1, 1, 10, 20, 30, 400).withDayOfYear(123));
671            assertParse(parser, "2006123T102030.4Z", new DateTime(2006, 1, 1, 10, 20, 30, 400).withDayOfYear(123));
672            assertParse(parser, false, "200612T102030.400Z");
673            assertParse(parser, false, "20061T102030.400Z");
674            assertParse(parser, false, "2006T102030.400Z");
675            assertParse(parser, false, "200T102030.400Z");
676            assertParse(parser, false, "20T102030.400Z");
677            assertParse(parser, false, "2T102030.400Z");
678            assertParse(parser, false, "2006123T10203.400Z");
679            assertParse(parser, false, "2006123T1020.400Z");
680            assertParse(parser, false, "2006123T102.400Z");
681            assertParse(parser, false, "2006123T10.400Z");
682            assertParse(parser, false, "2006123T1.400Z");
683        }
684    
685        //-----------------------------------------------------------------------
686        public void test_basicOrdinalDateTimeNoMillis() {
687            DateTimeZone.setDefault(DateTimeZone.UTC);
688            DateTimeFormatter parser = ISODateTimeFormat.basicOrdinalDateTimeNoMillis();
689            assertParse(parser, "2006123T102030Z", new DateTime(2006, 1, 1, 10, 20, 30, 0).withDayOfYear(123));
690            assertParse(parser, false, "200612T102030Z");
691            assertParse(parser, false, "20061T102030Z");
692            assertParse(parser, false, "2006T102030Z");
693            assertParse(parser, false, "200T102030Z");
694            assertParse(parser, false, "20T102030Z");
695            assertParse(parser, false, "2T102030Z");
696            assertParse(parser, false, "2006123T10203Z");
697            assertParse(parser, false, "2006123T1020Z");
698            assertParse(parser, false, "2006123T102Z");
699            assertParse(parser, false, "2006123T10Z");
700            assertParse(parser, false, "2006123T1Z");
701        }
702    
703        //-----------------------------------------------------------------------
704        public void test_basicWeekDate() {
705            DateTimeFormatter parser = ISODateTimeFormat.basicWeekDate();
706            assertParse(parser, "2006W273", new DateTime(2006, 6, 1, 0, 0, 0, 0).withWeekOfWeekyear(27).withDayOfWeek(3));
707            assertParse(parser, false, "2006W27");
708            assertParse(parser, false, "2006W2");
709            assertParse(parser, false, "2006W");
710        }
711    
712        //-----------------------------------------------------------------------
713        public void test_basicWeekDateTime() {
714            DateTimeZone.setDefault(DateTimeZone.UTC);
715            DateTimeFormatter parser = ISODateTimeFormat.basicWeekDateTime();
716            assertParse(parser, "2006W273T102030.400999999Z", new DateTime(2006, 6, 1, 10, 20, 30, 400).withWeekOfWeekyear(27).withDayOfWeek(3));
717            assertParse(parser, "2006W273T102030.400Z", new DateTime(2006, 6, 1, 10, 20, 30, 400).withWeekOfWeekyear(27).withDayOfWeek(3));
718            assertParse(parser, "2006W273T102030.40Z", new DateTime(2006, 6, 1, 10, 20, 30, 400).withWeekOfWeekyear(27).withDayOfWeek(3));
719            assertParse(parser, "2006W273T102030.4Z", new DateTime(2006, 6, 1, 10, 20, 30, 400).withWeekOfWeekyear(27).withDayOfWeek(3));
720            assertParse(parser, false, "2006W27T102030.400Z");
721            assertParse(parser, false, "2006W2T102030.400Z");
722            assertParse(parser, false, "2006W273T10203.400Z");
723            assertParse(parser, false, "2006W273T1020.400Z");
724            assertParse(parser, false, "2006W273T102.400Z");
725            assertParse(parser, false, "2006W273T10.400Z");
726            assertParse(parser, false, "2006W273T1.400Z");
727        }
728    
729        //-----------------------------------------------------------------------
730        public void test_basicWeekDateTimeNoMillis() {
731            DateTimeZone.setDefault(DateTimeZone.UTC);
732            DateTimeFormatter parser = ISODateTimeFormat.basicWeekDateTimeNoMillis();
733            assertParse(parser, "2006W273T102030Z", new DateTime(2006, 6, 1, 10, 20, 30, 0).withWeekOfWeekyear(27).withDayOfWeek(3));
734            assertParse(parser, false, "2006W27T102030Z");
735            assertParse(parser, false, "2006W2T102030Z");
736            assertParse(parser, false, "2006W273T10203Z");
737            assertParse(parser, false, "2006W273T1020Z");
738            assertParse(parser, false, "2006W273T102Z");
739            assertParse(parser, false, "2006W273T10Z");
740            assertParse(parser, false, "2006W273T1Z");
741        }
742    
743        //-----------------------------------------------------------------------
744        //-----------------------------------------------------------------------
745        //-----------------------------------------------------------------------
746        public void test_hourMinute() {
747            DateTimeZone.setDefault(DateTimeZone.UTC);
748            DateTimeFormatter parser = ISODateTimeFormat.hourMinute();
749            assertParse(parser, "10:20", new DateTime(1970, 1, 1, 10, 20, 0, 0));
750            assertParse(parser, "5:6", new DateTime(1970, 1, 1, 5, 6, 0, 0));
751            assertParse(parser, false, "10:20:30.400999999");
752            assertParse(parser, false, "10:20:30.400");
753            assertParse(parser, false, "10:20:30");
754            assertParse(parser, false, "10:20.400");
755            assertParse(parser, false, "10:2.400");
756            assertParse(parser, false, "10.400");
757            assertParse(parser, false, "1.400");
758        }
759    
760        //-----------------------------------------------------------------------
761        public void test_hourMinuteSecond() {
762            DateTimeZone.setDefault(DateTimeZone.UTC);
763            DateTimeFormatter parser = ISODateTimeFormat.hourMinuteSecond();
764            assertParse(parser, "10:20:30", new DateTime(1970, 1, 1, 10, 20, 30, 0));
765            assertParse(parser, "5:6:7", new DateTime(1970, 1, 1, 5, 6, 7, 0));
766            assertParse(parser, false, "10:20:30.400999999");
767            assertParse(parser, false, "10:20:30.400");
768            assertParse(parser, false, "10:20:30.4");
769            assertParse(parser, false, "10:20.400");
770            assertParse(parser, false, "10:2.400");
771            assertParse(parser, false, "10.400");
772            assertParse(parser, false, "1.400");
773        }
774    
775        //-----------------------------------------------------------------------
776        public void test_hourMinuteSecondMillis() {
777            DateTimeZone.setDefault(DateTimeZone.UTC);
778            DateTimeFormatter parser = ISODateTimeFormat.hourMinuteSecondMillis();
779            assertParse(parser, "10:20:30.400", new DateTime(1970, 1, 1, 10, 20, 30, 400));
780            assertParse(parser, "10:20:30.40", new DateTime(1970, 1, 1, 10, 20, 30, 400));
781            assertParse(parser, "10:20:30.4", new DateTime(1970, 1, 1, 10, 20, 30, 400));
782            assertParse(parser, "5:6:7.8", new DateTime(1970, 1, 1, 5, 6, 7, 800));
783            assertParse(parser, false, "10:20:30.400999999");
784            assertParse(parser, false, "10:20.400");
785            assertParse(parser, false, "10:2.400");
786            assertParse(parser, false, "10.400");
787            assertParse(parser, false, "1.400");
788        }
789    
790        //-----------------------------------------------------------------------
791        public void test_hourMinuteSecondFraction() {
792            DateTimeZone.setDefault(DateTimeZone.UTC);
793            DateTimeFormatter parser = ISODateTimeFormat.hourMinuteSecondFraction();
794            assertParse(parser, "10:20:30.400999999", new DateTime(1970, 1, 1, 10, 20, 30, 400));
795            assertParse(parser, "10:20:30.400", new DateTime(1970, 1, 1, 10, 20, 30, 400));
796            assertParse(parser, "10:20:30.40", new DateTime(1970, 1, 1, 10, 20, 30, 400));
797            assertParse(parser, "10:20:30.4", new DateTime(1970, 1, 1, 10, 20, 30, 400));
798            assertParse(parser, "5:6:7.8", new DateTime(1970, 1, 1, 5, 6, 7, 800));
799            assertParse(parser, false, "10:20.400");
800            assertParse(parser, false, "10:2.400");
801            assertParse(parser, false, "10.400");
802            assertParse(parser, false, "1.400");
803        }
804    
805        //-----------------------------------------------------------------------
806        //-----------------------------------------------------------------------
807        //-----------------------------------------------------------------------
808        private void assertParse(DateTimeFormatter parser, boolean expected, String str) {
809            if (expected) {
810                parser.parseMillis(str);
811            } else {
812                try {
813                    parser.parseMillis(str);
814                    fail();
815                } catch (IllegalArgumentException ex) {
816                    // expected
817                }
818            }
819        }
820    
821        private void assertParse(DateTimeFormatter parser, String str, DateTime expected) {
822            DateTime dt = parser.parseDateTime(str);
823            assertEquals(expected, dt);
824        }
825    
826    }