View Javadoc

1   /*
2    *  Copyright 2001-2006 Stephen Colebourne
3    *
4    *  Licensed under the Apache License, Version 2.0 (the "License");
5    *  you may not use this file except in compliance with the License.
6    *  You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   *  Unless required by applicable law or agreed to in writing, software
11   *  distributed under the License is distributed on an "AS IS" BASIS,
12   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *  See the License for the specific language governing permissions and
14   *  limitations under the License.
15   */
16  package org.joda.time.format;
17  
18  import java.util.Locale;
19  import java.util.TimeZone;
20  
21  import junit.framework.TestCase;
22  import junit.framework.TestSuite;
23  
24  import org.joda.time.DateTime;
25  import org.joda.time.DateTimeZone;
26  
27  /**
28   * This class is a Junit unit test for ISODateTimeFormat parsing.
29   *
30   * @author Stephen Colebourne
31   */
32  public class TestISODateTimeFormatParsing extends TestCase {
33  
34      private DateTimeZone originalDateTimeZone = null;
35      private TimeZone originalTimeZone = null;
36      private Locale originalLocale = null;
37  
38      public static void main(String[] args) {
39          junit.textui.TestRunner.run(suite());
40      }
41  
42      public static TestSuite suite() {
43          return new TestSuite(TestISODateTimeFormatParsing.class);
44      }
45  
46      public TestISODateTimeFormatParsing(String name) {
47          super(name);
48      }
49  
50      protected void setUp() throws Exception {
51          originalDateTimeZone = DateTimeZone.getDefault();
52          originalTimeZone = TimeZone.getDefault();
53          originalLocale = Locale.getDefault();
54          DateTimeZone.setDefault(DateTimeZone.forID("Europe/London"));
55          TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
56          Locale.setDefault(Locale.UK);
57      }
58  
59      protected void tearDown() throws Exception {
60          DateTimeZone.setDefault(originalDateTimeZone);
61          TimeZone.setDefault(originalTimeZone);
62          Locale.setDefault(originalLocale);
63          originalDateTimeZone = null;
64          originalTimeZone = null;
65          originalLocale = null;
66      }
67  
68      //-----------------------------------------------------------------------
69      public void test_dateParser() {
70          DateTimeFormatter parser = ISODateTimeFormat.dateParser();
71          assertParse(parser, true, "2006-06-09");
72          assertParse(parser, true, "2006-W27-3");
73          assertParse(parser, true, "2006-123");
74          assertParse(parser, true, "2006-06-09T+02:00");
75          assertParse(parser, true, "2006-W27-3T+02:00");
76          assertParse(parser, true, "2006-123T+02:00");
77          
78          assertParse(parser, false, "2006-06-09T10:20:30.040");
79          assertParse(parser, false, "2006-W27-3T10:20:30.040");
80          assertParse(parser, false, "2006-123T10:20:30.040");
81          assertParse(parser, false, "2006-06-09T10:20:30.040+02:00");
82          assertParse(parser, false, "2006-W27-3T10:20:30.040+02:00");
83          assertParse(parser, false, "2006-123T10:20:30.040+02:00");
84          
85          assertParse(parser, false, "T10:20:30.040");
86          assertParse(parser, false, "T10.5");
87          assertParse(parser, false, "T10:20:30.040+02:00");
88          assertParse(parser, false, "T10.5+02:00");
89          
90          assertParse(parser, false, "10:20:30.040");
91          assertParse(parser, false, "10.5");
92          assertParse(parser, false, "10:20:30.040+02:00");
93          assertParse(parser, false, "10.5+02:00");
94      }
95  
96      //-----------------------------------------------------------------------
97      public void test_localDateParser() {
98          DateTimeFormatter parser = ISODateTimeFormat.localDateParser();
99          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 }