1   /*
2    * Created by IntelliJ IDEA.
3    * User: Administrator
4    * Date: 4/03/2002
5    * Time: 15:15:27
6    * To change template for new class use
7    * Code Style | Class Templates options (Tools | IDE Options).
8    */
9   package com.atlassian.core.util;
10  
11  import junit.framework.Test;
12  import junit.framework.TestCase;
13  import junit.framework.TestSuite;
14  
15  import java.sql.Timestamp;
16  import java.util.Calendar;
17  import java.util.GregorianCalendar;
18  import java.util.Locale;
19  import java.util.ResourceBundle;
20  import java.util.Date;
21  
22  public class TestDateUtils extends TestCase
23  {
24      private static long MINUTE = 60;
25      private static long HOUR = (60 * MINUTE);
26  
27      private static long SECOND_MS = 1000;
28      private static long MINUTE_MS = SECOND_MS * 60;
29      private static long HOUR_MS = MINUTE_MS * 60;
30      private static long DAY_MS = HOUR_MS * 24;
31  
32  
33      private ResourceBundle resourceBundle;
34  
35      protected void setUp() throws Exception
36      {
37          super.setUp();
38  
39          resourceBundle = ResourceBundle.getBundle("DateUtils", Locale.getDefault(), Thread.currentThread().getContextClassLoader());
40      }
41  
42      public void testEqualTimeStamps1()
43      {
44          Timestamp testa = new Timestamp(100000000);
45          testa.setTime(100000009);
46          Timestamp testb = new Timestamp(100000000);
47          testb.setTime(100000000);
48  
49          assertTrue((DateUtils.equalTimestamps(testa, testb)));
50      }
51  
52  
53      public void testEqualTimeStamps2()
54      {
55          Timestamp testa = new Timestamp(100000000);
56          testa.setTime(100000000);
57          Timestamp testb = new Timestamp(100000000);
58          testb.setTime(100000009);
59  
60          assertTrue(DateUtils.equalTimestamps(testa, testb));
61      }
62  
63      public void testEqualTimeStamps3()
64      {
65          Timestamp testa = new Timestamp(100000000);
66          testa.setTime(100000010);
67          Timestamp testb = new Timestamp(100000000);
68          testb.setTime(100000000);
69          assertTrue(!(DateUtils.equalTimestamps(testa, testb)));
70      }
71  
72      public void testEqualTimeStamps4()
73      {
74          Timestamp testa = new Timestamp(100000000);
75          testa.setTime(100000000);
76          Timestamp testb = new Timestamp(100000000);
77          testb.setTime(100000010);
78          assertTrue(!(DateUtils.equalTimestamps(testa, testb)));
79      }
80  
81      public void testFormatDate() throws Exception
82      {
83          assertEquals("2005-06-07 14:45:00,000", DateUtils.formatDateISO8601(new GregorianCalendar(2005, 5, 7, 14, 45).getTime()));
84      }
85      public void testDateDifference1()
86      {
87          _testDateDifference(0, 3, "0 minutes");
88          _testDateDifference(0, 4, "0 seconds");
89          _testDateDifference(cal(2000, 1, 1), cal(2000, 2, 1), 0, "0 months");
90          _testDateDifference(cal(2000, 1, 1), cal(2000, 4, 1), 0, "2 months");
91          _testDateDifference(cal(2000, 1, 1), cal(2000, 2, 1), 2, "29 days");
92          _testDateDifference(cal(2000, 1, 1), cal(2000, 2, 15), 1, "1 month, 12 days");
93          _testDateDifference(cal(2000, 1, 1), cal(2000, 2, 15), 2, "1 month, 12 days");
94          _testDateDifference(cal(2000, 1, 1), cal(2000, 1, 1), 1, "0 days");
95          _testDateDifference(cal(2000, 1, 1), cal(2000, 1, 1), 2, "0 hours");
96          _testDateDifference(cal(2000, 1, 1), cal(2000, 12, 1), 1, "10 months, 25 days");
97          _testDateDifference(cal(2000, 1, 1), cal(2000, 1, 2), 2, "1 day");
98          _testDateDifference(cal(2000, 12, 1), cal(2001, 1, 1), 2, "1 month");
99  //        _testDateDifference(cal(2000, 12, 1), cal(2002, 1, 1), 2, "1 year, 1 month");
100 //        _testDateDifference(cal(1999, 12, 1), cal(2002, 1, 1), 2, "2 years, 1 month");
101 //        _testDateDifference(cal(2004, 8, 29), cal(2007, 4, 26), 3, "2 years, 7 months"); //previously said "138 weeks, 3 days ago"
102 
103         _testDateDifference(3 * DAY_MS + 5 * HOUR_MS + 4 * MINUTE_MS + 30 * SECOND_MS, 4, "3 days, 5 hours, 4 minutes, 30 seconds");
104         _testDateDifference(3 * DAY_MS + 5 * HOUR_MS + 4 * MINUTE_MS + 1 * SECOND_MS, 4, "3 days, 5 hours, 4 minutes, 1 second");
105         _testDateDifference(3 * DAY_MS + 5 * HOUR_MS + 4 * MINUTE_MS + 30 * SECOND_MS, 3, "3 days, 5 hours, 4 minutes");
106         _testDateDifference(3 * DAY_MS + 5 * HOUR_MS + 4 * MINUTE_MS + 30 * SECOND_MS, 2, "3 days, 5 hours");
107         _testDateDifference(3 * DAY_MS + 5 * HOUR_MS + 4 * MINUTE_MS + 30 * SECOND_MS, 1, "3 days");
108         _testDateDifference(3 * DAY_MS + 5 * HOUR_MS + 4 * MINUTE_MS + 30 * SECOND_MS, 0, "0 months");
109 
110         _testDateDifference(1 * DAY_MS + 1 * HOUR_MS + 4 * MINUTE_MS + 30 * SECOND_MS, 2, "1 day, 1 hour");
111         _testDateDifference(3 * DAY_MS + 5 * HOUR_MS + 1 * MINUTE_MS + 30 * SECOND_MS, 3, "3 days, 5 hours, 1 minute");
112 
113     }
114 
115     private static Calendar cal(int year1, int month1, int day1)
116     {
117         Calendar cal = Calendar.getInstance();
118         cal.set(year1, month1, day1, 0, 0, 0);
119         cal.set(Calendar.MILLISECOND, 0);
120         return cal;
121     }
122 
123     private void _testDateDifference(long diff, int resolution, String expected)
124     {
125         long now = System.currentTimeMillis();
126         assertEquals(expected, DateUtils.dateDifference(now - diff, now, resolution, resourceBundle));
127     }
128 
129     private void _testDateDifference(Calendar cal1, Calendar cal2, int resolution, String expected)
130     {
131         assertEquals(expected, DateUtils.dateDifference(cal1.getTime().getTime(), cal2.getTime().getTime(), resolution, resourceBundle));
132     }
133 
134     public void testGetDuration() throws Exception
135     {
136         assertEquals(0 * MINUTE, DateUtils.getDuration(""));
137         assertEquals(0 * MINUTE, DateUtils.getDuration(" "));
138         assertEquals(0, DateUtils.getDuration("0"));
139         assertEquals(0 * MINUTE, DateUtils.getDuration(null));
140         assertEquals(60 * MINUTE, DateUtils.getDuration("60"));
141         assertEquals(60 * MINUTE, DateUtils.getDuration("60m"));
142         assertEquals(60 * MINUTE, DateUtils.getDuration("1h"));
143         assertEquals(120 * MINUTE, DateUtils.getDuration("2h"));
144         assertEquals(60 * 24 * 3 * MINUTE, DateUtils.getDuration("3d"));
145         assertEquals(60 * 24 * 7 * 4 * MINUTE, DateUtils.getDuration("4w"));
146         assertEquals(60 * 24 * 7 * 4 * MINUTE, DateUtils.getDuration("4WeEks"));
147         assertEquals(90 * MINUTE, DateUtils.getDuration("1h 30"));
148         assertEquals((3 * 24 * 60 + 4 * 60 + 30) * MINUTE, DateUtils.getDuration("3d 4h 30m"));
149         assertEquals((3 * 24 * 60 + 4 * 60 + 30) * MINUTE, DateUtils.getDuration("3d 4hours 30m"));
150         assertEquals((3 * 24 * 60 + 4 * 60 + 30) * MINUTE, DateUtils.getDuration("3d, 4h, 30m"));
151         assertEquals((3 * 24 * 60 + 4 * 60 + 30) * MINUTE, DateUtils.getDuration("3d, 4h, 30minute"));
152         assertEquals((3 * 24 * 60 + 4 * 60 + 30) * MINUTE, DateUtils.getDuration("3days, 4hours, 30minutes"));
153         assertEquals((4 * 7 * 24 * 60 + 3 * 24 * 60 + 4 * 60 + 30) * MINUTE, DateUtils.getDuration("4w 3d 4h 30m"));
154         
155         // try different default durations.
156         assertEquals(5 * 24 * 60 * MINUTE , DateUtils.getDuration("5", DateUtils.Duration.DAY));
157         assertEquals(7 * 60 * MINUTE , DateUtils.getDuration("7", DateUtils.Duration.HOUR));
158         assertEquals(2 * 7 * 24 * 60 * MINUTE , DateUtils.getDuration("2", DateUtils.Duration.WEEK));
159 
160         // try different hours per day and days per week
161         assertEquals(5 * 8 * 60 * MINUTE, DateUtils.getDuration("5d", 8, 7));
162         assertEquals(2 * 5 * 8 * 60 * MINUTE, DateUtils.getDuration("2w", 8, 5));
163         assertEquals(21 * 8 * 60 * MINUTE, DateUtils.getDuration("21", 8, 5, DateUtils.Duration.DAY));
164         assertEquals(3 * 5 * 8 * 60 * MINUTE, DateUtils.getDuration("3", 8, 5, DateUtils.Duration.WEEK));
165 
166         // try some stuff with decimal fractions
167         final long hour_2_5 = (long) (2.5 * 60 * MINUTE);
168         assertEquals(hour_2_5, DateUtils.getDuration("2.5h", 8, 5));
169         final long day_25 = (long) (.25 * 8 * 60 * MINUTE);
170         assertEquals(day_25, DateUtils.getDuration(".25d", 8, 5));
171         assertEquals(day_25, DateUtils.getDuration("0.25d", 8, 5));
172         final long week_3_2 = (long) (3.2 * 5 * 8 * 60 * MINUTE);
173         assertEquals(week_3_2, DateUtils.getDuration("3.2w", 8, 5));
174 
175         // just make sure they all work together
176         assertEquals(hour_2_5 + day_25 + week_3_2, DateUtils.getDuration("3.2w .25d 2.5h", 8, 5));
177 
178         // negative numbers aren't allowed
179         try
180         {
181             DateUtils.getDuration("-7.5d");
182             fail();
183         }
184         catch (InvalidDurationException e) {}
185 
186         // no sub-minute fractions allowed
187         try
188         {
189             DateUtils.getDuration("1.5m");
190             fail();
191         }
192         catch (InvalidDurationException e) {}
193 
194         // no sub-minute fractions allowed
195         try
196         {
197             // resolves to 15.6 minutes
198             DateUtils.getDuration(".27h");
199             fail();
200         }
201         catch (InvalidDurationException e) {}
202 
203         // must have a digit after the decimal
204         try
205         {
206             DateUtils.getDuration("5.w");
207             fail();
208         }
209         catch (InvalidDurationException e) {}
210 
211         try
212         {
213             DateUtils.getDuration("foo");
214             fail();
215         }
216         catch (InvalidDurationException e)
217         {
218         }
219 
220         try
221         {
222             DateUtils.getDuration("60s");
223             fail();
224         }
225         catch (InvalidDurationException e)
226         {
227         }
228 
229         try
230         {
231             DateUtils.getDuration("3dumdidum");
232             fail();
233         }
234         catch (InvalidDurationException e)
235         {
236         }
237 
238         try
239         {
240             DateUtils.getDuration("10wikipedia");
241             fail();
242         }
243         catch (InvalidDurationException e)
244         {
245         }
246 
247         try
248         {
249             DateUtils.getDuration("wikipedia");
250             fail();
251         }
252         catch (InvalidDurationException e)
253         {
254         }
255 
256         try
257         {
258             DateUtils.getDuration("123120893wewerewrasdfdsfxcvb");
259             fail();
260         }
261         catch (InvalidDurationException e)
262         {
263         }
264 
265         try
266         {
267             DateUtils.getDuration("13dasdys, 2weeks");
268             fail();
269         }
270         catch (InvalidDurationException e)
271         {
272         }
273     }
274 
275     public void testValidDuration() throws Exception
276     {
277         assertTrue(DateUtils.validDuration(""));
278         assertTrue(DateUtils.validDuration(" "));
279         assertTrue(DateUtils.validDuration(null));
280         assertTrue(DateUtils.validDuration("60"));
281         assertTrue(DateUtils.validDuration("60m"));
282         assertTrue(DateUtils.validDuration("1h"));
283         assertTrue(DateUtils.validDuration("2d"));
284         assertTrue(DateUtils.validDuration("3w"));
285         assertTrue(DateUtils.validDuration("1w 2d 3h 4m"));
286         assertTrue(DateUtils.validDuration("1weeks 2days 3hours 4minutes"));
287         assertTrue(DateUtils.validDuration("1weeks, 2days, 3hours, 4minutes"));
288 
289         assertFalse(DateUtils.validDuration("foo"));
290         assertFalse(DateUtils.validDuration("60s"));
291         assertFalse(DateUtils.validDuration("60magic"));
292         assertFalse(DateUtils.validDuration("3dogs"));
293         assertFalse(DateUtils.validDuration("4hippos"));
294         assertFalse(DateUtils.validDuration("5windows"));
295         assertFalse(DateUtils.validDuration("h"));
296         assertFalse(DateUtils.validDuration("1w 2d 3h 27garbage"));
297     }
298 
299     public void testGetDurationCustomDefault() throws Exception
300     {
301         assertEquals(0, DateUtils.getDuration("", DateUtils.Duration.DAY));
302         assertEquals(0, DateUtils.getDuration(" ", DateUtils.Duration.WEEK));
303         assertEquals(1209600, DateUtils.getDuration("2", DateUtils.Duration.WEEK));
304         assertEquals(62, DateUtils.getDuration("1m 2", DateUtils.Duration.SECOND));
305         assertEquals(841440, DateUtils.getDuration("6d 12h 44m 77", DateUtils.Duration.HOUR));
306 
307         // same tests as in above unit test but with extra parameter to make sure we don't break any parsing
308         // by specifying custom default
309         assertEquals(60 * MINUTE, DateUtils.getDuration("60m", DateUtils.Duration.HOUR));
310         assertEquals(120 * MINUTE, DateUtils.getDuration("2h", DateUtils.Duration.MONTH));
311         assertEquals(60 * 24 * 3 * MINUTE, DateUtils.getDuration("3d", DateUtils.Duration.SECOND));
312         assertEquals(60 * 24 * 7 * 4 * MINUTE, DateUtils.getDuration("4w", DateUtils.Duration.DAY));
313         assertEquals(60 * 24 * 7 * 4 * MINUTE, DateUtils.getDuration("4weeks", DateUtils.Duration.MINUTE));
314         assertEquals((3 * 24 * 60 + 4 * 60 + 30) * MINUTE, DateUtils.getDuration("3d 4h 30m", DateUtils.Duration.WEEK));
315         assertEquals((3 * 24 * 60 + 4 * 60 + 30) * MINUTE, DateUtils.getDuration("3d, 4h, 30m", DateUtils.Duration.YEAR));
316         assertEquals((3 * 24 * 60 + 4 * 60 + 30) * MINUTE, DateUtils.getDuration("3days, 4hours, 30minutes", DateUtils.Duration.HOUR));
317         assertEquals((4 * 7 * 24 * 60 + 3 * 24 * 60 + 4 * 60 + 30) * MINUTE, DateUtils.getDuration("4w 3d 4h 30m", DateUtils.Duration.WEEK));
318         assertEquals(MINUTE, DateUtils.getDuration("1mInuTe", DateUtils.Duration.HOUR));
319         assertEquals(MINUTE, DateUtils.getDuration("1mInuTes", DateUtils.Duration.HOUR));
320         assertEquals(HOUR, DateUtils.getDuration("1HoUr", DateUtils.Duration.HOUR));
321         assertEquals(HOUR, DateUtils.getDuration("1HoUrs", DateUtils.Duration.HOUR));
322         assertEquals(24 * HOUR, DateUtils.getDuration("1DaY", DateUtils.Duration.HOUR));
323         assertEquals(24 * HOUR, DateUtils.getDuration("1dAyS", DateUtils.Duration.HOUR));
324         assertEquals(24 * 7 * HOUR, DateUtils.getDuration("1wEeK", DateUtils.Duration.HOUR));
325         assertEquals(24 * 7 * HOUR, DateUtils.getDuration("1wEekS", DateUtils.Duration.HOUR));
326 
327         try
328         {
329             DateUtils.getDuration("foo");
330             fail();
331         }
332         catch (InvalidDurationException e)
333         {
334             // expected
335         }
336 
337         try
338         {
339             DateUtils.getDuration("60s");
340             fail();
341         }
342         catch (InvalidDurationException e)
343         {
344             // expected
345         }
346     }
347 
348     public void testGetDuration2() throws InvalidDurationException
349     {
350         int hoursInDay = 8;
351         int daysInWeek = 5;
352         assertEquals(90 * MINUTE, DateUtils.getDuration("1h 30", hoursInDay, daysInWeek));
353         assertEquals((3 * hoursInDay * 60 + 4 * 60 + 30) * MINUTE, DateUtils.getDuration("3d 4h 30m", hoursInDay, daysInWeek));
354         assertEquals((4 * daysInWeek * hoursInDay * 60 + 3 * hoursInDay * 60 + 4 * 60 + 30) * MINUTE, DateUtils.getDuration("4w 3d 4h 30m", hoursInDay, daysInWeek));
355     }
356 
357     public void testGetDurationWithNegative() throws InvalidDurationException
358     {
359         assertEquals(0, DateUtils.getDurationWithNegative(" "));
360         assertEquals(0, DateUtils.getDurationWithNegative(""));
361         assertEquals(90 * MINUTE, DateUtils.getDurationWithNegative("1h 30"));
362         assertEquals(-90 * MINUTE, DateUtils.getDurationWithNegative("-1h 30"));
363         assertEquals(-7 * HOUR, DateUtils.getDurationWithNegative("- 7h"));
364         try
365         {
366             DateUtils.getDurationWithNegative("-7h -6m");
367             fail("Should have thrown exception");
368         }
369         catch (InvalidDurationException e)
370         {
371         }
372     }
373 
374     public void testDurationString() throws Exception
375     {
376         assertEquals("0m", DateUtils.getDurationString(0 * MINUTE));
377         assertEquals("30m", DateUtils.getDurationString(30 * MINUTE));
378         assertEquals("1h", DateUtils.getDurationString(60 * MINUTE));
379         assertEquals("2h", DateUtils.getDurationString(120 * MINUTE));
380         assertEquals("3d", DateUtils.getDurationString(60 * 24 * 3 * MINUTE));
381         assertEquals("4w", DateUtils.getDurationString(4 * 7 * 24 * 60 * MINUTE));
382         assertEquals("1h 30m", DateUtils.getDurationString(90 * MINUTE));
383         assertEquals("3d 4h 30m", DateUtils.getDurationString((3 * 24 * 60 + 4 * 60 + 30) * MINUTE));
384         assertEquals("4w 1d 4h 30m", DateUtils.getDurationString((4 * 7 * 24 * 60 + 24 * 60 + 4 * 60 + 30) * MINUTE));
385 
386         // change the number of days per week and hours per day
387         assertEquals("17w 2d 4h 30m", DateUtils.getDurationString((4 * 7 * 24 * 60 + 24 * 60 + 4 * 60 + 30) * MINUTE, 8, 5));
388         assertEquals("23w 1d 4h 30m", DateUtils.getDurationString((4 * 7 * 24 * 60 + 24 * 60 + 4 * 60 + 30) * MINUTE, 6, 5));
389         assertEquals("10w 7d 4h 30m", DateUtils.getDurationString((4 * 7 * 24 * 60 + 24 * 60 + 4 * 60 + 30) * MINUTE, 8, 8));
390 
391     }
392 
393     public void testDurationStringWithNegative() throws Exception
394     {
395         assertEquals("-30m", DateUtils.getDurationStringWithNegative(-30 * MINUTE));
396         assertEquals("30m", DateUtils.getDurationStringWithNegative(30 * MINUTE));
397         assertEquals("-1h 30m", DateUtils.getDurationStringWithNegative(-90 * MINUTE));
398     }
399 
400     public void testDurationPretty() throws Exception
401     {
402         // ensure we don't display seconds unless it is the only unit available
403         assertEquals("0 minutes", DateUtils.getDurationPretty(0 * MINUTE, resourceBundle));
404         assertEquals("1 second", DateUtils.getDurationPretty(1, resourceBundle)); // 12 seconds
405         assertEquals("12 seconds", DateUtils.getDurationPretty(12, resourceBundle)); // 12 seconds
406         assertEquals("1 minute", DateUtils.getDurationPretty(1 * MINUTE + 15, resourceBundle));
407         assertEquals("30 minutes", DateUtils.getDurationPretty(30 * MINUTE + 15, resourceBundle));
408         assertEquals("1 hour", DateUtils.getDurationPretty(60 * MINUTE, resourceBundle));
409         assertEquals("2 hours", DateUtils.getDurationPretty(120 * MINUTE, resourceBundle));
410         assertEquals("3 days", DateUtils.getDurationPretty(60 * 24 * 3 * MINUTE, resourceBundle));
411         assertEquals("4 weeks", DateUtils.getDurationPretty(60 * 24 * 7 * 4 * MINUTE, resourceBundle));
412         assertEquals("1 hour, 30 minutes", DateUtils.getDurationPretty(90 * MINUTE, resourceBundle));
413         assertEquals("3 days, 4 hours, 30 minutes", DateUtils.getDurationPretty((3 * 24 * 60 + 4 * 60 + 30) * MINUTE, resourceBundle));
414         assertEquals("4 weeks, 1 day, 4 hours, 30 minutes", DateUtils.getDurationPretty((4 * 7 * 24 * 60 + 24 * 60 + 4 * 60 + 30) * MINUTE, resourceBundle));
415         //previously said "138 weeks, 3 days ago"
416         assertEquals("1 year, 34 weeks, 2 days", DateUtils.getDurationPretty((cal(2007, 4, 26).getTimeInMillis() - cal(2005, 8, 29).getTimeInMillis()) / 1000, resourceBundle));
417         assertEquals("2 years, 34 weeks, 3 days", DateUtils.getDurationPretty((cal(2007, 4, 26).getTimeInMillis() - cal(2004, 8, 29).getTimeInMillis()) / 1000, resourceBundle));
418 
419         // try with a different number of hours per day and days per week
420         assertEquals("1 week", DateUtils.getDurationPretty(60 * 24 * 3 * MINUTE, 24, 3, resourceBundle));
421         assertEquals("1 week, 4 days", DateUtils.getDurationPretty(60 * 24 * 3 * MINUTE, 8, 5, resourceBundle));
422 
423     }
424 
425     public void testDurationPrettySecondsResolution() throws Exception
426     {
427         // work just like DateUtils.getDurationPretty if there are seconds remainder in the duration
428         assertEquals("0 seconds", DateUtils.getDurationPrettySecondsResolution(0 * MINUTE, resourceBundle));
429         assertEquals("1 second", DateUtils.getDurationPrettySecondsResolution(1, resourceBundle)); // 12 seconds
430         assertEquals("12 seconds", DateUtils.getDurationPrettySecondsResolution(12, resourceBundle)); // 12 seconds
431         assertEquals("1 minute", DateUtils.getDurationPrettySecondsResolution(1 * MINUTE, resourceBundle));
432         assertEquals("30 minutes", DateUtils.getDurationPrettySecondsResolution(30 * MINUTE, resourceBundle));
433         assertEquals("1 hour", DateUtils.getDurationPrettySecondsResolution(60 * MINUTE, resourceBundle));
434         assertEquals("2 hours", DateUtils.getDurationPrettySecondsResolution(120 * MINUTE, resourceBundle));
435         assertEquals("3 days", DateUtils.getDurationPrettySecondsResolution(60 * 24 * 3 * MINUTE, resourceBundle));
436         assertEquals("4 weeks", DateUtils.getDurationPrettySecondsResolution(60 * 24 * 7 * 4 * MINUTE, resourceBundle));
437         assertEquals("1 hour, 30 minutes", DateUtils.getDurationPrettySecondsResolution(90 * MINUTE, resourceBundle));
438         assertEquals("3 days, 4 hours, 30 minutes", DateUtils.getDurationPrettySecondsResolution((3 * 24 * 60 + 4 * 60 + 30) * MINUTE, resourceBundle));
439         assertEquals("4 weeks, 1 day, 4 hours, 30 minutes", DateUtils.getDurationPrettySecondsResolution((4 * 7 * 24 * 60 + 24 * 60 + 4 * 60 + 30) * MINUTE, resourceBundle));
440         //previously said "138 weeks, 3 days ago"
441         assertEquals("1 year, 34 weeks, 2 days", DateUtils.getDurationPrettySecondsResolution((cal(2007, 4, 26).getTimeInMillis() - cal(2005, 8, 29).getTimeInMillis()) / 1000, resourceBundle));
442         assertEquals("2 years, 34 weeks, 3 days", DateUtils.getDurationPrettySecondsResolution((cal(2007, 4, 26).getTimeInMillis() - cal(2004, 8, 29).getTimeInMillis()) / 1000, resourceBundle));
443 
444         // now we have seconds in the remainder
445         assertEquals("1 minute, 23 seconds", DateUtils.getDurationPrettySecondsResolution(1 * MINUTE + 23, resourceBundle));
446         assertEquals("30 minutes, 1 second", DateUtils.getDurationPrettySecondsResolution(30 * MINUTE + 1, resourceBundle));
447         assertEquals("1 hour, 23 seconds", DateUtils.getDurationPrettySecondsResolution(60 * MINUTE + 23, resourceBundle));
448         assertEquals("2 hours, 8 seconds", DateUtils.getDurationPrettySecondsResolution(120 * MINUTE + 8, resourceBundle));
449         assertEquals("3 days, 12 seconds", DateUtils.getDurationPrettySecondsResolution(60 * 24 * 3 * MINUTE + 12, resourceBundle));
450         assertEquals("4 weeks, 17 seconds", DateUtils.getDurationPrettySecondsResolution(60 * 24 * 7 * 4 * MINUTE + 17, resourceBundle));
451         assertEquals("1 hour, 30 minutes, 4 seconds", DateUtils.getDurationPrettySecondsResolution(90 * MINUTE + 4, resourceBundle));
452         assertEquals("3 days, 4 hours, 30 minutes, 39 seconds", DateUtils.getDurationPrettySecondsResolution((3 * 24 * 60 + 4 * 60 + 30) * MINUTE + 39, resourceBundle));
453         assertEquals("4 weeks, 1 day, 4 hours, 30 minutes, 1 second", DateUtils.getDurationPrettySecondsResolution((4 * 7 * 24 * 60 + 24 * 60 + 4 * 60 + 30) * MINUTE + 1, resourceBundle));
454 
455         // try with different hours per day and days per week
456         assertEquals("1 week, 12 seconds", DateUtils.getDurationPrettySecondsResolution(60 * 24 * 3 * MINUTE + 12, 24, 3, resourceBundle));
457         assertEquals("1 week, 4 days, 12 seconds", DateUtils.getDurationPrettySecondsResolution(60 * 24 * 3 * MINUTE + 12, 8, 5, resourceBundle));
458     }
459 
460     public void testTomorrowYesterday() throws Exception
461     {
462         final Date today = new Date();
463         final Date tomorrow = DateUtils.tomorrow();
464         final Date yesterday = DateUtils.yesterday();
465         assertTrue(tomorrow.after(today));
466         assertTrue(yesterday.before(today));
467     }
468     public void testDurationPrettySeconds() throws Exception
469     {
470         long secondsPerDay = 60 * 60 * 24;
471         long secondsPerWeek = secondsPerDay * 3;
472         assertEquals("1 week", DateUtils.getDurationPrettySeconds(60 * 24 * 3 * MINUTE, secondsPerDay, secondsPerWeek, resourceBundle));
473 
474         secondsPerDay = 60 * 60 * 8;
475         secondsPerWeek = secondsPerDay * 5;
476         assertEquals("1 week, 4 days", DateUtils.getDurationPrettySeconds(60 * 24 * 3 * MINUTE, secondsPerDay, secondsPerWeek, resourceBundle));
477     }
478 
479     public void testToEndOfPeriod()
480     {
481         final int year = 2005;
482         final int month = Calendar.OCTOBER;
483         final int date = 15;
484         final int hour = 13;
485         final int minute = 22;
486         final int second = 22;
487 
488         // Set the date we're playing with to 2005/10/15 13:22:22
489         Calendar calendar = Calendar.getInstance();
490         calendar.set(Calendar.YEAR, year);
491         calendar.set(Calendar.MONTH, month);
492         calendar.set(Calendar.DATE, date);
493         calendar.set(Calendar.HOUR_OF_DAY, hour);
494         calendar.set(Calendar.MINUTE, minute);
495         calendar.set(Calendar.SECOND, second);
496 
497         // Try getting the maximum of the year. We should end up with 2005/12/31 23:59:59
498         Calendar yearPeriod = DateUtils.toEndOfPeriod((Calendar) calendar.clone(), Calendar.YEAR);
499         assertEquals(year, yearPeriod.get(Calendar.YEAR));
500         assertEquals(Calendar.DECEMBER, yearPeriod.get(Calendar.MONTH));
501         assertEquals(31, yearPeriod.get(Calendar.DATE));
502         assertEquals(23, yearPeriod.get(Calendar.HOUR_OF_DAY));
503         assertEquals(59, yearPeriod.get(Calendar.MINUTE));
504         assertEquals(59, yearPeriod.get(Calendar.SECOND));
505 
506         // Try getting the maximum of the month. We should end up with 2005/10/31 23:59:59
507         Calendar monthPeriod = DateUtils.toEndOfPeriod((Calendar) calendar.clone(), Calendar.MONTH);
508         assertEquals(year, monthPeriod.get(Calendar.YEAR));
509         assertEquals(month, monthPeriod.get(Calendar.MONTH));
510         assertEquals(31, monthPeriod.get(Calendar.DATE));
511         assertEquals(23, monthPeriod.get(Calendar.HOUR_OF_DAY));
512         assertEquals(59, monthPeriod.get(Calendar.MINUTE));
513         assertEquals(59, monthPeriod.get(Calendar.SECOND));
514 
515         // Try getting the maximum of the date. We should end up with 2005/10/15 23:59:59
516         Calendar datePeriod = DateUtils.toEndOfPeriod((Calendar) calendar.clone(), Calendar.DATE);
517         assertEquals(year, datePeriod.get(Calendar.YEAR));
518         assertEquals(month, datePeriod.get(Calendar.MONTH));
519         assertEquals(date, datePeriod.get(Calendar.DATE));
520         assertEquals(23, datePeriod.get(Calendar.HOUR_OF_DAY));
521         assertEquals(59, datePeriod.get(Calendar.MINUTE));
522         assertEquals(59, datePeriod.get(Calendar.SECOND));
523 
524         // Try getting the maximum of the hour. We should end up with 2005/10/15 13:59:59
525         Calendar hourPeriod = DateUtils.toEndOfPeriod((Calendar) calendar.clone(), Calendar.HOUR_OF_DAY);
526         assertEquals(year, hourPeriod.get(Calendar.YEAR));
527         assertEquals(month, hourPeriod.get(Calendar.MONTH));
528         assertEquals(date, hourPeriod.get(Calendar.DATE));
529         assertEquals(hour, hourPeriod.get(Calendar.HOUR_OF_DAY));
530         assertEquals(59, hourPeriod.get(Calendar.MINUTE));
531         assertEquals(59, hourPeriod.get(Calendar.SECOND));
532 
533         // Try getting the maximum of the minute. We should end up with 2005/10/15 13:22:59
534         Calendar minutePeriod = DateUtils.toEndOfPeriod((Calendar) calendar.clone(), Calendar.MINUTE);
535         assertEquals(year, minutePeriod.get(Calendar.YEAR));
536         assertEquals(month, minutePeriod.get(Calendar.MONTH));
537         assertEquals(date, minutePeriod.get(Calendar.DATE));
538         assertEquals(hour, minutePeriod.get(Calendar.HOUR_OF_DAY));
539         assertEquals(minute, minutePeriod.get(Calendar.MINUTE));
540         assertEquals(59, minutePeriod.get(Calendar.SECOND));
541 
542         try
543         {
544             DateUtils.toEndOfPeriod((Calendar)calendar.clone(), -10000);
545             fail();
546         }
547         catch (IllegalArgumentException expected) {}
548 
549     }
550 
551     public void testToStartOfPeriod()
552     {
553         final int year = 2005;
554         final int month = Calendar.OCTOBER;
555         final int date = 15;
556         final int hour = 13;
557         final int minute = 22;
558         final int second = 22;
559 
560         // Set the date we're playing with to 2005/10/15 13:22:22
561         Calendar calendar = Calendar.getInstance();
562         calendar.set(Calendar.YEAR, year);
563         calendar.set(Calendar.MONTH, month);
564         calendar.set(Calendar.DATE, date);
565         calendar.set(Calendar.HOUR_OF_DAY, hour);
566         calendar.set(Calendar.MINUTE, minute);
567         calendar.set(Calendar.SECOND, second);
568 
569         // Try getting the minimum of the year. We should end up with 2005/01/01 00:00:00
570         Calendar yearPeriod = DateUtils.toStartOfPeriod((Calendar) calendar.clone(), Calendar.YEAR);
571         assertEquals(year, yearPeriod.get(Calendar.YEAR));
572         assertEquals(Calendar.JANUARY, yearPeriod.get(Calendar.MONTH));
573         assertEquals(1, yearPeriod.get(Calendar.DATE));
574         assertEquals(0, yearPeriod.get(Calendar.HOUR_OF_DAY));
575         assertEquals(0, yearPeriod.get(Calendar.MINUTE));
576         assertEquals(0, yearPeriod.get(Calendar.SECOND));
577 
578         // Try getting the minimum of the month. We should end up with 2005/10/01 00:00:00
579         Calendar monthPeriod = DateUtils.toStartOfPeriod((Calendar) calendar.clone(), Calendar.MONTH);
580         assertEquals(year, monthPeriod.get(Calendar.YEAR));
581         assertEquals(month, monthPeriod.get(Calendar.MONTH));
582         assertEquals(1, monthPeriod.get(Calendar.DATE));
583         assertEquals(0, monthPeriod.get(Calendar.HOUR_OF_DAY));
584         assertEquals(0, monthPeriod.get(Calendar.MINUTE));
585         assertEquals(0, monthPeriod.get(Calendar.SECOND));
586 
587         // Try getting the minimum of the date. We should end up with 2005/10/15 00:00:00
588         Calendar datePeriod = DateUtils.toStartOfPeriod((Calendar) calendar.clone(), Calendar.DATE);
589         assertEquals(year, datePeriod.get(Calendar.YEAR));
590         assertEquals(month, datePeriod.get(Calendar.MONTH));
591         assertEquals(date, datePeriod.get(Calendar.DATE));
592         assertEquals(0, datePeriod.get(Calendar.HOUR_OF_DAY));
593         assertEquals(0, datePeriod.get(Calendar.MINUTE));
594         assertEquals(0, datePeriod.get(Calendar.SECOND));
595 
596         // Try getting the minimum of the hour. We should end up with 2005/10/15 13:00:00
597         Calendar hourPeriod = DateUtils.toStartOfPeriod((Calendar) calendar.clone(), Calendar.HOUR_OF_DAY);
598         assertEquals(year, hourPeriod.get(Calendar.YEAR));
599         assertEquals(month, hourPeriod.get(Calendar.MONTH));
600         assertEquals(date, hourPeriod.get(Calendar.DATE));
601         assertEquals(hour, hourPeriod.get(Calendar.HOUR_OF_DAY));
602         assertEquals(0, hourPeriod.get(Calendar.MINUTE));
603         assertEquals(0, hourPeriod.get(Calendar.SECOND));
604 
605         // Try getting the minimum of the minute. We should end up with 2005/10/15 13:22:00
606         Calendar minutePeriod = DateUtils.toStartOfPeriod((Calendar) calendar.clone(), Calendar.MINUTE);
607         assertEquals(year, minutePeriod.get(Calendar.YEAR));
608         assertEquals(month, minutePeriod.get(Calendar.MONTH));
609         assertEquals(date, minutePeriod.get(Calendar.DATE));
610         assertEquals(hour, minutePeriod.get(Calendar.HOUR_OF_DAY));
611         assertEquals(minute, minutePeriod.get(Calendar.MINUTE));
612         assertEquals(0, minutePeriod.get(Calendar.SECOND));
613         
614         try
615         {
616             DateUtils.toStartOfPeriod((Calendar)calendar.clone(), -10000);
617             fail();
618         }
619         catch (IllegalArgumentException expected) {}
620     }
621 
622     public void testGet24HourTime()
623     {
624         assertEquals(0, DateUtils.get24HourTime("AM", 12));
625         assertEquals(0, DateUtils.get24HourTime("am", 12));
626         assertEquals(12, DateUtils.get24HourTime("PM", 12));
627         assertEquals(12, DateUtils.get24HourTime("pm", 12));
628         assertEquals(11, DateUtils.get24HourTime("AM", 11));
629         assertEquals(1, DateUtils.get24HourTime("AM", 1));
630         assertEquals(17, DateUtils.get24HourTime("PM", 5));
631         assertEquals(23, DateUtils.get24HourTime("PM", 11));
632         assertEquals(23, DateUtils.get24HourTime("pm", 11));
633 
634         // passing in something other than "am" or "pm" is technically allowed...you get back whatever you send in.
635         assertEquals(12, DateUtils.get24HourTime("foo", 12));
636     }
637 
638     public void testDateCalendarGetters() throws Exception
639     {
640         final Calendar calendar = DateUtils.getCalendarDay(2003, 5, 21);
641         final Date date = DateUtils.getDateDay(2003, 5, 21);
642 
643         assertEquals(2003, calendar.get(Calendar.YEAR));
644         assertEquals(5, calendar.get(Calendar.MONTH));
645         assertEquals(21, calendar.get(Calendar.DAY_OF_MONTH));
646         assertEquals(date, calendar.getTime());
647     }
648 }