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.lang.time;
18  
19  import java.lang.reflect.Constructor;
20  import java.lang.reflect.Modifier;
21  import java.text.DateFormat;
22  import java.text.ParseException;
23  import java.text.SimpleDateFormat;
24  import java.util.Calendar;
25  import java.util.Date;
26  import java.util.GregorianCalendar;
27  import java.util.Iterator;
28  import java.util.Locale;
29  import java.util.NoSuchElementException;
30  import java.util.TimeZone;
31  
32  import junit.framework.AssertionFailedError;
33  import junit.framework.Test;
34  import junit.framework.TestCase;
35  import junit.framework.TestSuite;
36  import junit.textui.TestRunner;
37  
38  import org.apache.commons.lang.SystemUtils;
39  
40  /**
41   * Unit tests {@link org.apache.commons.lang.time.DateUtils}.
42   *
43   * @author <a href="mailto:sergek@lokitech.com">Serge Knystautas</a>
44   * @author <a href="mailto:steve@mungoknotwise.com">Steven Caswell</a>
45   */
46  public class DateUtilsTest extends TestCase {
47  
48      private static final long MILLIS_TEST;
49      static {
50          GregorianCalendar cal = new GregorianCalendar(2000, 6, 5, 4, 3, 2);
51          cal.set(Calendar.MILLISECOND, 1);
52          MILLIS_TEST = cal.getTime().getTime();
53      }
54  
55      DateFormat dateParser = null;
56      DateFormat dateTimeParser = null;
57      DateFormat timeZoneDateParser = null;
58      Date dateAmPm1 = null;
59      Date dateAmPm2 = null;
60      Date dateAmPm3 = null;
61      Date dateAmPm4 = null;
62      Date date0 = null;
63      Date date1 = null;
64      Date date2 = null;
65      Date date3 = null;
66      Date date4 = null;
67      Date date5 = null;
68      Date date6 = null;
69      Date date7 = null;
70      Date date8 = null;
71      Calendar calAmPm1 = null;
72      Calendar calAmPm2 = null;
73      Calendar calAmPm3 = null;
74      Calendar calAmPm4 = null;
75      Calendar cal1 = null;
76      Calendar cal2 = null;
77      Calendar cal3 = null;
78      Calendar cal4 = null;
79      Calendar cal5 = null;
80      Calendar cal6 = null;
81      Calendar cal7 = null;
82      Calendar cal8 = null;
83      TimeZone zone = null;
84      TimeZone defaultZone = null;
85  
86      public DateUtilsTest(String name) {
87          super(name);
88      }
89  
90      public static void main(String[] args) {
91          TestRunner.run(suite());
92      }
93  
94      public static Test suite() {
95          TestSuite suite = new TestSuite(DateUtilsTest.class);
96          suite.setName("DateUtils Tests");
97          return suite;
98      }
99  
100     protected void setUp() throws Exception {
101         super.setUp();
102 
103         dateParser = new SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH);
104         dateTimeParser = new SimpleDateFormat("MMM dd, yyyy H:mm:ss.SSS", Locale.ENGLISH);
105 
106         dateAmPm1 = dateTimeParser.parse("February 3, 2002 01:10:00.000");
107         dateAmPm2 = dateTimeParser.parse("February 3, 2002 11:10:00.000");
108         dateAmPm3 = dateTimeParser.parse("February 3, 2002 13:10:00.000");
109         dateAmPm4 = dateTimeParser.parse("February 3, 2002 19:10:00.000");
110         date0 = dateTimeParser.parse("February 3, 2002 12:34:56.789");
111         date1 = dateTimeParser.parse("February 12, 2002 12:34:56.789");
112         date2 = dateTimeParser.parse("November 18, 2001 1:23:11.321");
113         defaultZone = TimeZone.getDefault();
114         zone = TimeZone.getTimeZone("MET");
115         TimeZone.setDefault(zone);
116         dateTimeParser.setTimeZone(zone);
117         date3 = dateTimeParser.parse("March 30, 2003 05:30:45.000");
118         date4 = dateTimeParser.parse("March 30, 2003 01:10:00.000");
119         date5 = dateTimeParser.parse("March 30, 2003 01:40:00.000");
120         date6 = dateTimeParser.parse("March 30, 2003 02:10:00.000");
121         date7 = dateTimeParser.parse("March 30, 2003 02:40:00.000");
122         date8 = dateTimeParser.parse("October 26, 2003 05:30:45.000");
123         dateTimeParser.setTimeZone(defaultZone);
124         TimeZone.setDefault(defaultZone);
125         calAmPm1 = Calendar.getInstance();
126         calAmPm1.setTime(dateAmPm1);
127         calAmPm2 = Calendar.getInstance();
128         calAmPm2.setTime(dateAmPm2);
129         calAmPm3 = Calendar.getInstance();
130         calAmPm3.setTime(dateAmPm3);
131         calAmPm4 = Calendar.getInstance();
132         calAmPm4.setTime(dateAmPm4);
133         cal1 = Calendar.getInstance();
134         cal1.setTime(date1);
135         cal2 = Calendar.getInstance();
136         cal2.setTime(date2);
137         TimeZone.setDefault(zone);
138         cal3 = Calendar.getInstance();
139         cal3.setTime(date3);
140         cal4 = Calendar.getInstance();
141         cal4.setTime(date4);
142         cal5 = Calendar.getInstance();
143         cal5.setTime(date5);
144         cal6 = Calendar.getInstance();
145         cal6.setTime(date6);
146         cal7 = Calendar.getInstance();
147         cal7.setTime(date7);
148         cal8 = Calendar.getInstance();
149         cal8.setTime(date8);
150         TimeZone.setDefault(defaultZone);
151     }
152 
153     protected void tearDown() throws Exception {
154         super.tearDown();
155     }
156 
157     //-----------------------------------------------------------------------
158     public void testConstructor() {
159         assertNotNull(new DateUtils());
160         Constructor[] cons = DateUtils.class.getDeclaredConstructors();
161         assertEquals(1, cons.length);
162         assertEquals(true, Modifier.isPublic(cons[0].getModifiers()));
163         assertEquals(true, Modifier.isPublic(DateUtils.class.getModifiers()));
164         assertEquals(false, Modifier.isFinal(DateUtils.class.getModifiers()));
165     }
166     
167     //-----------------------------------------------------------------------
168     public void testIsSameDay_Date() {
169         Date date1 = new GregorianCalendar(2004, 6, 9, 13, 45).getTime();
170         Date date2 = new GregorianCalendar(2004, 6, 9, 13, 45).getTime();
171         assertEquals(true, DateUtils.isSameDay(date1, date2));
172         date2 = new GregorianCalendar(2004, 6, 10, 13, 45).getTime();
173         assertEquals(false, DateUtils.isSameDay(date1, date2));
174         date1 = new GregorianCalendar(2004, 6, 10, 13, 45).getTime();
175         assertEquals(true, DateUtils.isSameDay(date1, date2));
176         date2 = new GregorianCalendar(2005, 6, 10, 13, 45).getTime();
177         assertEquals(false, DateUtils.isSameDay(date1, date2));
178         try {
179             DateUtils.isSameDay((Date) null, (Date) null);
180             fail();
181         } catch (IllegalArgumentException ex) {}
182     }
183     
184     //-----------------------------------------------------------------------
185     public void testIsSameDay_Cal() {
186         GregorianCalendar cal1 = new GregorianCalendar(2004, 6, 9, 13, 45);
187         GregorianCalendar cal2 = new GregorianCalendar(2004, 6, 9, 13, 45);
188         assertEquals(true, DateUtils.isSameDay(cal1, cal2));
189         cal2.add(Calendar.DAY_OF_YEAR, 1);
190         assertEquals(false, DateUtils.isSameDay(cal1, cal2));
191         cal1.add(Calendar.DAY_OF_YEAR, 1);
192         assertEquals(true, DateUtils.isSameDay(cal1, cal2));
193         cal2.add(Calendar.YEAR, 1);
194         assertEquals(false, DateUtils.isSameDay(cal1, cal2));
195         try {
196             DateUtils.isSameDay((Calendar) null, (Calendar) null);
197             fail();
198         } catch (IllegalArgumentException ex) {}
199     }
200     
201     //-----------------------------------------------------------------------
202     public void testIsSameInstant_Date() {
203         Date date1 = new GregorianCalendar(2004, 6, 9, 13, 45).getTime();
204         Date date2 = new GregorianCalendar(2004, 6, 9, 13, 45).getTime();
205         assertEquals(true, DateUtils.isSameInstant(date1, date2));
206         date2 = new GregorianCalendar(2004, 6, 10, 13, 45).getTime();
207         assertEquals(false, DateUtils.isSameInstant(date1, date2));
208         date1 = new GregorianCalendar(2004, 6, 10, 13, 45).getTime();
209         assertEquals(true, DateUtils.isSameInstant(date1, date2));
210         date2 = new GregorianCalendar(2005, 6, 10, 13, 45).getTime();
211         assertEquals(false, DateUtils.isSameInstant(date1, date2));
212         try {
213             DateUtils.isSameInstant((Date) null, (Date) null);
214             fail();
215         } catch (IllegalArgumentException ex) {}
216     }
217     
218     //-----------------------------------------------------------------------
219     public void testIsSameInstant_Cal() {
220         GregorianCalendar cal1 = new GregorianCalendar(TimeZone.getTimeZone("GMT+1"));
221         GregorianCalendar cal2 = new GregorianCalendar(TimeZone.getTimeZone("GMT-1"));
222         cal1.set(2004, 6, 9, 13, 45, 0);
223         cal1.set(Calendar.MILLISECOND, 0);
224         cal2.set(2004, 6, 9, 13, 45, 0);
225         cal2.set(Calendar.MILLISECOND, 0);
226         assertEquals(false, DateUtils.isSameInstant(cal1, cal2));
227         
228         cal2.set(2004, 6, 9, 11, 45, 0);
229         assertEquals(true, DateUtils.isSameInstant(cal1, cal2));
230         try {
231             DateUtils.isSameInstant((Calendar) null, (Calendar) null);
232             fail();
233         } catch (IllegalArgumentException ex) {}
234     }
235     
236     //-----------------------------------------------------------------------
237     public void testIsSameLocalTime_Cal() {
238         GregorianCalendar cal1 = new GregorianCalendar(TimeZone.getTimeZone("GMT+1"));
239         GregorianCalendar cal2 = new GregorianCalendar(TimeZone.getTimeZone("GMT-1"));
240         cal1.set(2004, 6, 9, 13, 45, 0);
241         cal1.set(Calendar.MILLISECOND, 0);
242         cal2.set(2004, 6, 9, 13, 45, 0);
243         cal2.set(Calendar.MILLISECOND, 0);
244         assertEquals(true, DateUtils.isSameLocalTime(cal1, cal2));
245         
246         cal2.set(2004, 6, 9, 11, 45, 0);
247         assertEquals(false, DateUtils.isSameLocalTime(cal1, cal2));
248         try {
249             DateUtils.isSameLocalTime((Calendar) null, (Calendar) null);
250             fail();
251         } catch (IllegalArgumentException ex) {}
252     }
253     
254     //-----------------------------------------------------------------------
255     public void testParseDate() throws Exception {
256         GregorianCalendar cal = new GregorianCalendar(1972, 11, 3);
257         String dateStr = "1972-12-03";
258         String[] parsers = new String[] {"yyyy'-'DDD", "yyyy'-'MM'-'dd", "yyyyMMdd"};
259         Date date = DateUtils.parseDate(dateStr, parsers);
260         assertEquals(cal.getTime(), date);
261         
262         dateStr = "1972-338";
263         date = DateUtils.parseDate(dateStr, parsers);
264         assertEquals(cal.getTime(), date);
265         
266         dateStr = "19721203";
267         date = DateUtils.parseDate(dateStr, parsers);
268         assertEquals(cal.getTime(), date);
269         
270         try {
271             DateUtils.parseDate("PURPLE", parsers);
272             fail();
273         } catch (ParseException ex) {}
274         try {
275             DateUtils.parseDate("197212AB", parsers);
276             fail();
277         } catch (ParseException ex) {}
278         try {
279             DateUtils.parseDate(null, parsers);
280             fail();
281         } catch (IllegalArgumentException ex) {}
282         try {
283             DateUtils.parseDate(dateStr, null);
284             fail();
285         } catch (IllegalArgumentException ex) {}
286     }
287 
288     //-----------------------------------------------------------------------
289     public void testAddYears() throws Exception {
290         Date base = new Date(MILLIS_TEST);
291         Date result = DateUtils.addYears(base, 0);
292         assertNotSame(base, result);
293         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
294         assertDate(result, 2000, 6, 5, 4, 3, 2, 1);
295         
296         result = DateUtils.addYears(base, 1);
297         assertNotSame(base, result);
298         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
299         assertDate(result, 2001, 6, 5, 4, 3, 2, 1);
300         
301         result = DateUtils.addYears(base, -1);
302         assertNotSame(base, result);
303         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
304         assertDate(result, 1999, 6, 5, 4, 3, 2, 1);
305     }
306 
307     //-----------------------------------------------------------------------
308     public void testAddMonths() throws Exception {
309         Date base = new Date(MILLIS_TEST);
310         Date result = DateUtils.addMonths(base, 0);
311         assertNotSame(base, result);
312         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
313         assertDate(result, 2000, 6, 5, 4, 3, 2, 1);
314         
315         result = DateUtils.addMonths(base, 1);
316         assertNotSame(base, result);
317         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
318         assertDate(result, 2000, 7, 5, 4, 3, 2, 1);
319         
320         result = DateUtils.addMonths(base, -1);
321         assertNotSame(base, result);
322         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
323         assertDate(result, 2000, 5, 5, 4, 3, 2, 1);
324     }
325 
326     //-----------------------------------------------------------------------
327     public void testAddWeeks() throws Exception {
328         Date base = new Date(MILLIS_TEST);
329         Date result = DateUtils.addWeeks(base, 0);
330         assertNotSame(base, result);
331         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
332         assertDate(result, 2000, 6, 5, 4, 3, 2, 1);
333         
334         result = DateUtils.addWeeks(base, 1);
335         assertNotSame(base, result);
336         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
337         assertDate(result, 2000, 6, 12, 4, 3, 2, 1);
338         
339         result = DateUtils.addWeeks(base, -1);
340         assertNotSame(base, result);
341         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);      // july
342         assertDate(result, 2000, 5, 28, 4, 3, 2, 1);   // june
343     }
344 
345     //-----------------------------------------------------------------------
346     public void testAddDays() throws Exception {
347         Date base = new Date(MILLIS_TEST);
348         Date result = DateUtils.addDays(base, 0);
349         assertNotSame(base, result);
350         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
351         assertDate(result, 2000, 6, 5, 4, 3, 2, 1);
352         
353         result = DateUtils.addDays(base, 1);
354         assertNotSame(base, result);
355         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
356         assertDate(result, 2000, 6, 6, 4, 3, 2, 1);
357         
358         result = DateUtils.addDays(base, -1);
359         assertNotSame(base, result);
360         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
361         assertDate(result, 2000, 6, 4, 4, 3, 2, 1);
362     }
363 
364     //-----------------------------------------------------------------------
365     public void testAddHours() throws Exception {
366         Date base = new Date(MILLIS_TEST);
367         Date result = DateUtils.addHours(base, 0);
368         assertNotSame(base, result);
369         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
370         assertDate(result, 2000, 6, 5, 4, 3, 2, 1);
371         
372         result = DateUtils.addHours(base, 1);
373         assertNotSame(base, result);
374         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
375         assertDate(result, 2000, 6, 5, 5, 3, 2, 1);
376         
377         result = DateUtils.addHours(base, -1);
378         assertNotSame(base, result);
379         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
380         assertDate(result, 2000, 6, 5, 3, 3, 2, 1);
381     }
382 
383     //-----------------------------------------------------------------------
384     public void testAddMinutes() throws Exception {
385         Date base = new Date(MILLIS_TEST);
386         Date result = DateUtils.addMinutes(base, 0);
387         assertNotSame(base, result);
388         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
389         assertDate(result, 2000, 6, 5, 4, 3, 2, 1);
390         
391         result = DateUtils.addMinutes(base, 1);
392         assertNotSame(base, result);
393         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
394         assertDate(result, 2000, 6, 5, 4, 4, 2, 1);
395         
396         result = DateUtils.addMinutes(base, -1);
397         assertNotSame(base, result);
398         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
399         assertDate(result, 2000, 6, 5, 4, 2, 2, 1);
400     }
401 
402     //-----------------------------------------------------------------------
403     public void testAddSeconds() throws Exception {
404         Date base = new Date(MILLIS_TEST);
405         Date result = DateUtils.addSeconds(base, 0);
406         assertNotSame(base, result);
407         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
408         assertDate(result, 2000, 6, 5, 4, 3, 2, 1);
409         
410         result = DateUtils.addSeconds(base, 1);
411         assertNotSame(base, result);
412         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
413         assertDate(result, 2000, 6, 5, 4, 3, 3, 1);
414         
415         result = DateUtils.addSeconds(base, -1);
416         assertNotSame(base, result);
417         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
418         assertDate(result, 2000, 6, 5, 4, 3, 1, 1);
419     }
420 
421     //-----------------------------------------------------------------------
422     public void testAddMilliseconds() throws Exception {
423         Date base = new Date(MILLIS_TEST);
424         Date result = DateUtils.addMilliseconds(base, 0);
425         assertNotSame(base, result);
426         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
427         assertDate(result, 2000, 6, 5, 4, 3, 2, 1);
428         
429         result = DateUtils.addMilliseconds(base, 1);
430         assertNotSame(base, result);
431         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
432         assertDate(result, 2000, 6, 5, 4, 3, 2, 2);
433         
434         result = DateUtils.addMilliseconds(base, -1);
435         assertNotSame(base, result);
436         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
437         assertDate(result, 2000, 6, 5, 4, 3, 2, 0);
438     }
439 
440     //-----------------------------------------------------------------------
441     public void testAddByField() throws Exception {
442         Date base = new Date(MILLIS_TEST);
443         Date result = DateUtils.add(base, Calendar.YEAR, 0);
444         assertNotSame(base, result);
445         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
446         assertDate(result, 2000, 6, 5, 4, 3, 2, 1);
447         
448         result = DateUtils.add(base, Calendar.YEAR, 1);
449         assertNotSame(base, result);
450         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
451         assertDate(result, 2001, 6, 5, 4, 3, 2, 1);
452         
453         result = DateUtils.add(base, Calendar.YEAR, -1);
454         assertNotSame(base, result);
455         assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
456         assertDate(result, 1999, 6, 5, 4, 3, 2, 1);
457     }
458     
459 	// -----------------------------------------------------------------------
460 	public void testSetYears() throws Exception {
461 		Date base = new Date(MILLIS_TEST);
462 		Date result = DateUtils.setYears(base, 2000);
463 		assertNotSame(base, result);
464 		assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
465 		assertDate(result, 2000, 6, 5, 4, 3, 2, 1);
466 
467 		result = DateUtils.setYears(base, 2008);
468 		assertNotSame(base, result);
469 		assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
470 		assertDate(result, 2008, 6, 5, 4, 3, 2, 1);
471 
472 		result = DateUtils.setYears(base, 2005);
473 		assertNotSame(base, result);
474 		assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
475 		assertDate(result, 2005, 6, 5, 4, 3, 2, 1);
476 	}
477 
478 	// -----------------------------------------------------------------------
479 	public void testSetMonths() throws Exception {
480 		Date base = new Date(MILLIS_TEST);
481 		Date result = DateUtils.setMonths(base, 5);
482 		assertNotSame(base, result);
483 		assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
484 		assertDate(result, 2000, 5, 5, 4, 3, 2, 1);
485 
486 		result = DateUtils.setMonths(base, 1);
487 		assertNotSame(base, result);
488 		assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
489 		assertDate(result, 2000, 1, 5, 4, 3, 2, 1);
490 
491 		try {
492 			result = DateUtils.setMonths(base, 12);
493 			fail("DateUtils.setMonths did not throw an expected IllegalArguementException.");
494 		} catch (IllegalArgumentException e) {
495 
496 		}
497 	}
498 
499 	// -----------------------------------------------------------------------
500 	public void testSetDays() throws Exception {
501 		Date base = new Date(MILLIS_TEST);
502 		Date result = DateUtils.setDays(base, 1);
503 		assertNotSame(base, result);
504 		assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
505 		assertDate(result, 2000, 6, 1, 4, 3, 2, 1);
506 
507 		result = DateUtils.setDays(base, 29);
508 		assertNotSame(base, result);
509 		assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
510 		assertDate(result, 2000, 6, 29, 4, 3, 2, 1);
511 
512 		try {
513 			result = DateUtils.setDays(base, 32);
514 			fail("DateUtils.setDays did not throw an expected IllegalArguementException.");
515 		} catch (IllegalArgumentException e) {
516 
517 		}
518 	}
519 
520 	// -----------------------------------------------------------------------
521 	public void testSetHours() throws Exception {
522 		Date base = new Date(MILLIS_TEST);
523 		Date result = DateUtils.setHours(base, 0);
524 		assertNotSame(base, result);
525 		assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
526 		assertDate(result, 2000, 6, 5, 0, 3, 2, 1);
527 
528 		result = DateUtils.setHours(base, 23);
529 		assertNotSame(base, result);
530 		assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
531 		assertDate(result, 2000, 6, 5, 23, 3, 2, 1);
532 
533 		try {
534 			result = DateUtils.setHours(base, 24);
535 			fail("DateUtils.setHours did not throw an expected IllegalArguementException.");
536 		} catch (IllegalArgumentException e) {
537 
538 		}
539 	}
540 
541 	// -----------------------------------------------------------------------
542 	public void testSetMinutes() throws Exception {
543 		Date base = new Date(MILLIS_TEST);
544 		Date result = DateUtils.setMinutes(base, 0);
545 		assertNotSame(base, result);
546 		assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
547 		assertDate(result, 2000, 6, 5, 4, 0, 2, 1);
548 
549 		result = DateUtils.setMinutes(base, 59);
550 		assertNotSame(base, result);
551 		assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
552 		assertDate(result, 2000, 6, 5, 4, 59, 2, 1);
553 
554 		try {
555 			result = DateUtils.setMinutes(base, 60);
556 			fail("DateUtils.setMinutes did not throw an expected IllegalArguementException.");
557 		} catch (IllegalArgumentException e) {
558 
559 		}
560 	}
561 
562 	// -----------------------------------------------------------------------
563 	public void testSetSeconds() throws Exception {
564 		Date base = new Date(MILLIS_TEST);
565 		Date result = DateUtils.setSeconds(base, 0);
566 		assertNotSame(base, result);
567 		assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
568 		assertDate(result, 2000, 6, 5, 4, 3, 0, 1);
569 
570 		result = DateUtils.setSeconds(base, 59);
571 		assertNotSame(base, result);
572 		assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
573 		assertDate(result, 2000, 6, 5, 4, 3, 59, 1);
574 
575 		try {
576 			result = DateUtils.setSeconds(base, 60);
577 			fail("DateUtils.setSeconds did not throw an expected IllegalArguementException.");
578 		} catch (IllegalArgumentException e) {
579 
580 		}
581 	}
582 
583 	// -----------------------------------------------------------------------
584 	public void testSetMilliseconds() throws Exception {
585 		Date base = new Date(MILLIS_TEST);
586 		Date result = DateUtils.setMilliseconds(base, 0);
587 		assertNotSame(base, result);
588 		assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
589 		assertDate(result, 2000, 6, 5, 4, 3, 2, 0);
590 
591 		result = DateUtils.setMilliseconds(base, 999);
592 		assertNotSame(base, result);
593 		assertDate(base, 2000, 6, 5, 4, 3, 2, 1);
594 		assertDate(result, 2000, 6, 5, 4, 3, 2, 999);
595 
596 		try {
597 			result = DateUtils.setMilliseconds(base, 1000);
598 			fail("DateUtils.setMilliseconds did not throw an expected IllegalArguementException.");
599 		} catch (IllegalArgumentException e) {
600 
601 		}
602 	}
603 
604     //-----------------------------------------------------------------------
605     private void assertDate(Date date, int year, int month, int day, int hour, int min, int sec, int mil) throws Exception {
606         GregorianCalendar cal = new GregorianCalendar();
607         cal.setTime(date);
608         assertEquals(year, cal.get(Calendar.YEAR));
609         assertEquals(month, cal.get(Calendar.MONTH));
610         assertEquals(day, cal.get(Calendar.DAY_OF_MONTH));
611         assertEquals(hour, cal.get(Calendar.HOUR_OF_DAY));
612         assertEquals(min, cal.get(Calendar.MINUTE));
613         assertEquals(sec, cal.get(Calendar.SECOND));
614         assertEquals(mil, cal.get(Calendar.MILLISECOND));
615     }
616 
617     //-----------------------------------------------------------------------
618     /**
619      * Tests various values with the round method
620      */
621     public void testRound() throws Exception {
622         // tests for public static Date round(Date date, int field)
623         assertEquals("round year-1 failed",
624                 dateParser.parse("January 1, 2002"),
625                 DateUtils.round(date1, Calendar.YEAR));
626         assertEquals("round year-2 failed",
627                 dateParser.parse("January 1, 2002"),
628                 DateUtils.round(date2, Calendar.YEAR));
629         assertEquals("round month-1 failed",
630                 dateParser.parse("February 1, 2002"),
631                 DateUtils.round(date1, Calendar.MONTH));
632         assertEquals("round month-2 failed",
633                 dateParser.parse("December 1, 2001"),
634                 DateUtils.round(date2, Calendar.MONTH));
635         assertEquals("round semimonth-0 failed",
636                 dateParser.parse("February 1, 2002"),
637                 DateUtils.round(date0, DateUtils.SEMI_MONTH));
638         assertEquals("round semimonth-1 failed",
639                 dateParser.parse("February 16, 2002"),
640                 DateUtils.round(date1, DateUtils.SEMI_MONTH));
641         assertEquals("round semimonth-2 failed",
642                 dateParser.parse("November 16, 2001"),
643                 DateUtils.round(date2, DateUtils.SEMI_MONTH));
644         
645         
646         assertEquals("round date-1 failed",
647                 dateParser.parse("February 13, 2002"),
648                 DateUtils.round(date1, Calendar.DATE));
649         assertEquals("round date-2 failed",
650                 dateParser.parse("November 18, 2001"),
651                 DateUtils.round(date2, Calendar.DATE));
652         assertEquals("round hour-1 failed",
653                 dateTimeParser.parse("February 12, 2002 13:00:00.000"),
654                 DateUtils.round(date1, Calendar.HOUR));
655         assertEquals("round hour-2 failed",
656                 dateTimeParser.parse("November 18, 2001 1:00:00.000"),
657                 DateUtils.round(date2, Calendar.HOUR));
658         assertEquals("round minute-1 failed",
659                 dateTimeParser.parse("February 12, 2002 12:35:00.000"),
660                 DateUtils.round(date1, Calendar.MINUTE));
661         assertEquals("round minute-2 failed",
662                 dateTimeParser.parse("November 18, 2001 1:23:00.000"),
663                 DateUtils.round(date2, Calendar.MINUTE));
664         assertEquals("round second-1 failed",
665                 dateTimeParser.parse("February 12, 2002 12:34:57.000"),
666                 DateUtils.round(date1, Calendar.SECOND));
667         assertEquals("round second-2 failed",
668                 dateTimeParser.parse("November 18, 2001 1:23:11.000"),
669                 DateUtils.round(date2, Calendar.SECOND));
670         assertEquals("truncate ampm-1 failed",
671                 dateTimeParser.parse("February 3, 2002 00:00:00.000"),
672                 DateUtils.round(dateAmPm1, Calendar.AM_PM));
673         assertEquals("truncate ampm-2 failed",
674                 dateTimeParser.parse("February 4, 2002 00:00:00.000"),
675                 DateUtils.round(dateAmPm2, Calendar.AM_PM));
676         assertEquals("truncate ampm-3 failed",
677                 dateTimeParser.parse("February 3, 2002 12:00:00.000"),
678                 DateUtils.round(dateAmPm3, Calendar.AM_PM));
679         assertEquals("truncate ampm-4 failed",
680                 dateTimeParser.parse("February 4, 2002 12:00:00.000"),
681                 DateUtils.round(dateAmPm4, Calendar.AM_PM));
682 
683         // tests for public static Date round(Object date, int field)
684         assertEquals("round year-1 failed",
685                 dateParser.parse("January 1, 2002"),
686                 DateUtils.round((Object) date1, Calendar.YEAR));
687         assertEquals("round year-2 failed",
688                 dateParser.parse("January 1, 2002"),
689                 DateUtils.round((Object) date2, Calendar.YEAR));
690         assertEquals("round month-1 failed",
691                 dateParser.parse("February 1, 2002"),
692                 DateUtils.round((Object) date1, Calendar.MONTH));
693         assertEquals("round month-2 failed",
694                 dateParser.parse("December 1, 2001"),
695                 DateUtils.round((Object) date2, Calendar.MONTH));
696         assertEquals("round semimonth-1 failed",
697                 dateParser.parse("February 16, 2002"),
698                 DateUtils.round((Object) date1, DateUtils.SEMI_MONTH));
699         assertEquals("round semimonth-2 failed",
700                 dateParser.parse("November 16, 2001"),
701                 DateUtils.round((Object) date2, DateUtils.SEMI_MONTH));
702         assertEquals("round date-1 failed",
703                 dateParser.parse("February 13, 2002"),
704                 DateUtils.round((Object) date1, Calendar.DATE));
705         assertEquals("round date-2 failed",
706                 dateParser.parse("November 18, 2001"),
707                 DateUtils.round((Object) date2, Calendar.DATE));
708         assertEquals("round hour-1 failed",
709                 dateTimeParser.parse("February 12, 2002 13:00:00.000"),
710                 DateUtils.round((Object) date1, Calendar.HOUR));
711         assertEquals("round hour-2 failed",
712                 dateTimeParser.parse("November 18, 2001 1:00:00.000"),
713                 DateUtils.round((Object) date2, Calendar.HOUR));
714         assertEquals("round minute-1 failed",
715                 dateTimeParser.parse("February 12, 2002 12:35:00.000"),
716                 DateUtils.round((Object) date1, Calendar.MINUTE));
717         assertEquals("round minute-2 failed",
718                 dateTimeParser.parse("November 18, 2001 1:23:00.000"),
719                 DateUtils.round((Object) date2, Calendar.MINUTE));
720         assertEquals("round second-1 failed",
721                 dateTimeParser.parse("February 12, 2002 12:34:57.000"),
722                 DateUtils.round((Object) date1, Calendar.SECOND));
723         assertEquals("round second-2 failed",
724                 dateTimeParser.parse("November 18, 2001 1:23:11.000"),
725                 DateUtils.round((Object) date2, Calendar.SECOND));
726         assertEquals("round calendar second-1 failed",
727                 dateTimeParser.parse("February 12, 2002 12:34:57.000"),
728                 DateUtils.round((Object) cal1, Calendar.SECOND));
729         assertEquals("round calendar second-2 failed",
730                 dateTimeParser.parse("November 18, 2001 1:23:11.000"),
731                 DateUtils.round((Object) cal2, Calendar.SECOND));
732         assertEquals("truncate ampm-1 failed",
733                 dateTimeParser.parse("February 3, 2002 00:00:00.000"),
734                 DateUtils.round((Object) dateAmPm1, Calendar.AM_PM));
735         assertEquals("truncate ampm-2 failed",
736                 dateTimeParser.parse("February 4, 2002 00:00:00.000"),
737                 DateUtils.round((Object) dateAmPm2, Calendar.AM_PM));
738         assertEquals("truncate ampm-3 failed",
739                 dateTimeParser.parse("February 3, 2002 12:00:00.000"),
740                 DateUtils.round((Object) dateAmPm3, Calendar.AM_PM));
741         assertEquals("truncate ampm-4 failed",
742                 dateTimeParser.parse("February 4, 2002 12:00:00.000"),
743                 DateUtils.round((Object) dateAmPm4, Calendar.AM_PM));
744 
745         try {
746             DateUtils.round((Date) null, Calendar.SECOND);
747             fail();
748         } catch (IllegalArgumentException ex) {}
749         try {
750             DateUtils.round((Calendar) null, Calendar.SECOND);
751             fail();
752         } catch (IllegalArgumentException ex) {}
753         try {
754             DateUtils.round((Object) null, Calendar.SECOND);
755             fail();
756         } catch (IllegalArgumentException ex) {}
757         try {
758             DateUtils.round("", Calendar.SECOND);
759             fail();
760         } catch (ClassCastException ex) {}
761         try {
762             DateUtils.round(date1, -9999);
763             fail();
764         } catch(IllegalArgumentException ex) {}
765 
766         assertEquals("truncate ampm-1 failed",
767                 dateTimeParser.parse("February 3, 2002 00:00:00.000"),
768                 DateUtils.round((Object) calAmPm1, Calendar.AM_PM));
769         assertEquals("truncate ampm-2 failed",
770                 dateTimeParser.parse("February 4, 2002 00:00:00.000"),
771                 DateUtils.round((Object) calAmPm2, Calendar.AM_PM));
772         assertEquals("truncate ampm-3 failed",
773                 dateTimeParser.parse("February 3, 2002 12:00:00.000"),
774                 DateUtils.round((Object) calAmPm3, Calendar.AM_PM));
775         assertEquals("truncate ampm-4 failed",
776                 dateTimeParser.parse("February 4, 2002 12:00:00.000"),
777                 DateUtils.round((Object) calAmPm4, Calendar.AM_PM));
778         
779         // Fix for http://issues.apache.org/bugzilla/show_bug.cgi?id=25560
780         // Test rounding across the beginning of daylight saving time
781         TimeZone.setDefault(zone);
782         dateTimeParser.setTimeZone(zone);
783         assertEquals("round MET date across DST change-over",
784                 dateTimeParser.parse("March 30, 2003 00:00:00.000"),
785                 DateUtils.round(date4, Calendar.DATE));
786         assertEquals("round MET date across DST change-over",
787                 dateTimeParser.parse("March 30, 2003 00:00:00.000"),
788                 DateUtils.round((Object) cal4, Calendar.DATE));
789         assertEquals("round MET date across DST change-over",
790                 dateTimeParser.parse("March 30, 2003 00:00:00.000"),
791                 DateUtils.round(date5, Calendar.DATE));
792         assertEquals("round MET date across DST change-over",
793                 dateTimeParser.parse("March 30, 2003 00:00:00.000"),
794                 DateUtils.round((Object) cal5, Calendar.DATE));
795         assertEquals("round MET date across DST change-over",
796                 dateTimeParser.parse("March 30, 2003 00:00:00.000"),
797                 DateUtils.round(date6, Calendar.DATE));
798         assertEquals("round MET date across DST change-over",
799                 dateTimeParser.parse("March 30, 2003 00:00:00.000"),
800                 DateUtils.round((Object) cal6, Calendar.DATE));
801         assertEquals("round MET date across DST change-over",
802                 dateTimeParser.parse("March 30, 2003 00:00:00.000"),
803                 DateUtils.round(date7, Calendar.DATE));
804         assertEquals("round MET date across DST change-over",
805                 dateTimeParser.parse("March 30, 2003 00:00:00.000"),
806                 DateUtils.round((Object) cal7, Calendar.DATE));
807         
808         assertEquals("round MET date across DST change-over",
809                 dateTimeParser.parse("March 30, 2003 01:00:00.000"),
810                 DateUtils.round(date4, Calendar.HOUR_OF_DAY));
811         assertEquals("round MET date across DST change-over",
812                 dateTimeParser.parse("March 30, 2003 01:00:00.000"),
813                 DateUtils.round((Object) cal4, Calendar.HOUR_OF_DAY));
814         if (SystemUtils.isJavaVersionAtLeast(1.4f)) {
815             assertEquals("round MET date across DST change-over",
816                     dateTimeParser.parse("March 30, 2003 03:00:00.000"),
817                     DateUtils.round(date5, Calendar.HOUR_OF_DAY));
818             assertEquals("round MET date across DST change-over",
819                     dateTimeParser.parse("March 30, 2003 03:00:00.000"),
820                     DateUtils.round((Object) cal5, Calendar.HOUR_OF_DAY));
821             assertEquals("round MET date across DST change-over",
822                     dateTimeParser.parse("March 30, 2003 03:00:00.000"),
823                     DateUtils.round(date6, Calendar.HOUR_OF_DAY));
824             assertEquals("round MET date across DST change-over",
825                     dateTimeParser.parse("March 30, 2003 03:00:00.000"),
826                     DateUtils.round((Object) cal6, Calendar.HOUR_OF_DAY));
827             assertEquals("round MET date across DST change-over",
828                     dateTimeParser.parse("March 30, 2003 04:00:00.000"),
829                     DateUtils.round(date7, Calendar.HOUR_OF_DAY));
830             assertEquals("round MET date across DST change-over",
831                     dateTimeParser.parse("March 30, 2003 04:00:00.000"),
832                     DateUtils.round((Object) cal7, Calendar.HOUR_OF_DAY));
833         } else {
834             this.warn("WARNING: Some date rounding tests not run since the current version is " + SystemUtils.JAVA_VERSION);
835         }
836         TimeZone.setDefault(defaultZone);
837         dateTimeParser.setTimeZone(defaultZone);
838     }
839 
840     /**
841      * Tests the Changes Made by LANG-346 to the DateUtils.modify() private method invoked
842      * by DateUtils.round().
843      */
844     public void testRoundLang346() throws Exception
845     {
846         TimeZone.setDefault(defaultZone);
847         dateTimeParser.setTimeZone(defaultZone);
848         Calendar testCalendar = Calendar.getInstance();
849         testCalendar.set(2007, 6, 2, 8, 8, 50);
850         Date date = testCalendar.getTime();
851         assertEquals("Minute Round Up Failed",
852                      dateTimeParser.parse("July 2, 2007 08:09:00.000"),
853                      DateUtils.round(date, Calendar.MINUTE));
854 
855         testCalendar.set(2007, 6, 2, 8, 8, 20);
856         date = testCalendar.getTime();
857         assertEquals("Minute No Round Failed",
858                      dateTimeParser.parse("July 2, 2007 08:08:00.000"),
859                      DateUtils.round(date, Calendar.MINUTE));
860 
861         testCalendar.set(2007, 6, 2, 8, 8, 50);
862         testCalendar.set(Calendar.MILLISECOND, 600);
863         date = testCalendar.getTime();
864 
865         assertEquals("Second Round Up with 600 Milli Seconds Failed",
866                      dateTimeParser.parse("July 2, 2007 08:08:51.000"),
867                      DateUtils.round(date, Calendar.SECOND));
868 
869         testCalendar.set(2007, 6, 2, 8, 8, 50);
870         testCalendar.set(Calendar.MILLISECOND, 200);
871         date = testCalendar.getTime();
872         assertEquals("Second Round Down with 200 Milli Seconds Failed",
873                      dateTimeParser.parse("July 2, 2007 08:08:50.000"),
874                      DateUtils.round(date, Calendar.SECOND));
875 
876         testCalendar.set(2007, 6, 2, 8, 8, 20);
877         testCalendar.set(Calendar.MILLISECOND, 600);
878         date = testCalendar.getTime();
879         assertEquals("Second Round Up with 200 Milli Seconds Failed",
880                      dateTimeParser.parse("July 2, 2007 08:08:21.000"),
881                      DateUtils.round(date, Calendar.SECOND));
882 
883         testCalendar.set(2007, 6, 2, 8, 8, 20);
884         testCalendar.set(Calendar.MILLISECOND, 200);
885         date = testCalendar.getTime();
886         assertEquals("Second Round Down with 200 Milli Seconds Failed",
887                      dateTimeParser.parse("July 2, 2007 08:08:20.000"),
888                      DateUtils.round(date, Calendar.SECOND));
889 
890         testCalendar.set(2007, 6, 2, 8, 8, 50);
891         date = testCalendar.getTime();
892         assertEquals("Hour Round Down Failed",
893                      dateTimeParser.parse("July 2, 2007 08:00:00.000"),
894                      DateUtils.round(date, Calendar.HOUR));
895 
896         testCalendar.set(2007, 6, 2, 8, 31, 50);
897         date = testCalendar.getTime();
898         assertEquals("Hour Round Up Failed",
899                      dateTimeParser.parse("July 2, 2007 09:00:00.000"),
900                      DateUtils.round(date, Calendar.HOUR));
901     }
902 
903     /**
904      * Tests various values with the trunc method
905      */
906     public void testTruncate() throws Exception {
907         // tests public static Date truncate(Date date, int field)
908         assertEquals("truncate year-1 failed",
909                 dateParser.parse("January 1, 2002"),
910                 DateUtils.truncate(date1, Calendar.YEAR));
911         assertEquals("truncate year-2 failed",
912                 dateParser.parse("January 1, 2001"),
913                 DateUtils.truncate(date2, Calendar.YEAR));
914         assertEquals("truncate month-1 failed",
915                 dateParser.parse("February 1, 2002"),
916                 DateUtils.truncate(date1, Calendar.MONTH));
917         assertEquals("truncate month-2 failed",
918                 dateParser.parse("November 1, 2001"),
919                 DateUtils.truncate(date2, Calendar.MONTH));
920         assertEquals("truncate semimonth-1 failed",
921                 dateParser.parse("February 1, 2002"),
922                 DateUtils.truncate(date1, DateUtils.SEMI_MONTH));
923         assertEquals("truncate semimonth-2 failed",
924                 dateParser.parse("November 16, 2001"),
925                 DateUtils.truncate(date2, DateUtils.SEMI_MONTH));
926         assertEquals("truncate date-1 failed",
927                 dateParser.parse("February 12, 2002"),
928                 DateUtils.truncate(date1, Calendar.DATE));
929         assertEquals("truncate date-2 failed",
930                 dateParser.parse("November 18, 2001"),
931                 DateUtils.truncate(date2, Calendar.DATE));
932         assertEquals("truncate hour-1 failed",
933                 dateTimeParser.parse("February 12, 2002 12:00:00.000"),
934                 DateUtils.truncate(date1, Calendar.HOUR));
935         assertEquals("truncate hour-2 failed",
936                 dateTimeParser.parse("November 18, 2001 1:00:00.000"),
937                 DateUtils.truncate(date2, Calendar.HOUR));
938         assertEquals("truncate minute-1 failed",
939                 dateTimeParser.parse("February 12, 2002 12:34:00.000"),
940                 DateUtils.truncate(date1, Calendar.MINUTE));
941         assertEquals("truncate minute-2 failed",
942                 dateTimeParser.parse("November 18, 2001 1:23:00.000"),
943                 DateUtils.truncate(date2, Calendar.MINUTE));
944         assertEquals("truncate second-1 failed",
945                 dateTimeParser.parse("February 12, 2002 12:34:56.000"),
946                 DateUtils.truncate(date1, Calendar.SECOND));
947         assertEquals("truncate second-2 failed",
948                 dateTimeParser.parse("November 18, 2001 1:23:11.000"),
949                 DateUtils.truncate(date2, Calendar.SECOND));
950         assertEquals("truncate ampm-1 failed",
951                 dateTimeParser.parse("February 3, 2002 00:00:00.000"),
952                 DateUtils.truncate(dateAmPm1, Calendar.AM_PM));
953         assertEquals("truncate ampm-2 failed",
954                 dateTimeParser.parse("February 3, 2002 00:00:00.000"),
955                 DateUtils.truncate(dateAmPm2, Calendar.AM_PM));
956         assertEquals("truncate ampm-3 failed",
957                 dateTimeParser.parse("February 3, 2002 12:00:00.000"),
958                 DateUtils.truncate(dateAmPm3, Calendar.AM_PM));
959         assertEquals("truncate ampm-4 failed",
960                 dateTimeParser.parse("February 3, 2002 12:00:00.000"),
961                 DateUtils.truncate(dateAmPm4, Calendar.AM_PM));
962 
963         // tests public static Date truncate(Object date, int field)
964         assertEquals("truncate year-1 failed",
965                 dateParser.parse("January 1, 2002"),
966                 DateUtils.truncate((Object) date1, Calendar.YEAR));
967         assertEquals("truncate year-2 failed",
968                 dateParser.parse("January 1, 2001"),
969                 DateUtils.truncate((Object) date2, Calendar.YEAR));
970         assertEquals("truncate month-1 failed",
971                 dateParser.parse("February 1, 2002"),
972                 DateUtils.truncate((Object) date1, Calendar.MONTH));
973         assertEquals("truncate month-2 failed",
974                 dateParser.parse("November 1, 2001"),
975                 DateUtils.truncate((Object) date2, Calendar.MONTH));
976         assertEquals("truncate semimonth-1 failed",
977                 dateParser.parse("February 1, 2002"),
978                 DateUtils.truncate((Object) date1, DateUtils.SEMI_MONTH));
979         assertEquals("truncate semimonth-2 failed",
980                 dateParser.parse("November 16, 2001"),
981                 DateUtils.truncate((Object) date2, DateUtils.SEMI_MONTH));
982         assertEquals("truncate date-1 failed",
983                 dateParser.parse("February 12, 2002"),
984                 DateUtils.truncate((Object) date1, Calendar.DATE));
985         assertEquals("truncate date-2 failed",
986                 dateParser.parse("November 18, 2001"),
987                 DateUtils.truncate((Object) date2, Calendar.DATE));
988         assertEquals("truncate hour-1 failed",
989                 dateTimeParser.parse("February 12, 2002 12:00:00.000"),
990                 DateUtils.truncate((Object) date1, Calendar.HOUR));
991         assertEquals("truncate hour-2 failed",
992                 dateTimeParser.parse("November 18, 2001 1:00:00.000"),
993                 DateUtils.truncate((Object) date2, Calendar.HOUR));
994         assertEquals("truncate minute-1 failed",
995                 dateTimeParser.parse("February 12, 2002 12:34:00.000"),
996                 DateUtils.truncate((Object) date1, Calendar.MINUTE));
997         assertEquals("truncate minute-2 failed",
998                 dateTimeParser.parse("November 18, 2001 1:23:00.000"),
999                 DateUtils.truncate((Object) date2, Calendar.MINUTE));
1000         assertEquals("truncate second-1 failed",
1001                 dateTimeParser.parse("February 12, 2002 12:34:56.000"),
1002                 DateUtils.truncate((Object) date1, Calendar.SECOND));
1003         assertEquals("truncate second-2 failed",
1004                 dateTimeParser.parse("November 18, 2001 1:23:11.000"),
1005                 DateUtils.truncate((Object) date2, Calendar.SECOND));
1006         assertEquals("truncate ampm-1 failed",
1007                 dateTimeParser.parse("February 3, 2002 00:00:00.000"),
1008                 DateUtils.truncate((Object) dateAmPm1, Calendar.AM_PM));
1009         assertEquals("truncate ampm-2 failed",
1010                 dateTimeParser.parse("February 3, 2002 00:00:00.000"),
1011                 DateUtils.truncate((Object) dateAmPm2, Calendar.AM_PM));
1012         assertEquals("truncate ampm-3 failed",
1013                 dateTimeParser.parse("February 3, 2002 12:00:00.000"),
1014                 DateUtils.truncate((Object) dateAmPm3, Calendar.AM_PM));
1015         assertEquals("truncate ampm-4 failed",
1016                 dateTimeParser.parse("February 3, 2002 12:00:00.000"),
1017                 DateUtils.truncate((Object) dateAmPm4, Calendar.AM_PM));
1018         
1019         assertEquals("truncate calendar second-1 failed",
1020                 dateTimeParser.parse("February 12, 2002 12:34:56.000"),
1021                 DateUtils.truncate((Object) cal1, Calendar.SECOND));
1022         assertEquals("truncate calendar second-2 failed",
1023                 dateTimeParser.parse("November 18, 2001 1:23:11.000"),
1024                 DateUtils.truncate((Object) cal2, Calendar.SECOND));
1025         
1026         assertEquals("truncate ampm-1 failed",
1027                 dateTimeParser.parse("February 3, 2002 00:00:00.000"),
1028                 DateUtils.truncate((Object) calAmPm1, Calendar.AM_PM));
1029         assertEquals("truncate ampm-2 failed",
1030                 dateTimeParser.parse("February 3, 2002 00:00:00.000"),
1031                 DateUtils.truncate((Object) calAmPm2, Calendar.AM_PM));
1032         assertEquals("truncate ampm-3 failed",
1033                 dateTimeParser.parse("February 3, 2002 12:00:00.000"),
1034                 DateUtils.truncate((Object) calAmPm3, Calendar.AM_PM));
1035         assertEquals("truncate ampm-4 failed",
1036                 dateTimeParser.parse("February 3, 2002 12:00:00.000"),
1037                 DateUtils.truncate((Object) calAmPm4, Calendar.AM_PM));
1038         
1039         try {
1040             DateUtils.truncate((Date) null, Calendar.SECOND);
1041             fail();
1042         } catch (IllegalArgumentException ex) {}
1043         try {
1044             DateUtils.truncate((Calendar) null, Calendar.SECOND);
1045             fail();
1046         } catch (IllegalArgumentException ex) {}
1047         try {
1048             DateUtils.truncate((Object) null, Calendar.SECOND);
1049             fail();
1050         } catch (IllegalArgumentException ex) {}
1051         try {
1052             DateUtils.truncate("", Calendar.SECOND);
1053             fail();
1054         } catch (ClassCastException ex) {}
1055 
1056         // Fix for http://issues.apache.org/bugzilla/show_bug.cgi?id=25560
1057         // Test truncate across beginning of daylight saving time
1058         TimeZone.setDefault(zone);
1059         dateTimeParser.setTimeZone(zone);
1060         assertEquals("truncate MET date across DST change-over",
1061                 dateTimeParser.parse("March 30, 2003 00:00:00.000"),
1062                 DateUtils.truncate(date3, Calendar.DATE));
1063         assertEquals("truncate MET date across DST change-over",
1064                 dateTimeParser.parse("March 30, 2003 00:00:00.000"),
1065                 DateUtils.truncate((Object) cal3, Calendar.DATE));
1066         // Test truncate across end of daylight saving time
1067         assertEquals("truncate MET date across DST change-over",
1068                 dateTimeParser.parse("October 26, 2003 00:00:00.000"),
1069                 DateUtils.truncate(date8, Calendar.DATE));
1070         assertEquals("truncate MET date across DST change-over",
1071                 dateTimeParser.parse("October 26, 2003 00:00:00.000"),
1072                 DateUtils.truncate((Object) cal8, Calendar.DATE));
1073         TimeZone.setDefault(defaultZone);
1074         dateTimeParser.setTimeZone(defaultZone);
1075         
1076         // Bug 31395, large dates
1077         Date endOfTime = new Date(Long.MAX_VALUE); // fyi: Sun Aug 17 07:12:55 CET 292278994 -- 807 millis
1078         GregorianCalendar endCal = new GregorianCalendar();
1079         endCal.setTime(endOfTime);
1080         try {
1081             DateUtils.truncate(endCal, Calendar.DATE);
1082             fail();
1083         } catch (ArithmeticException ex) {}
1084         endCal.set(Calendar.YEAR, 280000001);
1085         try {
1086             DateUtils.truncate(endCal, Calendar.DATE);
1087             fail();
1088         } catch (ArithmeticException ex) {}
1089         endCal.set(Calendar.YEAR, 280000000);
1090         Calendar cal = DateUtils.truncate(endCal, Calendar.DATE);
1091         assertEquals(0, cal.get(Calendar.HOUR));
1092     }
1093 
1094     /**
1095      * Tests for LANG-59
1096      *
1097      * see http://issues.apache.org/jira/browse/LANG-59
1098      */
1099     public void testTruncateLang59() throws Exception {
1100         if (!SystemUtils.isJavaVersionAtLeast(1.4f)) {
1101             this.warn("WARNING: Test for LANG-59 not run since the current version is " + SystemUtils.JAVA_VERSION);
1102             return;
1103         }
1104 
1105         // Set TimeZone to Mountain Time
1106         TimeZone MST_MDT = TimeZone.getTimeZone("MST7MDT");
1107         TimeZone.setDefault(MST_MDT);
1108         DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS z");
1109         format.setTimeZone(MST_MDT);
1110 
1111         Date oct31_01MDT = new Date(1099206000000L); 
1112 
1113         Date oct31MDT             = new Date(oct31_01MDT.getTime()       - 3600000L); // - 1 hour
1114         Date oct31_01_02MDT       = new Date(oct31_01MDT.getTime()       + 120000L);  // + 2 minutes
1115         Date oct31_01_02_03MDT    = new Date(oct31_01_02MDT.getTime()    + 3000L);    // + 3 seconds
1116         Date oct31_01_02_03_04MDT = new Date(oct31_01_02_03MDT.getTime() + 4L);       // + 4 milliseconds
1117 
1118         assertEquals("Check 00:00:00.000", "2004-10-31 00:00:00.000 MDT", format.format(oct31MDT));
1119         assertEquals("Check 01:00:00.000", "2004-10-31 01:00:00.000 MDT", format.format(oct31_01MDT));
1120         assertEquals("Check 01:02:00.000", "2004-10-31 01:02:00.000 MDT", format.format(oct31_01_02MDT));
1121         assertEquals("Check 01:02:03.000", "2004-10-31 01:02:03.000 MDT", format.format(oct31_01_02_03MDT));
1122         assertEquals("Check 01:02:03.004", "2004-10-31 01:02:03.004 MDT", format.format(oct31_01_02_03_04MDT));
1123 
1124         // ------- Demonstrate Problem -------
1125         Calendar gval = Calendar.getInstance();
1126         gval.setTime(new Date(oct31_01MDT.getTime()));
1127         gval.set(Calendar.MINUTE, gval.get(Calendar.MINUTE)); // set minutes to the same value
1128         assertEquals("Demonstrate Problem", gval.getTime().getTime(), oct31_01MDT.getTime() + 3600000L);
1129 
1130         // ---------- Test Truncate ----------
1131         assertEquals("Truncate Calendar.MILLISECOND",
1132                 oct31_01_02_03_04MDT, DateUtils.truncate(oct31_01_02_03_04MDT, Calendar.MILLISECOND));
1133 
1134         assertEquals("Truncate Calendar.SECOND",
1135                    oct31_01_02_03MDT, DateUtils.truncate(oct31_01_02_03_04MDT, Calendar.SECOND));
1136 
1137         assertEquals("Truncate Calendar.MINUTE",
1138                       oct31_01_02MDT, DateUtils.truncate(oct31_01_02_03_04MDT, Calendar.MINUTE));
1139 
1140         assertEquals("Truncate Calendar.HOUR_OF_DAY",
1141                          oct31_01MDT, DateUtils.truncate(oct31_01_02_03_04MDT, Calendar.HOUR_OF_DAY));
1142 
1143         assertEquals("Truncate Calendar.HOUR",
1144                          oct31_01MDT, DateUtils.truncate(oct31_01_02_03_04MDT, Calendar.HOUR));
1145 
1146         assertEquals("Truncate Calendar.DATE",
1147                             oct31MDT, DateUtils.truncate(oct31_01_02_03_04MDT, Calendar.DATE));
1148 
1149 
1150         // ---------- Test Round (down) ----------
1151         assertEquals("Round Calendar.MILLISECOND",
1152                 oct31_01_02_03_04MDT, DateUtils.round(oct31_01_02_03_04MDT, Calendar.MILLISECOND));
1153 
1154         assertEquals("Round Calendar.SECOND",
1155                    oct31_01_02_03MDT, DateUtils.round(oct31_01_02_03_04MDT, Calendar.SECOND));
1156 
1157         assertEquals("Round Calendar.MINUTE",
1158                       oct31_01_02MDT, DateUtils.round(oct31_01_02_03_04MDT, Calendar.MINUTE));
1159 
1160         assertEquals("Round Calendar.HOUR_OF_DAY",
1161                          oct31_01MDT, DateUtils.round(oct31_01_02_03_04MDT, Calendar.HOUR_OF_DAY));
1162 
1163         assertEquals("Round Calendar.HOUR",
1164                          oct31_01MDT, DateUtils.round(oct31_01_02_03_04MDT, Calendar.HOUR));
1165 
1166         assertEquals("Round Calendar.DATE",
1167                             oct31MDT, DateUtils.round(oct31_01_02_03_04MDT, Calendar.DATE));
1168 
1169         // restore default time zone
1170         TimeZone.setDefault(defaultZone);
1171     }
1172 
1173     /**
1174      * Tests the iterator exceptions
1175      */
1176     public void testIteratorEx() throws Exception {
1177         try {
1178             DateUtils.iterator(Calendar.getInstance(), -9999);
1179         } catch (IllegalArgumentException ex) {}
1180         try {
1181             DateUtils.iterator((Date) null, DateUtils.RANGE_WEEK_CENTER);
1182             fail();
1183         } catch (IllegalArgumentException ex) {}
1184         try {
1185             DateUtils.iterator((Calendar) null, DateUtils.RANGE_WEEK_CENTER);
1186             fail();
1187         } catch (IllegalArgumentException ex) {}
1188         try {
1189             DateUtils.iterator((Object) null, DateUtils.RANGE_WEEK_CENTER);
1190             fail();
1191         } catch (IllegalArgumentException ex) {}
1192         try {
1193             DateUtils.iterator("", DateUtils.RANGE_WEEK_CENTER);
1194             fail();
1195         } catch (ClassCastException ex) {}
1196     }
1197 
1198     /**
1199      * Tests the calendar iterator for week ranges
1200      */
1201     public void testWeekIterator() throws Exception {
1202         Calendar now = Calendar.getInstance();
1203         for (int i = 0; i< 7; i++) {
1204             Calendar today = DateUtils.truncate(now, Calendar.DATE);
1205             Calendar sunday = DateUtils.truncate(now, Calendar.DATE);
1206             sunday.add(Calendar.DATE, 1 - sunday.get(Calendar.DAY_OF_WEEK));
1207             Calendar monday = DateUtils.truncate(now, Calendar.DATE);
1208             if (monday.get(Calendar.DAY_OF_WEEK) == 1) {
1209                 //This is sunday... roll back 6 days
1210                 monday.add(Calendar.DATE, -6);
1211             } else {
1212                 monday.add(Calendar.DATE, 2 - monday.get(Calendar.DAY_OF_WEEK));
1213             }
1214             Calendar centered = DateUtils.truncate(now, Calendar.DATE);
1215             centered.add(Calendar.DATE, -3);
1216             
1217             Iterator it = DateUtils.iterator(now, DateUtils.RANGE_WEEK_SUNDAY);
1218             assertWeekIterator(it, sunday);
1219             it = DateUtils.iterator(now, DateUtils.RANGE_WEEK_MONDAY);
1220             assertWeekIterator(it, monday);
1221             it = DateUtils.iterator(now, DateUtils.RANGE_WEEK_RELATIVE);
1222             assertWeekIterator(it, today);
1223             it = DateUtils.iterator(now, DateUtils.RANGE_WEEK_CENTER);
1224             assertWeekIterator(it, centered);
1225             
1226             it = DateUtils.iterator((Object) now, DateUtils.RANGE_WEEK_CENTER);
1227             assertWeekIterator(it, centered);
1228             it = DateUtils.iterator((Object) now.getTime(), DateUtils.RANGE_WEEK_CENTER);
1229             assertWeekIterator(it, centered);
1230             try {
1231                 it.next();
1232                 fail();
1233             } catch (NoSuchElementException ex) {}
1234             it = DateUtils.iterator(now, DateUtils.RANGE_WEEK_CENTER);
1235             it.next();
1236             try {
1237                 it.remove();
1238             } catch( UnsupportedOperationException ex) {}
1239             
1240             now.add(Calendar.DATE,1);
1241         }
1242     }
1243             
1244     /**
1245      * Tests the calendar iterator for month-based ranges
1246      */
1247     public void testMonthIterator() throws Exception {
1248         Iterator it = DateUtils.iterator(date1, DateUtils.RANGE_MONTH_SUNDAY);
1249         assertWeekIterator(it,
1250                 dateParser.parse("January 27, 2002"),
1251                 dateParser.parse("March 2, 2002"));
1252 
1253         it = DateUtils.iterator(date1, DateUtils.RANGE_MONTH_MONDAY);
1254         assertWeekIterator(it,
1255                 dateParser.parse("January 28, 2002"),
1256                 dateParser.parse("March 3, 2002"));
1257 
1258         it = DateUtils.iterator(date2, DateUtils.RANGE_MONTH_SUNDAY);
1259         assertWeekIterator(it,
1260                 dateParser.parse("October 28, 2001"),
1261                 dateParser.parse("December 1, 2001"));
1262 
1263         it = DateUtils.iterator(date2, DateUtils.RANGE_MONTH_MONDAY);
1264         assertWeekIterator(it,
1265                 dateParser.parse("October 29, 2001"),
1266                 dateParser.parse("December 2, 2001"));
1267     }
1268 
1269     /**
1270      * This checks that this is a 7 element iterator of Calendar objects
1271      * that are dates (no time), and exactly 1 day spaced after each other.
1272      */
1273     private static void assertWeekIterator(Iterator it, Calendar start) {
1274         Calendar end = (Calendar) start.clone();
1275         end.add(Calendar.DATE, 6);
1276 
1277         assertWeekIterator(it, start, end);
1278     }
1279 
1280     /**
1281      * Convenience method for when working with Date objects
1282      */
1283     private static void assertWeekIterator(Iterator it, Date start, Date end) {
1284         Calendar calStart = Calendar.getInstance();
1285         calStart.setTime(start);
1286         Calendar calEnd = Calendar.getInstance();
1287         calEnd.setTime(end);
1288 
1289         assertWeekIterator(it, calStart, calEnd);
1290     }
1291 
1292     /**
1293      * This checks that this is a 7 divisble iterator of Calendar objects
1294      * that are dates (no time), and exactly 1 day spaced after each other
1295      * (in addition to the proper start and stop dates)
1296      */
1297     private static void assertWeekIterator(Iterator it, Calendar start, Calendar end) {
1298         Calendar cal = (Calendar) it.next();
1299         assertEquals("", start, cal, 0);
1300         Calendar last = null;
1301         int count = 1;
1302         while (it.hasNext()) {
1303             //Check this is just a date (no time component)
1304             assertEquals("", cal, DateUtils.truncate(cal, Calendar.DATE), 0);
1305 
1306             last = cal;
1307             cal = (Calendar) it.next();
1308             count++;
1309 
1310             //Check that this is one day more than the last date
1311             last.add(Calendar.DATE, 1);
1312             assertEquals("", last, cal, 0);
1313         }
1314         if (count % 7 != 0) {
1315             throw new AssertionFailedError("There were " + count + " days in this iterator");
1316         }
1317         assertEquals("", end, cal, 0);