View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    * 
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   * 
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.lang3.time;
18  
19  import static org.apache.commons.lang3.JavaVersion.JAVA_1_4;
20  
21  import static org.junit.Assert.assertEquals;
22  import static org.junit.Assert.assertFalse;
23  import static org.junit.Assert.assertNotNull;
24  import static org.junit.Assert.assertNotSame;
25  import static org.junit.Assert.assertTrue;
26  import static org.junit.Assert.fail;
27  
28  import java.lang.reflect.Constructor;
29  import java.lang.reflect.Modifier;
30  import java.text.DateFormat;
31  import java.text.ParseException;
32  import java.text.SimpleDateFormat;
33  import java.util.Calendar;
34  import java.util.Date;
35  import java.util.GregorianCalendar;
36  import java.util.Iterator;
37  import java.util.Locale;
38  import java.util.NoSuchElementException;
39  import java.util.TimeZone;
40  
41  import junit.framework.AssertionFailedError;
42  
43  import org.apache.commons.lang3.SystemUtils;
44  
45  import org.junit.Before;
46  import org.junit.Test;
47  
48  /**
49   * Unit tests {@link org.apache.commons.lang3.time.DateUtils}.
50   *
51   */
52  public class DateUtilsTest {
53  
54      private static final long MILLIS_TEST;
55      static {
56          final GregorianCalendar cal = new GregorianCalendar(2000, 6, 5, 4, 3, 2);
57          cal.set(Calendar.MILLISECOND, 1);
58          MILLIS_TEST = cal.getTime().getTime();
59          System.out.println("DateUtilsTest: Default Locale="+Locale.getDefault());
60      }
61  
62      DateFormat dateParser = null;
63      DateFormat dateTimeParser = null;
64      DateFormat timeZoneDateParser = null;
65      Date dateAmPm1 = null;
66      Date dateAmPm2 = null;
67      Date dateAmPm3 = null;
68      Date dateAmPm4 = null;
69      Date date0 = null;
70      Date date1 = null;
71      Date date2 = null;
72      Date date3 = null;
73      Date date4 = null;
74      Date date5 = null;
75      Date date6 = null;
76      Date date7 = null;
77      Date date8 = null;
78      Calendar calAmPm1 = null;
79      Calendar calAmPm2 = null;
80      Calendar calAmPm3 = null;
81      Calendar calAmPm4 = null;
82      Calendar cal1 = null;
83      Calendar cal2 = null;
84      Calendar cal3 = null;
85      Calendar cal4 = null;
86      Calendar cal5 = null;
87      Calendar cal6 = null;
88      Calendar cal7 = null;
89      Calendar cal8 = null;
90      TimeZone zone = null;
91      TimeZone defaultZone = null;
92  
93  
94      @Before
95      public void setUp() throws Exception {
96  
97  
98          dateParser = new SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH);
99          dateTimeParser = new SimpleDateFormat("MMM dd, yyyy H:mm:ss.SSS", Locale.ENGLISH);
100 
101         dateAmPm1 = dateTimeParser.parse("February 3, 2002 01:10:00.000");
102         dateAmPm2 = dateTimeParser.parse("February 3, 2002 11:10:00.000");
103         dateAmPm3 = dateTimeParser.parse("February 3, 2002 13:10:00.000");
104         dateAmPm4 = dateTimeParser.parse("February 3, 2002 19:10:00.000");
105         date0 = dateTimeParser.parse("February 3, 2002 12:34:56.789");
106         date1 = dateTimeParser.parse("February 12, 2002 12:34:56.789");
107         date2 = dateTimeParser.parse("November 18, 2001 1:23:11.321");
108         defaultZone = TimeZone.getDefault();
109         zone = TimeZone.getTimeZone("MET");
110         TimeZone.setDefault(zone);
111         dateTimeParser.setTimeZone(zone);
112         date3 = dateTimeParser.parse("March 30, 2003 05:30:45.000");
113         date4 = dateTimeParser.parse("March 30, 2003 01:10:00.000");
114         date5 = dateTimeParser.parse("March 30, 2003 01:40:00.000");
115         date6 = dateTimeParser.parse("March 30, 2003 02:10:00.000");
116         date7 = dateTimeParser.parse("March 30, 2003 02:40:00.000");
117         date8 = dateTimeParser.parse("October 26, 2003 05:30:45.000");
118         dateTimeParser.setTimeZone(defaultZone);
119         TimeZone.setDefault(defaultZone);
120         calAmPm1 = Calendar.getInstance();
121         calAmPm1.setTime(dateAmPm1);
122         calAmPm2 = Calendar.getInstance();
123         calAmPm2.setTime(dateAmPm2);
124         calAmPm3 = Calendar.getInstance();
125         calAmPm3.setTime(dateAmPm3);
126         calAmPm4 = Calendar.getInstance();
127         calAmPm4.setTime(dateAmPm4);
128         cal1 = Calendar.getInstance();
129         cal1.setTime(date1);
130         cal2 = Calendar.getInstance();
131         cal2.setTime(date2);
132         TimeZone.setDefault(zone);
133         cal3 = Calendar.getInstance();
134         cal3.setTime(date3);
135         cal4 = Calendar.getInstance();
136         cal4.setTime(date4);
137         cal5 = Calendar.getInstance();
138         cal5.setTime(date5);
139         cal6 = Calendar.getInstance();
140         cal6.setTime(date6);
141         cal7 = Calendar.getInstance();
142         cal7.setTime(date7);
143         cal8 = Calendar.getInstance();
144         cal8.setTime(date8);
145         TimeZone.setDefault(defaultZone);
146     }
147 
148     //-----------------------------------------------------------------------
149     @Test
150     public void testConstructor() {
151         assertNotNull(new DateUtils());
152         final Constructor<?>[] cons = DateUtils.class.getDeclaredConstructors();
153         assertEquals(1, cons.length);
154         assertTrue(Modifier.isPublic(cons[0].getModifiers()));
155         assertTrue(Modifier.isPublic(DateUtils.class.getModifiers()));
156         assertFalse(Modifier.isFinal(DateUtils.class.getModifiers()));
157     }
158     
159     //-----------------------------------------------------------------------
160     @Test
161     public void testIsSameDay_Date() {
162         Date date1 = new GregorianCalendar(2004, 6, 9, 13, 45).getTime();
163         Date date2 = new GregorianCalendar(2004, 6, 9, 13, 45).getTime();
164         assertTrue(DateUtils.isSameDay(date1, date2));
165         date2 = new GregorianCalendar(2004, 6, 10, 13, 45).getTime();
166         assertFalse(DateUtils.isSameDay(date1, date2));
167         date1 = new GregorianCalendar(2004, 6, 10, 13, 45).getTime();
168         assertTrue(DateUtils.isSameDay(date1, date2));
169         date2 = new GregorianCalendar(2005, 6, 10, 13, 45).getTime();
170         assertFalse(DateUtils.isSameDay(date1, date2));
171         try {
172             DateUtils.isSameDay((Date) null, (Date) null);
173             fail();
174         } catch (final IllegalArgumentException ex) {}
175     }
176     
177     //-----------------------------------------------------------------------
178     @Test
179     public void testIsSameDay_Cal() {
180         final GregorianCalendar cal1 = new GregorianCalendar(2004, 6, 9, 13, 45);
181         final GregorianCalendar cal2 = new GregorianCalendar(2004, 6, 9, 13, 45);
182         assertTrue(DateUtils.isSameDay(cal1, cal2));
183         cal2.add(Calendar.DAY_OF_YEAR, 1);
184         assertFalse(DateUtils.isSameDay(cal1, cal2));
185         cal1.add(Calendar.DAY_OF_YEAR, 1);
186         assertTrue(DateUtils.isSameDay(cal1, cal2));
187         cal2.add(Calendar.YEAR, 1);
188         assertFalse(DateUtils.isSameDay(cal1, cal2));
189         try {
190             DateUtils.isSameDay((Calendar) null, (Calendar) null);
191             fail();
192         } catch (final IllegalArgumentException ex) {}
193     }
194     
195     //-----------------------------------------------------------------------
196     @Test
197     public void testIsSameInstant_Date() {
198         Date date1 = new GregorianCalendar(2004, 6, 9, 13, 45).getTime();
199         Date date2 = new GregorianCalendar(2004, 6, 9, 13, 45).getTime();
200         assertTrue(DateUtils.isSameInstant(date1, date2));
201         date2 = new GregorianCalendar(2004, 6, 10, 13, 45).getTime();
202         assertFalse(DateUtils.isSameInstant(date1, date2));
203         date1 = new GregorianCalendar(2004, 6, 10, 13, 45).getTime();
204         assertTrue(DateUtils.isSameInstant(date1, date2));
205         date2 = new GregorianCalendar(2005, 6, 10, 13, 45).getTime();
206         assertFalse(DateUtils.isSameInstant(date1, date2));
207         try {
208             DateUtils.isSameInstant((Date) null, (Date) null);
209             fail();
210         } catch (final IllegalArgumentException ex) {}
211     }
212     
213     //-----------------------------------------------------------------------
214     @Test
215     public void testIsSameInstant_Cal() {
216         final GregorianCalendar cal1 = new GregorianCalendar(TimeZone.getTimeZone("GMT+1"));
217         final GregorianCalendar cal2 = new GregorianCalendar(TimeZone.getTimeZone("GMT-1"));
218         cal1.set(2004, 6, 9, 13, 45, 0);
219         cal1.set(Calendar.MILLISECOND, 0);
220         cal2.set(2004, 6, 9, 13, 45, 0);
221         cal2.set(Calendar.MILLISECOND, 0);
222         assertFalse(DateUtils.isSameInstant(cal1, cal2));
223         
224         cal2.set(2004, 6, 9, 11, 45, 0);
225         assertTrue(DateUtils.isSameInstant(cal1, cal2));
226         try {
227             DateUtils.isSameInstant((Calendar) null, (Calendar) null);
228             fail();
229         } catch (final IllegalArgumentException ex) {}
230     }
231     
232     //-----------------------------------------------------------------------
233     @Test
234     public void testIsSameLocalTime_Cal() {
235         final GregorianCalendar cal1 = new GregorianCalendar(TimeZone.getTimeZone("GMT+1"));
236         final GregorianCalendar cal2 = new GregorianCalendar(TimeZone.getTimeZone("GMT-1"));
237         cal1.set(2004, 6, 9, 13, 45, 0);
238         cal1.set(Calendar.MILLISECOND, 0);
239         cal2.set(2004, 6, 9, 13, 45, 0);
240         cal2.set(Calendar.MILLISECOND, 0);
241         assertTrue(DateUtils.isSameLocalTime(cal1, cal2));
242 
243         final Calendar cal3 = Calendar.getInstance();
244         final Calendar cal4 = Calendar.getInstance();
245         cal3.set(2004, 6, 9, 4,  0, 0);
246         cal4.set(2004, 6, 9, 16, 0, 0);
247         cal3.set(Calendar.MILLISECOND, 0);
248         cal4.set(Calendar.MILLISECOND, 0);
249         assertFalse("LANG-677", DateUtils.isSameLocalTime(cal3, cal4));
250         
251         cal2.set(2004, 6, 9, 11, 45, 0);
252         assertFalse(DateUtils.isSameLocalTime(cal1, cal2));
253         try {
254             DateUtils.isSameLocalTime((Calendar) null, (Calendar) null);
255             fail();
256         } catch (final IllegalArgumentException ex) {}
257     }
258     
259     //-----------------------------------------------------------------------
260     @Test
261     public void testParseDate() throws Exception {
262         final GregorianCalendar cal = new GregorianCalendar(1972, 11, 3);
263         String dateStr = "1972-12-03";
264         final String[] parsers = new String[] {"yyyy'-'DDD", "yyyy'-'MM'-'dd", "yyyyMMdd"};
265         Date date = DateUtils.parseDate(dateStr, parsers);
266         assertEquals(cal.getTime(), date);
267         
268         dateStr = "1972-338";
269         date = DateUtils.parseDate(dateStr, parsers);
270         assertEquals(cal.getTime(), date);
271         
272         dateStr = "19721203";
273         date = DateUtils.parseDate(dateStr, parsers);
274         assertEquals(cal.getTime(), date);
275         
276         try {
277             DateUtils.parseDate("PURPLE", parsers);
278             fail();
279         } catch (final ParseException ex) {}
280         try {
281             DateUtils.parseDate("197212AB", parsers);
282             fail();
283         } catch (final ParseException ex) {}
284         try {
285             DateUtils.parseDate(null, parsers);
286             fail();
287         } catch (final IllegalArgumentException ex) {}
288         try {
289             DateUtils.parseDate(dateStr, (String[]) null);
290             fail();
291         } catch (final IllegalArgumentException ex) {}
292         try {
293             DateUtils.parseDate(dateStr, new String[0]);
294             fail();
295         } catch (final ParseException ex) {}
296     }
297     // LANG-486
298     @Test
299     public void testParseDateWithLeniency() throws Exception {
300         final GregorianCalendar cal = new GregorianCalendar(1998, 6, 30);
301         final String dateStr = "02 942, 1996";
302         final String[] parsers = new String[] {"MM DDD, yyyy"};
303         
304         Date date = DateUtils.parseDate(dateStr, parsers);
305         assertEquals(cal.getTime(), date);
306         
307         try {
308             date = DateUtils.parseDateStrictly(dateStr, parsers);
309             fail();
310         } catch (final ParseException ex) {}
311     }
312 
313     //-----------------------------------------------------------------------
314     @Test
315     public void testAddYears() throws Exception {
316         final Date base = new Date(MILLIS_TEST);
317         Date result = DateUtils.addYears(base, 0);
318         assertNotSame(base, result);
319         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
320         assertDate(result, 2000, 6, 5, 4, 3, 2, 1);
321         
322         result = DateUtils.addYears(base, 1);
323         assertNotSame(base, result);
324         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
325         assertDate(result, 2001, 6, 5, 4, 3, 2, 1);
326         
327         result = DateUtils.addYears(base, -1);
328         assertNotSame(base, result);
329         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
330         assertDate(result, 1999, 6, 5, 4, 3, 2, 1);
331     }
332 
333     //-----------------------------------------------------------------------
334     @Test
335     public void testAddMonths() throws Exception {
336         final Date base = new Date(MILLIS_TEST);
337         Date result = DateUtils.addMonths(base, 0);
338         assertNotSame(base, result);
339         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
340         assertDate(result, 2000, 6, 5, 4, 3, 2, 1);
341         
342         result = DateUtils.addMonths(base, 1);
343         assertNotSame(base, result);
344         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
345         assertDate(result, 2000, 7, 5, 4, 3, 2, 1);
346         
347         result = DateUtils.addMonths(base, -1);
348         assertNotSame(base, result);
349         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
350         assertDate(result, 2000, 5, 5, 4, 3, 2, 1);
351     }
352 
353     //-----------------------------------------------------------------------
354     @Test
355     public void testAddWeeks() throws Exception {
356         final Date base = new Date(MILLIS_TEST);
357         Date result = DateUtils.addWeeks(base, 0);
358         assertNotSame(base, result);
359         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
360         assertDate(result, 2000, 6, 5, 4, 3, 2, 1);
361         
362         result = DateUtils.addWeeks(base, 1);
363         assertNotSame(base, result);
364         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
365         assertDate(result, 2000, 6, 12, 4, 3, 2, 1);
366         
367         result = DateUtils.addWeeks(base, -1);
368         assertNotSame(base, result);
369         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);      // july
370         assertDate(result, 2000, 5, 28, 4, 3, 2, 1);   // june
371     }
372 
373     //-----------------------------------------------------------------------
374     @Test
375     public void testAddDays() throws Exception {
376         final Date base = new Date(MILLIS_TEST);
377         Date result = DateUtils.addDays(base, 0);
378         assertNotSame(base, result);
379         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
380         assertDate(result, 2000, 6, 5, 4, 3, 2, 1);
381         
382         result = DateUtils.addDays(base, 1);
383         assertNotSame(base, result);
384         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
385         assertDate(result, 2000, 6, 6, 4, 3, 2, 1);
386         
387         result = DateUtils.addDays(base, -1);
388         assertNotSame(base, result);
389         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
390         assertDate(result, 2000, 6, 4, 4, 3, 2, 1);
391     }
392 
393     //-----------------------------------------------------------------------
394     @Test
395     public void testAddHours() throws Exception {
396         final Date base = new Date(MILLIS_TEST);
397         Date result = DateUtils.addHours(base, 0);
398         assertNotSame(base, result);
399         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
400         assertDate(result, 2000, 6, 5, 4, 3, 2, 1);
401         
402         result = DateUtils.addHours(base, 1);
403         assertNotSame(base, result);
404         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
405         assertDate(result, 2000, 6, 5, 5, 3, 2, 1);
406         
407         result = DateUtils.addHours(base, -1);
408         assertNotSame(base, result);
409         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
410         assertDate(result, 2000, 6, 5, 3, 3, 2, 1);
411     }
412 
413     //-----------------------------------------------------------------------
414     @Test
415     public void testAddMinutes() throws Exception {
416         final Date base = new Date(MILLIS_TEST);
417         Date result = DateUtils.addMinutes(base, 0);
418         assertNotSame(base, result);
419         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
420         assertDate(result, 2000, 6, 5, 4, 3, 2, 1);
421         
422         result = DateUtils.addMinutes(base, 1);
423         assertNotSame(base, result);
424         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
425         assertDate(result, 2000, 6, 5, 4, 4, 2, 1);
426         
427         result = DateUtils.addMinutes(base, -1);
428         assertNotSame(base, result);
429         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
430         assertDate(result, 2000, 6, 5, 4, 2, 2, 1);
431     }
432 
433     //-----------------------------------------------------------------------
434     @Test
435     public void testAddSeconds() throws Exception {
436         final Date base = new Date(MILLIS_TEST);
437         Date result = DateUtils.addSeconds(base, 0);
438         assertNotSame(base, result);
439         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
440         assertDate(result, 2000, 6, 5, 4, 3, 2, 1);
441         
442         result = DateUtils.addSeconds(base, 1);
443         assertNotSame(base, result);
444         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
445         assertDate(result, 2000, 6, 5, 4, 3, 3, 1);
446         
447         result = DateUtils.addSeconds(base, -1);
448         assertNotSame(base, result);
449         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
450         assertDate(result, 2000, 6, 5, 4, 3, 1, 1);
451     }
452 
453     //-----------------------------------------------------------------------
454     @Test
455     public void testAddMilliseconds() throws Exception {
456         final Date base = new Date(MILLIS_TEST);
457         Date result = DateUtils.addMilliseconds(base, 0);
458         assertNotSame(base, result);
459         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
460         assertDate(result, 2000, 6, 5, 4, 3, 2, 1);
461         
462         result = DateUtils.addMilliseconds(base, 1);
463         assertNotSame(base, result);
464         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
465         assertDate(result, 2000, 6, 5, 4, 3, 2, 2);
466         
467         result = DateUtils.addMilliseconds(base, -1);
468         assertNotSame(base, result);
469         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
470         assertDate(result, 2000, 6, 5, 4, 3, 2, 0);
471     }
472 
473     // -----------------------------------------------------------------------
474     @Test
475     public void testSetYears() throws Exception {
476         final Date base = new Date(MILLIS_TEST);
477         Date result = DateUtils.setYears(base, 2000);
478         assertNotSame(base, result);
479         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
480         assertDate(result, 2000, 6, 5, 4, 3, 2, 1);
481 
482         result = DateUtils.setYears(base, 2008);
483         assertNotSame(base, result);
484         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
485         assertDate(result, 2008, 6, 5, 4, 3, 2, 1);
486 
487         result = DateUtils.setYears(base, 2005);
488         assertNotSame(base, result);
489         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
490         assertDate(result, 2005, 6, 5, 4, 3, 2, 1);
491     }
492 
493     // -----------------------------------------------------------------------
494     @Test
495     public void testSetMonths() throws Exception {
496         final Date base = new Date(MILLIS_TEST);
497         Date result = DateUtils.setMonths(base, 5);
498         assertNotSame(base, result);
499         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
500         assertDate(result, 2000, 5, 5, 4, 3, 2, 1);
501 
502         result = DateUtils.setMonths(base, 1);
503         assertNotSame(base, result);
504         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
505         assertDate(result, 2000, 1, 5, 4, 3, 2, 1);
506 
507         try {
508             result = DateUtils.setMonths(base, 12);
509             fail("DateUtils.setMonths did not throw an expected IllegalArguementException.");
510         } catch (final IllegalArgumentException e) {
511 
512         }
513     }
514 
515     // -----------------------------------------------------------------------
516     @Test
517     public void testSetDays() throws Exception {
518         final Date base = new Date(MILLIS_TEST);
519         Date result = DateUtils.setDays(base, 1);
520         assertNotSame(base, result);
521         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
522         assertDate(result, 2000, 6, 1, 4, 3, 2, 1);
523 
524         result = DateUtils.setDays(base, 29);
525         assertNotSame(base, result);
526         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
527         assertDate(result, 2000, 6, 29, 4, 3, 2, 1);
528 
529         try {
530             result = DateUtils.setDays(base, 32);
531             fail("DateUtils.setDays did not throw an expected IllegalArguementException.");
532         } catch (final IllegalArgumentException e) {
533 
534         }
535     }
536 
537     // -----------------------------------------------------------------------
538     @Test
539     public void testSetHours() throws Exception {
540         final Date base = new Date(MILLIS_TEST);
541         Date result = DateUtils.setHours(base, 0);
542         assertNotSame(base, result);
543         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
544         assertDate(result, 2000, 6, 5, 0, 3, 2, 1);
545 
546         result = DateUtils.setHours(base, 23);
547         assertNotSame(base, result);
548         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
549         assertDate(result, 2000, 6, 5, 23, 3, 2, 1);
550 
551         try {
552             result = DateUtils.setHours(base, 24);
553             fail("DateUtils.setHours did not throw an expected IllegalArguementException.");
554         } catch (final IllegalArgumentException e) {
555 
556         }
557     }
558 
559     // -----------------------------------------------------------------------
560     @Test
561     public void testSetMinutes() throws Exception {
562         final Date base = new Date(MILLIS_TEST);
563         Date result = DateUtils.setMinutes(base, 0);
564         assertNotSame(base, result);
565         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
566         assertDate(result, 2000, 6, 5, 4, 0, 2, 1);
567 
568         result = DateUtils.setMinutes(base, 59);
569         assertNotSame(base, result);
570         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
571         assertDate(result, 2000, 6, 5, 4, 59, 2, 1);
572 
573         try {
574             result = DateUtils.setMinutes(base, 60);
575             fail("DateUtils.setMinutes did not throw an expected IllegalArguementException.");
576         } catch (final IllegalArgumentException e) {
577 
578         }
579     }
580 
581     // -----------------------------------------------------------------------
582     @Test
583     public void testSetSeconds() throws Exception {
584         final Date base = new Date(MILLIS_TEST);
585         Date result = DateUtils.setSeconds(base, 0);
586         assertNotSame(base, result);
587         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
588         assertDate(result, 2000, 6, 5, 4, 3, 0, 1);
589 
590         result = DateUtils.setSeconds(base, 59);
591         assertNotSame(base, result);
592         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
593         assertDate(result, 2000, 6, 5, 4, 3, 59, 1);
594 
595         try {
596             result = DateUtils.setSeconds(base, 60);
597             fail("DateUtils.setSeconds did not throw an expected IllegalArguementException.");
598         } catch (final IllegalArgumentException e) {
599 
600         }
601     }
602 
603     // -----------------------------------------------------------------------
604     @Test
605     public void testSetMilliseconds() throws Exception {
606         final Date base = new Date(MILLIS_TEST);
607         Date result = DateUtils.setMilliseconds(base, 0);
608         assertNotSame(base, result);
609         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
610         assertDate(result, 2000, 6, 5, 4, 3, 2, 0);
611 
612         result = DateUtils.setMilliseconds(base, 999);
613         assertNotSame(base, result);
614         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
615         assertDate(result, 2000, 6, 5, 4, 3, 2, 999);
616 
617         try {
618             result = DateUtils.setMilliseconds(base, 1000);
619             fail("DateUtils.setMilliseconds did not throw an expected IllegalArguementException.");
620         } catch (final IllegalArgumentException e) {
621 
622         }
623     }
624 
625     //-----------------------------------------------------------------------
626     private void assertDate(final Date date, final int year, final int month, final int day, final int hour, final int min, final int sec, final int mil) throws Exception {
627         final GregorianCalendar cal = new GregorianCalendar();
628         cal.setTime(date);
629         assertEquals(year, cal.get(Calendar.YEAR));
630         assertEquals(month, cal.get(Calendar.MONTH));
631         assertEquals(day, cal.get(Calendar.DAY_OF_MONTH));
632         assertEquals(hour, cal.get(Calendar.HOUR_OF_DAY));
633         assertEquals(min, cal.get(Calendar.MINUTE));
634         assertEquals(sec, cal.get(Calendar.SECOND));
635         assertEquals(mil, cal.get(Calendar.MILLISECOND));
636     }
637 
638     //-----------------------------------------------------------------------
639     @Test
640     public void testToCalendar() {
641         assertEquals("Failed to convert to a Calendar and back", date1, DateUtils.toCalendar(date1).getTime());
642         try {
643             DateUtils.toCalendar(null);
644             fail("Expected NullPointerException to be thrown");
645         } catch(final NullPointerException npe) {
646             // expected
647         }
648     }
649 
650     //-----------------------------------------------------------------------
651     /**
652      * Tests various values with the round method
653      */
654     @Test
655     public void testRound() throws Exception {
656         // tests for public static Date round(Date date, int field)
657         assertEquals("round year-1 failed",
658                 dateParser.parse("January 1, 2002"),
659                 DateUtils.round(date1, Calendar.YEAR));
660         assertEquals("round year-2 failed",
661                 dateParser.parse("January 1, 2002"),
662                 DateUtils.round(date2, Calendar.YEAR));
663         assertEquals("round month-1 failed",
664                 dateParser.parse("February 1, 2002"),
665                 DateUtils.round(date1, Calendar.MONTH));
666         assertEquals("round month-2 failed",
667                 dateParser.parse("December 1, 2001"),
668                 DateUtils.round(date2, Calendar.MONTH));
669         assertEquals("round semimonth-0 failed",
670                 dateParser.parse("February 1, 2002"),
671                 DateUtils.round(date0, DateUtils.SEMI_MONTH));
672         assertEquals("round semimonth-1 failed",
673                 dateParser.parse("February 16, 2002"),
674                 DateUtils.round(date1, DateUtils.SEMI_MONTH));
675         assertEquals("round semimonth-2 failed",
676                 dateParser.parse("November 16, 2001"),
677                 DateUtils.round(date2, DateUtils.SEMI_MONTH));
678         
679         
680         assertEquals("round date-1 failed",
681                 dateParser.parse("February 13, 2002"),
682                 DateUtils.round(date1, Calendar.DATE));
683         assertEquals("round date-2 failed",
684                 dateParser.parse("November 18, 2001"),
685                 DateUtils.round(date2, Calendar.DATE));
686         assertEquals("round hour-1 failed",
687                 dateTimeParser.parse("February 12, 2002 13:00:00.000"),
688                 DateUtils.round(date1, Calendar.HOUR));
689         assertEquals("round hour-2 failed",
690                 dateTimeParser.parse("November 18, 2001 1:00:00.000"),
691                 DateUtils.round(date2, Calendar.HOUR));
692         assertEquals("round minute-1 failed",
693                 dateTimeParser.parse("February 12, 2002 12:35:00.000"),
694                 DateUtils.round(date1, Calendar.MINUTE));
695         assertEquals("round minute-2 failed",
696                 dateTimeParser.parse("November 18, 2001 1:23:00.000"),
697                 DateUtils.round(date2, Calendar.MINUTE));
698         assertEquals("round second-1 failed",
699                 dateTimeParser.parse("February 12, 2002 12:34:57.000"),
700                 DateUtils.round(date1, Calendar.SECOND));
701         assertEquals("round second-2 failed",
702                 dateTimeParser.parse("November 18, 2001 1:23:11.000"),
703                 DateUtils.round(date2, Calendar.SECOND));
704         assertEquals("round ampm-1 failed",
705                 dateTimeParser.parse("February 3, 2002 00:00:00.000"),
706                 DateUtils.round(dateAmPm1, Calendar.AM_PM));
707         assertEquals("round ampm-2 failed",
708                 dateTimeParser.parse("February 3, 2002 12:00:00.000"),
709                 DateUtils.round(dateAmPm2, Calendar.AM_PM));
710         assertEquals("round ampm-3 failed",
711                 dateTimeParser.parse("February 3, 2002 12:00:00.000"),
712                 DateUtils.round(dateAmPm3, Calendar.AM_PM));
713         assertEquals("round ampm-4 failed",
714                 dateTimeParser.parse("February 4, 2002 00:00:00.000"),
715                 DateUtils.round(dateAmPm4, Calendar.AM_PM));
716 
717         // tests for public static Date round(Object date, int field)
718         assertEquals("round year-1 failed",
719                 dateParser.parse("January 1, 2002"),
720                 DateUtils.round((Object) date1, Calendar.YEAR));
721         assertEquals("round year-2 failed",
722                 dateParser.parse("January 1, 2002"),
723                 DateUtils.round((Object) date2, Calendar.YEAR));
724         assertEquals("round month-1 failed",
725                 dateParser.parse("February 1, 2002"),
726                 DateUtils.round((Object) date1, Calendar.MONTH));
727         assertEquals("round month-2 failed",
728                 dateParser.parse("December 1, 2001"),
729                 DateUtils.round((Object) date2, Calendar.MONTH));
730         assertEquals("round semimonth-1 failed",
731                 dateParser.parse("February 16, 2002"),
732                 DateUtils.round((Object) date1, DateUtils.SEMI_MONTH));
733         assertEquals("round semimonth-2 failed",
734                 dateParser.parse("November 16, 2001"),
735                 DateUtils.round((Object) date2, DateUtils.SEMI_MONTH));
736         assertEquals("round date-1 failed",
737                 dateParser.parse("February 13, 2002"),
738                 DateUtils.round((Object) date1, Calendar.DATE));
739         assertEquals("round date-2 failed",
740                 dateParser.parse("November 18, 2001"),
741                 DateUtils.round((Object) date2, Calendar.DATE));
742         assertEquals("round hour-1 failed",
743                 dateTimeParser.parse("February 12, 2002 13:00:00.000"),
744                 DateUtils.round((Object) date1, Calendar.HOUR));
745         assertEquals("round hour-2 failed",
746                 dateTimeParser.parse("November 18, 2001 1:00:00.000"),
747                 DateUtils.round((Object) date2, Calendar.HOUR));
748         assertEquals("round minute-1 failed",
749                 dateTimeParser.parse("February 12, 2002 12:35:00.000"),
750                 DateUtils.round((Object) date1, Calendar.MINUTE));
751         assertEquals("round minute-2 failed",
752                 dateTimeParser.parse("November 18, 2001 1:23:00.000"),
753                 DateUtils.round((Object) date2, Calendar.MINUTE));
754         assertEquals("round second-1 failed",
755                 dateTimeParser.parse("February 12, 2002 12:34:57.000"),
756                 DateUtils.round((Object) date1, Calendar.SECOND));
757         assertEquals("round second-2 failed",
758                 dateTimeParser.parse("November 18, 2001 1:23:11.000"),
759                 DateUtils.round((Object) date2, Calendar.SECOND));
760         assertEquals("round calendar second-1 failed",
761                 dateTimeParser.parse("February 12, 2002 12:34:57.000"),
762                 DateUtils.round((Object) cal1, Calendar.SECOND));
763         assertEquals("round calendar second-2 failed",
764                 dateTimeParser.parse("November 18, 2001 1:23:11.000"),
765                 DateUtils.round((Object) cal2, Calendar.SECOND));
766         assertEquals("round ampm-1 failed",
767                 dateTimeParser.parse("February 3, 2002 00:00:00.000"),
768                 DateUtils.round((Object) dateAmPm1, Calendar.AM_PM));
769         assertEquals("round ampm-2 failed",
770                 dateTimeParser.parse("February 3, 2002 12:00:00.000"),
771                 DateUtils.round((Object) dateAmPm2, Calendar.AM_PM));
772         assertEquals("round ampm-3 failed",
773                 dateTimeParser.parse("February 3, 2002 12:00:00.000"),
774                 DateUtils.round((Object) dateAmPm3, Calendar.AM_PM));
775         assertEquals("round ampm-4 failed",
776                 dateTimeParser.parse("February 4, 2002 00:00:00.000"),
777                 DateUtils.round((Object) dateAmPm4, Calendar.AM_PM));
778 
779         try {
780             DateUtils.round((Date) null, Calendar.SECOND);
781             fail();
782         } catch (final IllegalArgumentException ex) {}
783         try {
784             DateUtils.round((Calendar) null, Calendar.SECOND);
785             fail();
786         } catch (final IllegalArgumentException ex) {}
787         try {
788             DateUtils.round((Object) null, Calendar.SECOND);
789             fail();
790         } catch (final IllegalArgumentException ex) {}
791         try {
792             DateUtils.round("", Calendar.SECOND);
793             fail();
794         } catch (final ClassCastException ex) {}
795         try {
796             DateUtils.round(date1, -9999);
797             fail();
798         } catch(final IllegalArgumentException ex) {}
799 
800         assertEquals("round ampm-1 failed",
801                 dateTimeParser.parse("February 3, 2002 00:00:00.000"),
802                 DateUtils.round((Object) calAmPm1, Calendar.AM_PM));
803         assertEquals("round ampm-2 failed",
804                 dateTimeParser.parse("February 3, 2002 12:00:00.000"),
805                 DateUtils.round((Object) calAmPm2, Calendar.AM_PM));
806         assertEquals("round ampm-3 failed",
807                 dateTimeParser.parse("February 3, 2002 12:00:00.000"),
808                 DateUtils.round((Object) calAmPm3, Calendar.AM_PM));
809         assertEquals("round ampm-4 failed",
810                 dateTimeParser.parse("February 4, 2002 00:00:00.000"),
811                 DateUtils.round((Object) calAmPm4, Calendar.AM_PM));
812         
813         // Fix for http://issues.apache.org/bugzilla/show_bug.cgi?id=25560 / LANG-13
814         // Test rounding across the beginning of daylight saving time
815         TimeZone.setDefault(zone);
816         dateTimeParser.setTimeZone(zone);
817         assertEquals("round MET date across DST change-over",
818                 dateTimeParser.parse("March 30, 2003 00:00:00.000"),
819                 DateUtils.round(date4, Calendar.DATE));
820         assertEquals("round MET date across DST change-over",
821                 dateTimeParser.parse("March 30, 2003 00:00:00.000"),
822                 DateUtils.round((Object) cal4, Calendar.DATE));
823         assertEquals("round MET date across DST change-over",
824                 dateTimeParser.parse("March 30, 2003 00:00:00.000"),
825                 DateUtils.round(date5, Calendar.DATE));
826         assertEquals("round MET date across DST change-over",
827                 dateTimeParser.parse("March 30, 2003 00:00:00.000"),
828                 DateUtils.round((Object) cal5, Calendar.DATE));
829         assertEquals("round MET date across DST change-over",
830                 dateTimeParser.parse("March 30, 2003 00:00:00.000"),
831                 DateUtils.round(date6, Calendar.DATE));
832         assertEquals("round MET date across DST change-over",
833                 dateTimeParser.parse("March 30, 2003 00:00:00.000"),
834                 DateUtils.round((Object) cal6, Calendar.DATE));
835         assertEquals("round MET date across DST change-over",
836                 dateTimeParser.parse("March 30, 2003 00:00:00.000"),
837                 DateUtils.round(date7, Calendar.DATE));
838         assertEquals("round MET date across DST change-over",
839                 dateTimeParser.parse("March 30, 2003 00:00:00.000"),
840                 DateUtils.round((Object) cal7, Calendar.DATE));
841         
842         assertEquals("round MET date across DST change-over",
843                 dateTimeParser.parse("March 30, 2003 01:00:00.000"),
844                 DateUtils.round(date4, Calendar.HOUR_OF_DAY));
845         assertEquals("round MET date across DST change-over",
846                 dateTimeParser.parse("March 30, 2003 01:00:00.000"),
847                 DateUtils.round((Object) cal4, Calendar.HOUR_OF_DAY));
848         if (SystemUtils.isJavaVersionAtLeast(JAVA_1_4)) {
849             assertEquals("round MET date across DST change-over",
850                     dateTimeParser.parse("March 30, 2003 03:00:00.000"),
851                     DateUtils.round(date5, Calendar.HOUR_OF_DAY));
852             assertEquals("round MET date across DST change-over",
853                     dateTimeParser.parse("March 30, 2003 03:00:00.000"),
854                     DateUtils.round((Object) cal5, Calendar.HOUR_OF_DAY));
855             assertEquals("round MET date across DST change-over",
856                     dateTimeParser.parse("March 30, 2003 03:00:00.000"),
857                     DateUtils.round(date6, Calendar.HOUR_OF_DAY));
858             assertEquals("round MET date across DST change-over",
859                     dateTimeParser.parse("March 30, 2003 03:00:00.000"),
860                     DateUtils.round((Object) cal6, Calendar.HOUR_OF_DAY));
861             assertEquals("round MET date across DST change-over",
862                     dateTimeParser.parse("March 30, 2003 04:00:00.000"),
863                     DateUtils.round(date7, Calendar.HOUR_OF_DAY));
864             assertEquals("round MET date across DST change-over",
865                     dateTimeParser.parse("March 30, 2003 04:00:00.000"),
866                     DateUtils.round((Object) cal7, Calendar.HOUR_OF_DAY));
867         } else {
868             this.warn("WARNING: Some date rounding tests not run since the current version is " + SystemUtils.JAVA_SPECIFICATION_VERSION);
869         }
870         TimeZone.setDefault(defaultZone);
871         dateTimeParser.setTimeZone(defaultZone);
872     }
873 
874     /**
875      * Tests the Changes Made by LANG-346 to the DateUtils.modify() private method invoked
876      * by DateUtils.round().
877      */
878     @Test
879     public void testRoundLang346() throws Exception
880     {
881         TimeZone.setDefault(defaultZone);
882         dateTimeParser.setTimeZone(defaultZone);
883         final Calendar testCalendar = Calendar.getInstance();
884         testCalendar.set(2007, 6, 2, 8, 8, 50);
885         Date date = testCalendar.getTime();
886         assertEquals("Minute Round Up Failed",
887                      dateTimeParser.parse("July 2, 2007 08:09:00.000"),
888                      DateUtils.round(date, Calendar.MINUTE));
889 
890         testCalendar.set(2007, 6, 2, 8, 8, 20);
891         date = testCalendar.getTime();
892         assertEquals("Minute No Round Failed",
893                      dateTimeParser.parse("July 2, 2007 08:08:00.000"),
894                      DateUtils.round(date, Calendar.MINUTE));
895 
896         testCalendar.set(2007, 6, 2, 8, 8, 50);
897         testCalendar.set(Calendar.MILLISECOND, 600);
898         date = testCalendar.getTime();
899 
900         assertEquals("Second Round Up with 600 Milli Seconds Failed",
901                      dateTimeParser.parse("July 2, 2007 08:08:51.000"),
902                      DateUtils.round(date, Calendar.SECOND));
903 
904         testCalendar.set(2007, 6, 2, 8, 8, 50);
905         testCalendar.set(Calendar.MILLISECOND, 200);
906         date = testCalendar.getTime();
907         assertEquals("Second Round Down with 200 Milli Seconds Failed",
908                      dateTimeParser.parse("July 2, 2007 08:08:50.000"),
909                      DateUtils.round(date, Calendar.SECOND));
910 
911         testCalendar.set(2007, 6, 2, 8, 8, 20);
912         testCalendar.set(Calendar.MILLISECOND, 600);
913         date = testCalendar.getTime();
914         assertEquals("Second Round Up with 200 Milli Seconds Failed",
915                      dateTimeParser.parse("July 2, 2007 08:08:21.000"),
916                      DateUtils.round(date, Calendar.SECOND));
917 
918         testCalendar.set(2007, 6, 2, 8, 8, 20);
919         testCalendar.set(Calendar.MILLISECOND, 200);
920         date = testCalendar.getTime();
921         assertEquals("Second Round Down with 200 Milli Seconds Failed",
922                      dateTimeParser.parse("July 2, 2007 08:08:20.000"),
923                      DateUtils.round(date, Calendar.SECOND));
924 
925         testCalendar.set(2007, 6, 2, 8, 8, 50);
926         date = testCalendar.getTime();
927         assertEquals("Hour Round Down Failed",
928                      dateTimeParser.parse("July 2, 2007 08:00:00.000"),
929                      DateUtils.round(date, Calendar.HOUR));
930 
931         testCalendar.set(2007, 6, 2, 8, 31, 50);
932         date = testCalendar.getTime();
933         assertEquals("Hour Round Up Failed",
934                      dateTimeParser.parse("July 2, 2007 09:00:00.000"),
935                      DateUtils.round(date, Calendar.HOUR));
936     }
937 
938     /**
939      * Tests various values with the trunc method
940      */
941     @Test
942     public void testTruncate() throws Exception {
943         // tests public static Date truncate(Date date, int field)
944         assertEquals("truncate year-1 failed",
945                 dateParser.parse("January 1, 2002"),
946                 DateUtils.truncate(date1, Calendar.YEAR));
947         assertEquals("truncate year-2 failed",
948                 dateParser.parse("January 1, 2001"),
949                 DateUtils.truncate(date2, Calendar.YEAR));
950         assertEquals("truncate month-1 failed",
951                 dateParser.parse("February 1, 2002"),
952                 DateUtils.truncate(date1, Calendar.MONTH));
953         assertEquals("truncate month-2 failed",
954                 dateParser.parse("November 1, 2001"),
955                 DateUtils.truncate(date2, Calendar.MONTH));
956         assertEquals("truncate semimonth-1 failed",
957                 dateParser.parse("February 1, 2002"),
958                 DateUtils.truncate(date1, DateUtils.SEMI_MONTH));
959         assertEquals("truncate semimonth-2 failed",
960                 dateParser.parse("November 16, 2001"),
961                 DateUtils.truncate(date2, DateUtils.SEMI_MONTH));
962         assertEquals("truncate date-1 failed",
963                 dateParser.parse("February 12, 2002"),
964                 DateUtils.truncate(date1, Calendar.DATE));
965         assertEquals("truncate date-2 failed",
966                 dateParser.parse("November 18, 2001"),
967                 DateUtils.truncate(date2, Calendar.DATE));
968         assertEquals("truncate hour-1 failed",
969                 dateTimeParser.parse("February 12, 2002 12:00:00.000"),
970                 DateUtils.truncate(date1, Calendar.HOUR));
971         assertEquals("truncate hour-2 failed",
972                 dateTimeParser.parse("November 18, 2001 1:00:00.000"),
973                 DateUtils.truncate(date2, Calendar.HOUR));
974         assertEquals("truncate minute-1 failed",
975                 dateTimeParser.parse("February 12, 2002 12:34:00.000"),
976                 DateUtils.truncate(date1, Calendar.MINUTE));
977         assertEquals("truncate minute-2 failed",
978                 dateTimeParser.parse("November 18, 2001 1:23:00.000"),
979                 DateUtils.truncate(date2, Calendar.MINUTE));
980         assertEquals("truncate second-1 failed",
981                 dateTimeParser.parse("February 12, 2002 12:34:56.000"),
982                 DateUtils.truncate(date1, Calendar.SECOND));
983         assertEquals("truncate second-2 failed",
984                 dateTimeParser.parse("November 18, 2001 1:23:11.000"),
985                 DateUtils.truncate(date2, Calendar.SECOND));
986         assertEquals("truncate ampm-1 failed",
987                 dateTimeParser.parse("February 3, 2002 00:00:00.000"),
988                 DateUtils.truncate(dateAmPm1, Calendar.AM_PM));
989         assertEquals("truncate ampm-2 failed",
990                 dateTimeParser.parse("February 3, 2002 00:00:00.000"),
991                 DateUtils.truncate(dateAmPm2, Calendar.AM_PM));
992         assertEquals("truncate ampm-3 failed",
993                 dateTimeParser.parse("February 3, 2002 12:00:00.000"),
994                 DateUtils.truncate(dateAmPm3, Calendar.AM_PM));
995         assertEquals("truncate ampm-4 failed",
996                 dateTimeParser.parse("February 3, 2002 12:00:00.000"),
997                 DateUtils.truncate(dateAmPm4, Calendar.AM_PM));
998 
999         // tests public static Date truncate(Object date, int field)
1000         assertEquals("truncate year-1 failed",
1001                 dateParser.parse("January 1, 2002"),
1002                 DateUtils.truncate((Object) date1, Calendar.YEAR));
1003         assertEquals("truncate year-2 failed",
1004                 dateParser.parse("January 1, 2001"),
1005                 DateUtils.truncate((Object) date2, Calendar.YEAR));
1006         assertEquals("truncate month-1 failed",
1007                 dateParser.parse("February 1, 2002"),
1008                 DateUtils.truncate((Object) date1, Calendar.MONTH));
1009         assertEquals("truncate month-2 failed",
1010                 dateParser.parse("November 1, 2001"),
1011                 DateUtils.truncate((Object) date2, Calendar.MONTH));
1012         assertEquals("truncate semimonth-1 failed",
1013                 dateParser.parse("February 1, 2002"),
1014                 DateUtils.truncate((Object) date1, DateUtils.SEMI_MONTH));
1015         assertEquals("truncate semimonth-2 failed",
1016                 dateParser.parse("November 16, 2001"),
1017                 DateUtils.truncate((Object) date2, DateUtils.SEMI_MONTH));
1018         assertEquals("truncate date-1 failed",
1019                 dateParser.parse("February 12, 2002"),
1020                 DateUtils.truncate((Object) date1, Calendar.DATE));
1021         assertEquals("truncate date-2 failed",
1022                 dateParser.parse("November 18, 2001"),
1023                 DateUtils.truncate((Object) date2, Calendar.DATE));
1024         assertEquals("truncate hour-1 failed",
1025                 dateTimeParser.parse("February 12, 2002 12:00:00.000"),
1026                 DateUtils.truncate((Object) date1, Calendar.HOUR));
1027         assertEquals("truncate hour-2 failed",
1028                 dateTimeParser.parse("November 18, 2001 1:00:00.000"),
1029                 DateUtils.truncate((Object) date2, Calendar.HOUR));
1030         assertEquals("truncate minute-1 failed",
1031                 dateTimeParser.parse("February 12, 2002 12:34:00.000"),
1032                 DateUtils.truncate((Object) date1, Calendar.MINUTE));
1033         assertEquals("truncate minute-2 failed",
1034                 dateTimeParser.parse("November 18, 2001 1:23:00.000"),
1035                 DateUtils.truncate((Object) date2, Calendar.MINUTE));
1036         assertEquals("truncate second-1 failed",
1037                 dateTimeParser.parse("February 12, 2002 12:34:56.000"),
1038                 DateUtils.truncate((Object) date1, Calendar.SECOND));
1039         assertEquals("truncate second-2 failed",
1040                 dateTimeParser.parse("November 18, 2001 1:23:11.000"),
1041                 DateUtils.truncate((Object) date2, Calendar.SECOND));
1042         assertEquals("truncate ampm-1 failed",
1043                 dateTimeParser.parse("February 3, 2002 00:00:00.000"),
1044                 DateUtils.truncate((Object) dateAmPm1, Calendar.AM_PM));
1045         assertEquals("truncate ampm-2 failed",
1046                 dateTimeParser.parse("February 3, 2002 00:00:00.000"),
1047                 DateUtils.truncate((Object) dateAmPm2, Calendar.AM_PM));
1048         assertEquals("truncate ampm-3 failed",
1049                 dateTimeParser.parse("February 3, 2002 12:00:00.000"),
1050                 DateUtils.truncate((Object) dateAmPm3, Calendar.AM_PM));
1051         assertEquals("truncate ampm-4 failed",
1052                 dateTimeParser.parse("February 3, 2002 12:00:00.000"),
1053                 DateUtils.truncate((Object) dateAmPm4, Calendar.AM_PM));
1054         
1055         assertEquals("truncate calendar second-1 failed",
1056                 dateTimeParser.parse("February 12, 2002 12:34:56.000"),
1057                 DateUtils.truncate((Object) cal1, Calendar.SECOND));
1058         assertEquals("truncate calendar second-2 failed",
1059                 dateTimeParser.parse("November 18, 2001 1:23:11.000"),
1060                 DateUtils.truncate((Object) cal2, Calendar.SECOND));
1061         
1062         assertEquals("truncate ampm-1 failed",
1063                 dateTimeParser.parse("February 3, 2002 00:00:00.000"),
1064                 DateUtils.truncate((Object) calAmPm1, Calendar.AM_PM));
1065         assertEquals("truncate ampm-2 failed",
1066                 dateTimeParser.parse("February 3, 2002 00:00:00.000"),
1067                 DateUtils.truncate((Object) calAmPm2, Calendar.AM_PM));
1068         assertEquals("truncate ampm-3 failed",
1069                 dateTimeParser.parse("February 3, 2002 12:00:00.000"),
1070                 DateUtils.truncate((Object) calAmPm3, Calendar.AM_PM));
1071         assertEquals("truncate ampm-4 failed",
1072                 dateTimeParser.parse("February 3, 2002 12:00:00.000"),
1073                 DateUtils.truncate((Object) calAmPm4, Calendar.AM_PM));
1074         
1075         try {
1076             DateUtils.truncate((Date) null, Calendar.SECOND);
1077             fail();
1078         } catch (final IllegalArgumentException ex) {}
1079         try {
1080             DateUtils.truncate((Calendar) null, Calendar.SECOND);
1081             fail();
1082         } catch (final IllegalArgumentException ex) {}
1083         try {
1084             DateUtils.truncate((Object) null, Calendar.SECOND);
1085             fail();
1086         } catch (final IllegalArgumentException ex) {}
1087         try {
1088             DateUtils.truncate("", Calendar.SECOND);
1089             fail();
1090         } catch (final ClassCastException ex) {}
1091 
1092         // Fix for http://issues.apache.org/bugzilla/show_bug.cgi?id=25560
1093         // Test truncate across beginning of daylight saving time
1094         TimeZone.setDefault(zone);
1095         dateTimeParser.setTimeZone(zone);
1096         assertEquals("truncate MET date across DST change-over",
1097                 dateTimeParser.parse("March 30, 2003 00:00:00.000"),
1098                 DateUtils.truncate(date3, Calendar.DATE));
1099         assertEquals("truncate MET date across DST change-over",
1100                 dateTimeParser.parse("March 30, 2003 00:00:00.000"),
1101                 DateUtils.truncate((Object) cal3, Calendar.DATE));
1102         // Test truncate across end of daylight saving time
1103         assertEquals("truncate MET date across DST change-over",
1104                 dateTimeParser.parse("October 26, 2003 00:00:00.000"),
1105                 DateUtils.truncate(date8, Calendar.DATE));
1106         assertEquals("truncate MET date across DST change-over",
1107                 dateTimeParser.parse("October 26, 2003 00:00:00.000"),
1108                 DateUtils.truncate((Object) cal8, Calendar.DATE));
1109         TimeZone.setDefault(defaultZone);
1110         dateTimeParser.setTimeZone(defaultZone);
1111         
1112         // Bug 31395, large dates
1113         final Date endOfTime = new Date(Long.MAX_VALUE); // fyi: Sun Aug 17 07:12:55 CET 292278994 -- 807 millis
1114         final GregorianCalendar endCal = new GregorianCalendar();
1115         endCal.setTime(endOfTime);
1116         try {
1117             DateUtils.truncate(endCal, Calendar.DATE);
1118             fail();
1119         } catch (final ArithmeticException ex) {}
1120         endCal.set(Calendar.YEAR, 280000001);
1121         try {
1122             DateUtils.truncate(endCal, Calendar.DATE);
1123             fail();
1124         } catch (final ArithmeticException ex) {}
1125         endCal.set(Calendar.YEAR, 280000000);
1126         final Calendar cal = DateUtils.truncate(endCal, Calendar.DATE);
1127         assertEquals(0, cal.get(Calendar.HOUR));
1128     }
1129 
1130     /**
1131      * Tests for LANG-59
1132      *
1133      * see http://issues.apache.org/jira/browse/LANG-59
1134      */
1135     @Test
1136     public void testTruncateLang59() throws Exception {
1137         if (!SystemUtils.isJavaVersionAtLeast(JAVA_1_4)) {
1138             this.warn("WARNING: Test for LANG-59 not run since the current version is " + SystemUtils.JAVA_SPECIFICATION_VERSION);
1139             return;
1140         }
1141 
1142         // Set TimeZone to Mountain Time
1143         final TimeZone MST_MDT = TimeZone.getTimeZone("MST7MDT");
1144         TimeZone.setDefault(MST_MDT);
1145         final DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS z");
1146         format.setTimeZone(MST_MDT);
1147 
1148         final Date oct31_01MDT = new Date(1099206000000L); 
1149 
1150         final Date oct31MDT             = new Date(oct31_01MDT.getTime()       - 3600000L); // - 1 hour
1151         final Date oct31_01_02MDT       = new Date(oct31_01MDT.getTime()       + 120000L);  // + 2 minutes
1152         final Date oct31_01_02_03MDT    = new Date(oct31_01_02MDT.getTime()    + 3000L);    // + 3 seconds
1153         final Date oct31_01_02_03_04MDT = new Date(oct31_01_02_03MDT.getTime() + 4L);       // + 4 milliseconds
1154 
1155         assertEquals("Check 00:00:00.000", "2004-10-31 00:00:00.000 MDT", format.format(oct31MDT));
1156         assertEquals("Check 01:00:00.000", "2004-10-31 01:00:00.000 MDT", format.format(oct31_01MDT));
1157         assertEquals("Check 01:02:00.000", "2004-10-31 01:02:00.000 MDT", format.format(oct31_01_02MDT));
1158         assertEquals("Check 01:02:03.000", "2004-10-31 01:02:03.000 MDT", format.format(oct31_01_02_03MDT));
1159         assertEquals("Check 01:02:03.004", "2004-10-31 01:02:03.004 MDT", format.format(oct31_01_02_03_04MDT));
1160 
1161         // ------- Demonstrate Problem -------
1162         final Calendar gval = Calendar.getInstance();
1163         gval.setTime(new Date(oct31_01MDT.getTime()));
1164         gval.set(Calendar.MINUTE, gval.get(Calendar.MINUTE)); // set minutes to the same value
1165         assertEquals("Demonstrate Problem", gval.getTime().getTime(), oct31_01MDT.getTime() + 3600000L);
1166 
1167         // ---------- Test Truncate ----------
1168         assertEquals("Truncate Calendar.MILLISECOND",
1169                 oct31_01_02_03_04MDT, DateUtils.truncate(oct31_01_02_03_04MDT, Calendar.MILLISECOND));
1170 
1171         assertEquals("Truncate Calendar.SECOND",
1172                    oct31_01_02_03MDT, DateUtils.truncate(oct31_01_02_03_04MDT, Calendar.SECOND));
1173 
1174         assertEquals("Truncate Calendar.MINUTE",
1175                       oct31_01_02MDT, DateUtils.truncate(oct31_01_02_03_04MDT, Calendar.MINUTE));
1176 
1177         assertEquals("Truncate Calendar.HOUR_OF_DAY",
1178                          oct31_01MDT, DateUtils.truncate(oct31_01_02_03_04MDT, Calendar.HOUR_OF_DAY));
1179 
1180         assertEquals("Truncate Calendar.HOUR",
1181                          oct31_01MDT, DateUtils.truncate(oct31_01_02_03_04MDT, Calendar.HOUR));
1182 
1183         assertEquals("Truncate Calendar.DATE",
1184                             oct31MDT, DateUtils.truncate(oct31_01_02_03_04MDT, Calendar.DATE));
1185 
1186 
1187         // ---------- Test Round (down) ----------
1188         assertEquals("Round Calendar.MILLISECOND",
1189                 oct31_01_02_03_04MDT, DateUtils.round(oct31_01_02_03_04MDT, Calendar.MILLISECOND));
1190 
1191         assertEquals("Round Calendar.SECOND",
1192                    oct31_01_02_03MDT, DateUtils.round(oct31_01_02_03_04MDT, Calendar.SECOND));
1193 
1194         assertEquals("Round Calendar.MINUTE",
1195                       oct31_01_02MDT, DateUtils.round(oct31_01_02_03_04MDT, Calendar.MINUTE));
1196 
1197         assertEquals("Round Calendar.HOUR_OF_DAY",
1198                          oct31_01MDT, DateUtils.round(oct31_01_02_03_04MDT, Calendar.HOUR_OF_DAY));
1199 
1200         assertEquals("Round Calendar.HOUR",
1201                          oct31_01MDT, DateUtils.round(oct31_01_02_03_04MDT, Calendar.HOUR));
1202 
1203         assertEquals("Round Calendar.DATE",
1204                             oct31MDT, DateUtils.round(oct31_01_02_03_04MDT, Calendar.DATE));
1205 
1206         // restore default time zone
1207         TimeZone.setDefault(defaultZone);
1208     }
1209 
1210     // http://issues.apache.org/jira/browse/LANG-530
1211     @Test
1212     public void testLang530() throws ParseException {
1213         final Date d = new Date();
1214         final String isoDateStr = DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(d);
1215         final Date d2 = DateUtils.parseDate(isoDateStr, new String[] { DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern() });
1216         // the format loses milliseconds so have to reintroduce them
1217         assertEquals("Date not equal to itself ISO formatted and parsed", d.getTime(), d2.getTime() + d.getTime() % 1000); 
1218     }
1219     
1220     /**
1221      * Tests various values with the ceiling method
1222      */
1223     @Test
1224     public void testCeil() throws Exception {
1225         // test javadoc
1226         assertEquals("ceiling javadoc-1 failed",
1227                 dateTimeParser.parse("March 28, 2002 14:00:00.000"),
1228                 DateUtils.ceiling(
1229                     dateTimeParser.parse("March 28, 2002 13:45:01.231"),
1230                 Calendar.HOUR));
1231         assertEquals("ceiling javadoc-2 failed",
1232                 dateTimeParser.parse("April 1, 2002 00:00:00.000"),
1233                 DateUtils.ceiling(
1234                     dateTimeParser.parse("March 28, 2002 13:45:01.231"),
1235                 Calendar.MONTH));
1236 
1237         // tests public static Date ceiling(Date date, int field)
1238         assertEquals("ceiling year-1 failed",
1239                 dateParser.parse("January 1, 2003"),
1240                 DateUtils.ceiling(date1, Calendar.YEAR));
1241         assertEquals("ceiling year-2 failed",
1242                 dateParser.parse("January 1, 2002"),
1243                 DateUtils.ceiling(date2, Calendar.YEAR));
1244         assertEquals("ceiling month-1 failed",
1245                 dateParser.parse("March 1, 2002"),
1246                 DateUtils.ceiling(date1, Calendar.MONTH));
1247         assertEquals("ceiling month-2 failed",
1248                 dateParser.parse("December 1, 2001"),
1249                 DateUtils.ceiling(date2, Calendar.MONTH));
1250         assertEquals("ceiling semimonth-1 failed",
1251                 dateParser.parse("February 16, 2002"),
1252                 DateUtils.ceiling(date1, DateUtils.SEMI_MONTH));
1253         assertEquals("ceiling semimonth-2 failed",
1254                 dateParser.parse("December 1, 2001"),
1255                 DateUtils.ceiling(date2, DateUtils.SEMI_MONTH));
1256         assertEquals("ceiling date-1 failed",
1257                 dateParser.parse("February 13, 2002"),
1258                 DateUtils.ceiling(date1, Calendar.DATE));
1259         assertEquals("ceiling date-2 failed",
1260                 dateParser.parse("November 19, 2001"),
1261                 DateUtils.ceiling(date2, Calendar.DATE));
1262         assertEquals("ceiling hour-1 failed",
1263                 dateTimeParser.parse("February 12, 2002 13:00:00.000"),
1264                 DateUtils.ceiling(date1, Calendar.HOUR));
1265         assertEquals("ceiling hour-2 failed",
1266                 dateTimeParser.parse("November 18, 2001 2:00:00.000"),
1267                 DateUtils.ceiling(date2, Calendar.HOUR));
1268         assertEquals("ceiling minute-1 failed",
1269                 dateTimeParser.parse("February 12, 2002 12:35:00.000"),
1270                 DateUtils.ceiling(date1, Calendar.MINUTE));
1271         assertEquals("ceiling minute-2 failed",
1272                 dateTimeParser.parse("November 18, 2001 1:24:00.000"),
1273                 DateUtils.ceiling(date2, Calendar.MINUTE));
1274         assertEquals("ceiling second-1 failed",
1275                 dateTimeParser.parse("February 12, 2002 12:34:57.000"),
1276                 DateUtils.ceiling(date1, Calendar.SECOND));
1277         assertEquals("ceiling second-2 failed",
1278                 dateTimeParser.parse("November 18, 2001 1:23:12.000"),
1279                 DateUtils.ceiling(date2, Calendar.SECOND));
1280         assertEquals("ceiling ampm-1 failed",
1281                 dateTimeParser.parse("February 3, 2002 12:00:00.000"),
1282                 DateUtils.ceiling(dateAmPm1, Calendar.AM_PM));
1283         assertEquals("ceiling ampm-2 failed",
1284                 dateTimeParser.parse("February 3, 2002 12:00:00.000"),
1285                 DateUtils.ceiling(dateAmPm2, Calendar.AM_PM));
1286         assertEquals("ceiling ampm-3 failed",
1287                 dateTimeParser.parse("February 4, 2002 00:00:00.000"),
1288                 DateUtils.ceiling(dateAmPm3, Calendar.AM_PM));
1289         assertEquals("ceiling ampm-4 failed",
1290                 dateTimeParser.parse("February 4, 2002 00:00:00.000"),
1291                 DateUtils.ceiling(dateAmPm4, Calendar.AM_PM));
1292         
1293      // tests public static Date ceiling(Object date, int field)
1294         assertEquals("ceiling year-1 failed",
1295                 dateParser.parse("January 1, 2003"),
1296                 DateUtils.ceiling((Object) date1, Calendar.YEAR));
1297         assertEquals("ceiling year-2 failed",
1298                 dateParser.parse("January 1, 2002"),
1299                 DateUtils.ceiling((Object) date2, Calendar.YEAR));
1300         assertEquals("ceiling month-1 failed",
1301                 dateParser.parse("March 1, 2002"),
1302                 DateUtils.ceiling((Object) date1, Calendar.MONTH));
1303         assertEquals("ceiling month-2 failed",
1304                 dateParser.parse("December 1, 2001"),
1305                 DateUtils.ceiling((Object) date2, Calendar.MONTH));
1306         assertEquals("ceiling semimonth-1 failed",
1307                 dateParser.parse("February 16, 2002"),
1308                 DateUtils.ceiling((Object) date1, DateUtils.SEMI_MONTH));
1309         assertEquals("ceiling semimonth-2 failed",
1310                 dateParser.parse("December 1, 2001"),
1311                 DateUtils.ceiling((Object) date2, DateUtils.SEMI_MONTH));
1312         assertEquals("ceiling date-1 failed",
1313                 dateParser.parse("February 13, 2002"),
1314                 DateUtils.ceiling((Object) date1, Calendar.DATE));
1315         assertEquals("ceiling date-2 failed",
1316                 dateParser.parse("November 19, 2001"),
1317                 DateUtils.ceiling((Object) date2, Calendar.DATE));
1318         assertEquals("ceiling hour-1 failed",
1319                 dateTimeParser.parse("February 12, 2002 13:00:00.000"),
1320                 DateUtils.ceiling((Object) date1, Calendar.HOUR));
1321         assertEquals("ceiling hour-2 failed",
1322                 dateTimeParser.parse("November 18, 2001 2:00:00.000"),
1323                 DateUtils.ceiling((Object) date2, Calendar.HOUR));
1324         assertEquals("ceiling minute-1 failed",
1325                 dateTimeParser.parse("February 12, 2002 12:35:00.000"),
1326                 DateUtils.ceiling((Object) date1, Calendar.MINUTE));
1327         assertEquals("ceiling minute-2 failed",
1328                 dateTimeParser.parse("November 18, 2001 1:24:00.000"),
1329                 DateUtils.ceiling((Object) date2, Calendar.MINUTE));
1330         assertEquals("ceiling second-1 failed",
1331                 dateTimeParser.parse("February 12, 2002 12:34:57.000"),
1332                 DateUtils.ceiling((Object) date1, Calendar.SECOND));
1333         assertEquals("ceiling second-2 failed",
1334                 dateTimeParser.parse("November 18, 2001 1:23:12.000"),
1335                 DateUtils.ceiling((Object) date2, Calendar.SECOND));
1336         assertEquals("ceiling ampm-1 failed",
1337                 dateTimeParser.parse("February 3, 2002 12:00:00.000"),
1338                 DateUtils.ceiling((Object) dateAmPm1, Calendar.AM_PM));
1339         assertEquals("ceiling ampm-2 failed",
1340                 dateTimeParser.parse("February 3, 2002 12:00:00.000"),
1341                 DateUtils.ceiling((Object) dateAmPm2, Calendar.AM_PM));
1342         assertEquals("ceiling ampm-3 failed",
1343                 dateTimeParser.parse("February 4, 2002 00:00:00.000"),
1344                 DateUtils.ceiling((Object) dateAmPm3, Calendar.AM_PM));
1345         assertEquals("ceiling ampm-4 failed",
1346                 dateTimeParser.parse("February 4, 2002 00:00:00.000"),
1347                 DateUtils.ceiling((Object) dateAmPm4, Calendar.AM_PM));
1348         
1349         assertEquals("ceiling calendar second-1 failed",
1350                 dateTimeParser.parse("February 12, 2002 12:34:57.000"),
1351                 DateUtils.ceiling((Object) cal1, Calendar.SECOND));
1352         assertEquals("ceiling calendar second-2 failed",
1353                 dateTimeParser.parse("November 18, 2001 1:23:12.000"),
1354                 DateUtils.ceiling((Object) cal2, Calendar.SECOND));
1355         
1356         assertEquals("ceiling ampm-1 failed",
1357                 dateTimeParser.parse("February 3, 2002 12:00:00.000"),
1358                 DateUtils.ceiling((Object) calAmPm1, Calendar.AM_PM));
1359         assertEquals("ceiling ampm-2 failed",
1360                 dateTimeParser.parse("February 3, 2002 12:00:00.000"),
1361                 DateUtils.ceiling((Object) calAmPm2, Calendar.AM_PM));
1362         assertEquals("ceiling ampm-3 failed",
1363                 dateTimeParser.parse("February 4, 2002 00:00:00.000"),
1364                 DateUtils.ceiling((Object) calAmPm3, Calendar.AM_PM));
1365         assertEquals("ceiling ampm-4 failed",
1366                 dateTimeParser.parse("February 4, 2002 00:00:00.000"),
1367                 DateUtils.ceiling((Object) calAmPm4, Calendar.AM_PM));
1368 
1369         try {
1370             DateUtils.ceiling((Date) null, Calendar.SECOND);
1371             fail();
1372         } catch (final IllegalArgumentException ex) {}
1373         try {
1374             DateUtils.ceiling((Calendar) null, Calendar.SECOND);
1375             fail();
1376         } catch (final IllegalArgumentException ex) {}
1377         try {
1378             DateUtils.ceiling((Object) null, Calendar.SECOND);
1379             fail();
1380         } catch (final IllegalArgumentException ex) {}
1381         try {
1382             DateUtils.ceiling("", Calendar.SECOND);
1383             fail();
1384         } catch (final ClassCastException ex) {}
1385         try {
1386             DateUtils.ceiling(date1, -9999);
1387             fail();
1388         } catch(final IllegalArgumentException ex) {}
1389 
1390         
1391         // Fix for http://issues.apache.org/bugzilla/show_bug.cgi?id=25560
1392         // Test ceiling across the beginning of daylight saving time
1393         TimeZone.setDefault(zone);
1394         dateTimeParser.setTimeZone(zone);
1395 
1396         assertEquals("ceiling MET date across DST change-over",
1397                 dateTimeParser.parse("March 31, 2003 00:00:00.000"),
1398                 DateUtils.ceiling(date4, Calendar.DATE));
1399         assertEquals("ceiling MET date across DST change-over",
1400                 dateTimeParser.parse("March 31, 2003 00:00:00.000"),
1401                 DateUtils.ceiling((Object) cal4, Calendar.DATE));
1402         assertEquals("ceiling MET date across DST change-over",
1403                 dateTimeParser.parse("March 31, 2003 00:00:00.000"),
1404                 DateUtils.ceiling(date5, Calendar.DATE));
1405         assertEquals("ceiling MET date across DST change-over",
1406                 dateTimeParser.parse("March 31, 2003 00:00:00.000"),
1407                 DateUtils.ceiling((Object) cal5, Calendar.DATE));
1408         assertEquals("ceiling MET date across DST change-over",
1409                 dateTimeParser.parse("March 31, 2003 00:00:00.000"),
1410                 DateUtils.ceiling(date6, Calendar.DATE));
1411         assertEquals("ceiling MET date across DST change-over",
1412                 dateTimeParser.parse("March 31, 2003 00:00:00.000"),
1413                 DateUtils.ceiling((Object) cal6, Calendar.DATE));
1414         assertEquals("ceiling MET date across DST change-over",
1415                 dateTimeParser.parse("March 31, 2003 00:00:00.000"),
1416                 DateUtils.ceiling(date7, Calendar.DATE));
1417         assertEquals("ceiling MET date across DST change-over",
1418                 dateTimeParser.parse("March 31, 2003 00:00:00.000"),
1419                 DateUtils.ceiling((Object) cal7, Calendar.DATE));
1420         
1421         assertEquals("ceiling MET date across DST change-over",
1422                 dateTimeParser.parse("March 30, 2003 03:00:00.000"),
1423                 DateUtils.ceiling(date4, Calendar.HOUR_OF_DAY));
1424         assertEquals("ceiling MET date across DST change-over",
1425                 dateTimeParser.parse("March 30, 2003 03:00:00.000"),
1426                 DateUtils.ceiling((Object) cal4, Calendar.HOUR_OF_DAY));
1427         if (SystemUtils.isJavaVersionAtLeast(JAVA_1_4)) {
1428             assertEquals("ceiling MET date across DST change-over",
1429                     dateTimeParser.parse("March 30, 2003 03:00:00.000"),
1430                     DateUtils.ceiling(date5, Calendar.HOUR_OF_DAY));
1431             assertEquals("ceiling MET date across DST change-over",
1432                     dateTimeParser.parse("March 30, 2003 03:00:00.000"),
1433                     DateUtils.ceiling((Object) cal5, Calendar.HOUR_OF_DAY));
1434             assertEquals("ceiling MET date across DST change-over",
1435                     dateTimeParser.parse("March 30, 2003 04:00:00.000"),
1436                     DateUtils.ceiling(date6, Calendar.HOUR_OF_DAY));
1437             assertEquals("ceiling MET date across DST change-over",
1438                     dateTimeParser.parse("March 30, 2003 04:00:00.000"),
1439                     DateUtils.ceiling((Object) cal6, Calendar.HOUR_OF_DAY));
1440             assertEquals("ceiling MET date across DST change-over",
1441                     dateTimeParser.parse("March 30, 2003 04:00:00.000"),
1442                     DateUtils.ceiling(date7, Calendar.HOUR_OF_DAY));
1443             assertEquals("ceiling MET date across DST change-over",
1444                     dateTimeParser.parse("March 30, 2003 04:00:00.000"),
1445                     DateUtils.ceiling((Object) cal7, Calendar.HOUR_OF_DAY));
1446         } else {
1447             this.warn("WARNING: Some date ceiling tests not run since the current version is " + SystemUtils.JAVA_SPECIFICATION_VERSION);
1448         }
1449         TimeZone.setDefault(defaultZone);
1450         dateTimeParser.setTimeZone(defaultZone);
1451         
1452      // Bug 31395, large dates
1453         final Date endOfTime = new Date(Long.MAX_VALUE); // fyi: Sun Aug 17 07:12:55 CET 292278994 -- 807 millis
1454         final GregorianCalendar endCal = new GregorianCalendar();
1455         endCal.setTime(endOfTime);
1456         try {
1457             DateUtils.ceiling(endCal, Calendar.DATE);
1458             fail();
1459         } catch (final ArithmeticException ex) {}
1460         endCal.set(Calendar.YEAR, 280000001);
1461         try {
1462             DateUtils.ceiling(endCal, Calendar.DATE);
1463             fail();
1464         } catch (final ArithmeticException ex) {}
1465         endCal.set(Calendar.YEAR, 280000000);
1466         final Calendar cal = DateUtils.ceiling(endCal, Calendar.DATE);
1467         assertEquals(0, cal.get(Calendar.HOUR));
1468     }
1469 
1470     /**
1471      * Tests the iterator exceptions
1472      */
1473     @Test
1474     public void testIteratorEx() throws Exception {
1475         try {
1476             DateUtils.iterator(Calendar.getInstance(), -9999);
1477         } catch (final IllegalArgumentException ex) {}
1478         try {
1479             DateUtils.iterator((Date) null, DateUtils.RANGE_WEEK_CENTER);
1480             fail();
1481         } catch (final IllegalArgumentException ex) {}
1482         try {
1483             DateUtils.iterator((Calendar) null, DateUtils.RANGE_WEEK_CENTER);
1484             fail();
1485         } catch (final IllegalArgumentException ex) {}
1486         try {
1487             DateUtils.iterator((Object) null, DateUtils.RANGE_WEEK_CENTER);
1488             fail();
1489         } catch (final IllegalArgumentException ex) {}
1490         try {
1491             DateUtils.iterator("", DateUtils.RANGE_WEEK_CENTER);
1492             fail();
1493         } catch (final ClassCastException ex) {}
1494     }
1495 
1496     /**
1497      * Tests the calendar iterator for week ranges
1498      */
1499     @Test
1500     public void testWeekIterator() throws Exception {
1501         final Calendar now = Calendar.getInstance();
1502         for (int i = 0; i< 7; i++) {
1503             final Calendar today = DateUtils.truncate(now, Calendar.DATE);
1504             final Calendar sunday = DateUtils.truncate(now, Calendar.DATE);
1505             sunday.add(Calendar.DATE, 1 - sunday.get(Calendar.DAY_OF_WEEK));
1506             final Calendar monday = DateUtils.truncate(now, Calendar.DATE);
1507             if (monday.get(Calendar.DAY_OF_WEEK) == 1) {
1508                 //This is sunday... roll back 6 days
1509                 monday.add(Calendar.DATE, -6);
1510             } else {
1511                 monday.add(Calendar.DATE, 2 - monday.get(Calendar.DAY_OF_WEEK));
1512             }
1513             final Calendar centered = DateUtils.truncate(now, Calendar.DATE);
1514             centered.add(Calendar.DATE, -3);
1515             
1516             Iterator<?> it = DateUtils.iterator(now, DateUtils.RANGE_WEEK_SUNDAY);
1517             assertWeekIterator(it, sunday);
1518             it = DateUtils.iterator(now, DateUtils.RANGE_WEEK_MONDAY);
1519             assertWeekIterator(it, monday);
1520             it = DateUtils.iterator(now, DateUtils.RANGE_WEEK_RELATIVE);
1521             assertWeekIterator(it, today);
1522             it = DateUtils.iterator(now, DateUtils.RANGE_WEEK_CENTER);
1523             assertWeekIterator(it, centered);
1524             
1525             it = DateUtils.iterator((Object) now, DateUtils.RANGE_WEEK_CENTER);
1526             assertWeekIterator(it, centered);
1527             it = DateUtils.iterator((Object) now.getTime(), DateUtils.RANGE_WEEK_CENTER);
1528             assertWeekIterator(it, centered);
1529             try {
1530                 it.next();
1531                 fail();
1532             } catch (final NoSuchElementException ex) {}
1533             it = DateUtils.iterator(now, DateUtils.RANGE_WEEK_CENTER);
1534             it.next();
1535             try {
1536                 it.remove();
1537             } catch( final UnsupportedOperationException ex) {}
1538             
1539             now.add(Calendar.DATE,1);
1540         }
1541     }
1542             
1543     /**
1544      * Tests the calendar iterator for month-based ranges
1545      */
1546     @Test
1547     public void testMonthIterator() throws Exception {
1548         Iterator<?> it = DateUtils.iterator(date1, DateUtils.RANGE_MONTH_SUNDAY);
1549         assertWeekIterator(it,
1550                 dateParser.parse("January 27, 2002"),
1551                 dateParser.parse("March 2, 2002"));
1552 
1553         it = DateUtils.iterator(date1, DateUtils.RANGE_MONTH_MONDAY);
1554         assertWeekIterator(it,
1555                 dateParser.parse("January 28, 2002"),
1556                 dateParser.parse("March 3, 2002"));
1557 
1558         it = DateUtils.iterator(date2, DateUtils.RANGE_MONTH_SUNDAY);
1559         assertWeekIterator(it,
1560                 dateParser.parse("October 28, 2001"),
1561                 dateParser.parse("December 1, 2001"));
1562 
1563         it = DateUtils.iterator(date2, DateUtils.RANGE_MONTH_MONDAY);
1564         assertWeekIterator(it,
1565                 dateParser.parse("October 29, 2001"),
1566                 dateParser.parse("December 2, 2001"));
1567     }
1568 
1569     @Test
1570     public void testLANG799_EN_OK() throws ParseException {
1571         final Locale dflt = Locale.getDefault();
1572         Locale.setDefault(Locale.ENGLISH);
1573         try {
1574             DateUtils.parseDate("Wed, 09 Apr 2008 23:55:38 GMT", "EEE, dd MMM yyyy HH:mm:ss zzz");
1575             DateUtils.parseDateStrictly("Wed, 09 Apr 2008 23:55:38 GMT", "EEE, dd MMM yyyy HH:mm:ss zzz");
1576         } finally {
1577             Locale.setDefault(dflt);            
1578         }
1579     }
1580 
1581     // Parse German date with English Locale
1582     @Test(expected=ParseException.class)
1583     public void testLANG799_EN_FAIL() throws ParseException {
1584         final Locale dflt = Locale.getDefault();
1585         Locale.setDefault(Locale.ENGLISH);
1586         try {
1587             DateUtils.parseDate("Mi, 09 Apr 2008 23:55:38 GMT", "EEE, dd MMM yyyy HH:mm:ss zzz");
1588         } finally {
1589             Locale.setDefault(dflt);            
1590         }
1591     }
1592 
1593     @Test
1594     public void testLANG799_DE_OK() throws ParseException {
1595         final Locale dflt = Locale.getDefault();
1596         Locale.setDefault(Locale.GERMAN);
1597         try {
1598             DateUtils.parseDate("Mi, 09 Apr 2008 23:55:38 GMT", "EEE, dd MMM yyyy HH:mm:ss zzz");
1599             DateUtils.parseDateStrictly("Mi, 09 Apr 2008 23:55:38 GMT", "EEE, dd MMM yyyy HH:mm:ss zzz");
1600         } finally {
1601             Locale.setDefault(dflt);            
1602         }
1603     }
1604 
1605     // Parse English date with German Locale
1606     @Test(expected=ParseException.class)
1607     public void testLANG799_DE_FAIL() throws ParseException {
1608         final Locale dflt = Locale.getDefault();
1609         Locale.setDefault(Locale.GERMAN);
1610         try {
1611             DateUtils.parseDate("Wed, 09 Apr 2008 23:55:38 GMT", "EEE, dd MMM yyyy HH:mm:ss zzz");
1612         } finally {
1613             Locale.setDefault(dflt);            
1614         }
1615     }
1616     
1617     // Parse German date with English Locale, specifying German Locale override
1618     @Test
1619     public void testLANG799_EN_WITH_DE_LOCALE() throws ParseException {
1620         final Locale dflt = Locale.getDefault();
1621         Locale.setDefault(Locale.ENGLISH);
1622         try {
1623             DateUtils.parseDate("Mi, 09 Apr 2008 23:55:38 GMT", Locale.GERMAN, "EEE, dd MMM yyyy HH:mm:ss zzz");
1624         } finally {
1625             Locale.setDefault(dflt);            
1626         }
1627     }
1628     
1629     /**
1630      * This checks that this is a 7 element iterator of Calendar objects
1631      * that are dates (no time), and exactly 1 day spaced after each other.
1632      */
1633     private static void assertWeekIterator(final Iterator<?> it, final Calendar start) {
1634         final Calendar end = (Calendar) start.clone();
1635         end.add(Calendar.DATE, 6);
1636 
1637         assertWeekIterator(it, start, end);
1638     }
1639 
1640     /**
1641      * Convenience method for when working with Date objects
1642      */
1643     private static void assertWeekIterator(final Iterator<?> it, final Date start, final Date end) {
1644         final Calendar calStart = Calendar.getInstance();
1645         calStart.setTime(start);
1646         final Calendar calEnd = Calendar.getInstance();
1647         calEnd.setTime(end);
1648 
1649         assertWeekIterator(it, calStart, calEnd);
1650     }
1651 
1652     /**
1653      * This checks that this is a 7 divisble iterator of Calendar objects
1654      * that are dates (no time), and exactly 1 day spaced after each other
1655      * (in addition to the proper start and stop dates)
1656      */
1657     private static void assertWeekIterator(final Iterator<?> it, final Calendar start, final Calendar end) {
1658         Calendar cal = (Calendar) it.next();
1659         assertCalendarsEquals("", start, cal, 0);
1660         Calendar last = null;
1661         int count = 1;
1662         while (it.hasNext()) {
1663             //Check this is just a date (no time component)
1664             assertCalendarsEquals("", cal, DateUtils.truncate(cal, Calendar.DATE), 0);
1665 
1666             last = cal;
1667             cal = (Calendar) it.next();
1668             count++;
1669 
1670             //Check that this is one day more than the last date
1671             last.add(Calendar.DATE, 1);
1672             assertCalendarsEquals("", last, cal, 0);
1673         }
1674         if (count % 7 != 0) {
1675             throw new AssertionFailedError("There were " + count + " days in this iterator");
1676         }
1677         assertCalendarsEquals("", end, cal, 0);
1678     }
1679 
1680     /**
1681      * Used to check that Calendar objects are close enough
1682      * delta is in milliseconds
1683      */
1684     private static void assertCalendarsEquals(final String message, final Calendar cal1, final Calendar cal2, final long delta) {
1685         if (Math.abs(cal1.getTime().getTime() - cal2.getTime().getTime()) > delta) {
1686             throw new AssertionFailedError(
1687                     message + " expected " + cal1.getTime() + " but got " + cal2.getTime());
1688         }
1689     }
1690 
1691     void warn(final String msg) {
1692         System.err.println(msg);
1693     }
1694 }
1695