1
2
3
4
5
6
7
8
9 package com.atlassian.core.util;
10
11 import com.atlassian.core.util.DateUtils;
12 import com.atlassian.core.util.InvalidDurationException;
13 import junit.framework.Test;
14 import junit.framework.TestCase;
15 import junit.framework.TestSuite;
16
17 import java.sql.Timestamp;
18 import java.util.Calendar;
19 import java.util.Locale;
20 import java.util.ResourceBundle;
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 testDateDifference1()
82 {
83 _testDateDifference(cal(2000, 1, 1), cal(2000, 2, 1), 0, "0 months");
84 _testDateDifference(cal(2000, 1, 1), cal(2000, 2, 1), 2, "29 days");
85 _testDateDifference(cal(2000, 1, 1), cal(2000, 2, 15), 1, "1 month, 12 days");
86 _testDateDifference(cal(2000, 1, 1), cal(2000, 2, 15), 2, "1 month, 12 days");
87 _testDateDifference(cal(2000, 1, 1), cal(2000, 1, 1), 1, "0 days");
88 _testDateDifference(cal(2000, 1, 1), cal(2000, 1, 1), 2, "0 hours");
89 _testDateDifference(cal(2000, 1, 1), cal(2000, 12, 1), 1, "10 months, 25 days");
90 _testDateDifference(cal(2000, 1, 1), cal(2000, 1, 2), 2, "1 day");
91 _testDateDifference(cal(2000, 12, 1), cal(2001, 1, 1), 2, "1 month");
92
93
94
95
96 _testDateDifference(3 * DAY_MS + 5 * HOUR_MS + 4 * MINUTE_MS + 30 * SECOND_MS, 4, "3 days, 5 hours, 4 minutes, 30 seconds");
97 _testDateDifference(3 * DAY_MS + 5 * HOUR_MS + 4 * MINUTE_MS + 30 * SECOND_MS, 3, "3 days, 5 hours, 4 minutes");
98 _testDateDifference(3 * DAY_MS + 5 * HOUR_MS + 4 * MINUTE_MS + 30 * SECOND_MS, 2, "3 days, 5 hours");
99 _testDateDifference(3 * DAY_MS + 5 * HOUR_MS + 4 * MINUTE_MS + 30 * SECOND_MS, 1, "3 days");
100 _testDateDifference(3 * DAY_MS + 5 * HOUR_MS + 4 * MINUTE_MS + 30 * SECOND_MS, 0, "0 months");
101 }
102
103 private static Calendar cal(int year1, int month1, int day1)
104 {
105 Calendar cal = Calendar.getInstance();
106 cal.set(year1, month1, day1, 0, 0, 0);
107 cal.set(Calendar.MILLISECOND, 0);
108 return cal;
109 }
110
111 private void _testDateDifference(long diff, int resolution, String expected)
112 {
113 long now = System.currentTimeMillis();
114 assertEquals(expected, DateUtils.dateDifference(now - diff, now, resolution, resourceBundle));
115 }
116
117 private void _testDateDifference(Calendar cal1, Calendar cal2, int resolution, String expected)
118 {
119 assertEquals(expected, DateUtils.dateDifference(cal1.getTime().getTime(), cal2.getTime().getTime(), resolution, resourceBundle));
120 }
121
122 public void testGetDuration() throws Exception
123 {
124 assertEquals(0 * MINUTE, DateUtils.getDuration(""));
125 assertEquals(0 * MINUTE, DateUtils.getDuration(" "));
126 assertEquals(0 * MINUTE, DateUtils.getDuration(null));
127 assertEquals(60 * MINUTE, DateUtils.getDuration("60"));
128 assertEquals(60 * MINUTE, DateUtils.getDuration("60m"));
129 assertEquals(60 * MINUTE, DateUtils.getDuration("1h"));
130 assertEquals(120 * MINUTE, DateUtils.getDuration("2h"));
131 assertEquals(60 * 24 * 3 * MINUTE, DateUtils.getDuration("3d"));
132 assertEquals(60 * 24 * 7 * 4 * MINUTE, DateUtils.getDuration("4w"));
133 assertEquals(60 * 24 * 7 * 4 * MINUTE, DateUtils.getDuration("4weeks"));
134 assertEquals(90 * MINUTE, DateUtils.getDuration("1h 30"));
135 assertEquals((3 * 24 * 60 + 4 * 60 + 30) * MINUTE, DateUtils.getDuration("3d 4h 30m"));
136 assertEquals((3 * 24 * 60 + 4 * 60 + 30) * MINUTE, DateUtils.getDuration("3d, 4h, 30m"));
137 assertEquals((3 * 24 * 60 + 4 * 60 + 30) * MINUTE, DateUtils.getDuration("3days, 4hours, 30minutes"));
138 assertEquals((4 * 7 * 24 * 60 + 3 * 24 * 60 + 4 * 60 + 30) * MINUTE, DateUtils.getDuration("4w 3d 4h 30m"));
139
140 try
141 {
142 DateUtils.getDuration("foo");
143 assertTrue("Should throw exception", false);
144 }
145 catch (InvalidDurationException e)
146 {
147 }
148
149 try
150 {
151 DateUtils.getDuration("60s");
152 assertTrue("Should throw exception", false);
153 }
154 catch (InvalidDurationException e)
155 {
156 }
157 }
158
159 public void testGetDuration2() throws InvalidDurationException
160 {
161 int hoursInDay = 8;
162 int daysInWeek = 5;
163 assertEquals(90 * MINUTE, DateUtils.getDuration("1h 30", hoursInDay, daysInWeek));
164 assertEquals((3 * hoursInDay * 60 + 4 * 60 + 30) * MINUTE, DateUtils.getDuration("3d 4h 30m", hoursInDay, daysInWeek));
165 assertEquals((4 * daysInWeek * hoursInDay * 60 + 3 * hoursInDay * 60 + 4 * 60 + 30) * MINUTE, DateUtils.getDuration("4w 3d 4h 30m", hoursInDay, daysInWeek));
166 }
167
168 public void testGetDurationWithNegative() throws InvalidDurationException
169 {
170 assertEquals(90 * MINUTE, DateUtils.getDurationWithNegative("1h 30"));
171 assertEquals(-90 * MINUTE, DateUtils.getDurationWithNegative("-1h 30"));
172 assertEquals(-7 * HOUR, DateUtils.getDurationWithNegative("- 7h"));
173 try
174 {
175 DateUtils.getDurationWithNegative("-7h -6m");
176 fail("Should have thrown exception");
177 }
178 catch (InvalidDurationException e)
179 {
180 }
181 }
182
183 public void testDurationString() throws Exception
184 {
185 assertEquals("0m", DateUtils.getDurationString(0 * MINUTE));
186 assertEquals("30m", DateUtils.getDurationString(30 * MINUTE));
187 assertEquals("1h", DateUtils.getDurationString(60 * MINUTE));
188 assertEquals("2h", DateUtils.getDurationString(120 * MINUTE));
189 assertEquals("3d", DateUtils.getDurationString(60 * 24 * 3 * MINUTE));
190 assertEquals("4w", DateUtils.getDurationString(4 * 7 * 24 * 60 * MINUTE));
191 assertEquals("1h 30m", DateUtils.getDurationString(90 * MINUTE));
192 assertEquals("3d 4h 30m", DateUtils.getDurationString((3 * 24 * 60 + 4 * 60 + 30) * MINUTE));
193 assertEquals("4w 1d 4h 30m", DateUtils.getDurationString((4 * 7 * 24 * 60 + 24 * 60 + 4 * 60 + 30) * MINUTE));
194 }
195
196 public void testDurationStringWithNegative() throws Exception
197 {
198 assertEquals("-30m", DateUtils.getDurationStringWithNegative(-30 * MINUTE));
199 assertEquals("30m", DateUtils.getDurationStringWithNegative(30 * MINUTE));
200 assertEquals("-1h 30m", DateUtils.getDurationStringWithNegative(-90 * MINUTE));
201 }
202
203 public void testDurationPretty() throws Exception
204 {
205 assertEquals("0 minutes", DateUtils.getDurationPretty(0 * MINUTE, resourceBundle));
206 assertEquals("1 second", DateUtils.getDurationPretty(1, resourceBundle));
207 assertEquals("12 seconds", DateUtils.getDurationPretty(12, resourceBundle));
208 assertEquals("1 minute", DateUtils.getDurationPretty(1 * MINUTE, resourceBundle));
209 assertEquals("30 minutes", DateUtils.getDurationPretty(30 * MINUTE, resourceBundle));
210 assertEquals("1 hour", DateUtils.getDurationPretty(60 * MINUTE, resourceBundle));
211 assertEquals("2 hours", DateUtils.getDurationPretty(120 * MINUTE, resourceBundle));
212 assertEquals("3 days", DateUtils.getDurationPretty(60 * 24 * 3 * MINUTE, resourceBundle));
213 assertEquals("4 weeks", DateUtils.getDurationPretty(60 * 24 * 7 * 4 * MINUTE, resourceBundle));
214 assertEquals("1 hour, 30 minutes", DateUtils.getDurationPretty(90 * MINUTE, resourceBundle));
215 assertEquals("3 days, 4 hours, 30 minutes", DateUtils.getDurationPretty((3 * 24 * 60 + 4 * 60 + 30) * MINUTE, resourceBundle));
216 assertEquals("4 weeks, 1 day, 4 hours, 30 minutes", DateUtils.getDurationPretty((4 * 7 * 24 * 60 + 24 * 60 + 4 * 60 + 30) * MINUTE, resourceBundle));
217
218 assertEquals("1 year, 34 weeks, 1 day", DateUtils.getDurationPretty((cal(2007, 4, 26).getTimeInMillis() - cal(2005, 8, 29).getTimeInMillis()) / 1000, resourceBundle));
219 assertEquals("2 years, 34 weeks, 1 day", DateUtils.getDurationPretty((cal(2007, 4, 26).getTimeInMillis() - cal(2004, 8, 29).getTimeInMillis()) / 1000, resourceBundle));
220 }
221
222 public void testDurationPrettySecondsResolution() throws Exception
223 {
224
225 assertEquals("0 seconds", DateUtils.getDurationPrettySecondsResolution(0 * MINUTE, resourceBundle));
226 assertEquals("1 second", DateUtils.getDurationPrettySecondsResolution(1, resourceBundle));
227 assertEquals("12 seconds", DateUtils.getDurationPrettySecondsResolution(12, resourceBundle));
228 assertEquals("1 minute", DateUtils.getDurationPrettySecondsResolution(1 * MINUTE, resourceBundle));
229 assertEquals("30 minutes", DateUtils.getDurationPrettySecondsResolution(30 * MINUTE, resourceBundle));
230 assertEquals("1 hour", DateUtils.getDurationPrettySecondsResolution(60 * MINUTE, resourceBundle));
231 assertEquals("2 hours", DateUtils.getDurationPrettySecondsResolution(120 * MINUTE, resourceBundle));
232 assertEquals("3 days", DateUtils.getDurationPrettySecondsResolution(60 * 24 * 3 * MINUTE, resourceBundle));
233 assertEquals("4 weeks", DateUtils.getDurationPrettySecondsResolution(60 * 24 * 7 * 4 * MINUTE, resourceBundle));
234 assertEquals("1 hour, 30 minutes", DateUtils.getDurationPrettySecondsResolution(90 * MINUTE, resourceBundle));
235 assertEquals("3 days, 4 hours, 30 minutes", DateUtils.getDurationPrettySecondsResolution((3 * 24 * 60 + 4 * 60 + 30) * MINUTE, resourceBundle));
236 assertEquals("4 weeks, 1 day, 4 hours, 30 minutes", DateUtils.getDurationPrettySecondsResolution((4 * 7 * 24 * 60 + 24 * 60 + 4 * 60 + 30) * MINUTE, resourceBundle));
237
238 assertEquals("1 year, 34 weeks, 1 day", DateUtils.getDurationPrettySecondsResolution((cal(2007, 4, 26).getTimeInMillis() - cal(2005, 8, 29).getTimeInMillis()) / 1000, resourceBundle));
239 assertEquals("2 years, 34 weeks, 1 day", DateUtils.getDurationPrettySecondsResolution((cal(2007, 4, 26).getTimeInMillis() - cal(2004, 8, 29).getTimeInMillis()) / 1000, resourceBundle));
240
241
242 assertEquals("1 minute, 23 seconds", DateUtils.getDurationPrettySecondsResolution(1 * MINUTE + 23, resourceBundle));
243 assertEquals("30 minutes, 1 second", DateUtils.getDurationPrettySecondsResolution(30 * MINUTE + 1, resourceBundle));
244 assertEquals("1 hour, 23 seconds", DateUtils.getDurationPrettySecondsResolution(60 * MINUTE + 23, resourceBundle));
245 assertEquals("2 hours, 8 seconds", DateUtils.getDurationPrettySecondsResolution(120 * MINUTE + 8, resourceBundle));
246 assertEquals("3 days, 12 seconds", DateUtils.getDurationPrettySecondsResolution(60 * 24 * 3 * MINUTE + 12, resourceBundle));
247 assertEquals("4 weeks, 17 seconds", DateUtils.getDurationPrettySecondsResolution(60 * 24 * 7 * 4 * MINUTE + 17, resourceBundle));
248 assertEquals("1 hour, 30 minutes, 4 seconds", DateUtils.getDurationPrettySecondsResolution(90 * MINUTE + 4, resourceBundle));
249 assertEquals("3 days, 4 hours, 30 minutes, 39 seconds", DateUtils.getDurationPrettySecondsResolution((3 * 24 * 60 + 4 * 60 + 30) * MINUTE + 39, resourceBundle));
250 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));
251
252 }
253
254 public void testToEndOfPeriod()
255 {
256 final int year = 2005;
257 final int month = Calendar.OCTOBER;
258 final int date = 15;
259 final int hour = 13;
260 final int minute = 22;
261 final int second = 22;
262
263
264 Calendar calendar = Calendar.getInstance();
265 calendar.set(Calendar.YEAR, year);
266 calendar.set(Calendar.MONTH, month);
267 calendar.set(Calendar.DATE, date);
268 calendar.set(Calendar.HOUR_OF_DAY, hour);
269 calendar.set(Calendar.MINUTE, minute);
270 calendar.set(Calendar.SECOND, second);
271
272
273 Calendar yearPeriod = DateUtils.toEndOfPeriod((Calendar) calendar.clone(), Calendar.YEAR);
274 assertEquals(year, yearPeriod.get(Calendar.YEAR));
275 assertEquals(Calendar.DECEMBER, yearPeriod.get(Calendar.MONTH));
276 assertEquals(31, yearPeriod.get(Calendar.DATE));
277 assertEquals(23, yearPeriod.get(Calendar.HOUR_OF_DAY));
278 assertEquals(59, yearPeriod.get(Calendar.MINUTE));
279 assertEquals(59, yearPeriod.get(Calendar.SECOND));
280
281
282 Calendar monthPeriod = DateUtils.toEndOfPeriod((Calendar) calendar.clone(), Calendar.MONTH);
283 assertEquals(year, monthPeriod.get(Calendar.YEAR));
284 assertEquals(month, monthPeriod.get(Calendar.MONTH));
285 assertEquals(31, monthPeriod.get(Calendar.DATE));
286 assertEquals(23, monthPeriod.get(Calendar.HOUR_OF_DAY));
287 assertEquals(59, monthPeriod.get(Calendar.MINUTE));
288 assertEquals(59, monthPeriod.get(Calendar.SECOND));
289
290
291 Calendar datePeriod = DateUtils.toEndOfPeriod((Calendar) calendar.clone(), Calendar.DATE);
292 assertEquals(year, datePeriod.get(Calendar.YEAR));
293 assertEquals(month, datePeriod.get(Calendar.MONTH));
294 assertEquals(date, datePeriod.get(Calendar.DATE));
295 assertEquals(23, datePeriod.get(Calendar.HOUR_OF_DAY));
296 assertEquals(59, datePeriod.get(Calendar.MINUTE));
297 assertEquals(59, datePeriod.get(Calendar.SECOND));
298
299
300 Calendar hourPeriod = DateUtils.toEndOfPeriod((Calendar) calendar.clone(), Calendar.HOUR_OF_DAY);
301 assertEquals(year, hourPeriod.get(Calendar.YEAR));
302 assertEquals(month, hourPeriod.get(Calendar.MONTH));
303 assertEquals(date, hourPeriod.get(Calendar.DATE));
304 assertEquals(hour, hourPeriod.get(Calendar.HOUR_OF_DAY));
305 assertEquals(59, hourPeriod.get(Calendar.MINUTE));
306 assertEquals(59, hourPeriod.get(Calendar.SECOND));
307
308
309 Calendar minutePeriod = DateUtils.toEndOfPeriod((Calendar) calendar.clone(), Calendar.MINUTE);
310 assertEquals(year, minutePeriod.get(Calendar.YEAR));
311 assertEquals(month, minutePeriod.get(Calendar.MONTH));
312 assertEquals(date, minutePeriod.get(Calendar.DATE));
313 assertEquals(hour, minutePeriod.get(Calendar.HOUR_OF_DAY));
314 assertEquals(minute, minutePeriod.get(Calendar.MINUTE));
315 assertEquals(59, minutePeriod.get(Calendar.SECOND));
316 }
317
318 public void testToStartOfPeriod()
319 {
320 final int year = 2005;
321 final int month = Calendar.OCTOBER;
322 final int date = 15;
323 final int hour = 13;
324 final int minute = 22;
325 final int second = 22;
326
327
328 Calendar calendar = Calendar.getInstance();
329 calendar.set(Calendar.YEAR, year);
330 calendar.set(Calendar.MONTH, month);
331 calendar.set(Calendar.DATE, date);
332 calendar.set(Calendar.HOUR_OF_DAY, hour);
333 calendar.set(Calendar.MINUTE, minute);
334 calendar.set(Calendar.SECOND, second);
335
336
337 Calendar yearPeriod = DateUtils.toStartOfPeriod((Calendar) calendar.clone(), Calendar.YEAR);
338 assertEquals(year, yearPeriod.get(Calendar.YEAR));
339 assertEquals(Calendar.JANUARY, yearPeriod.get(Calendar.MONTH));
340 assertEquals(1, yearPeriod.get(Calendar.DATE));
341 assertEquals(0, yearPeriod.get(Calendar.HOUR_OF_DAY));
342 assertEquals(0, yearPeriod.get(Calendar.MINUTE));
343 assertEquals(0, yearPeriod.get(Calendar.SECOND));
344
345
346 Calendar monthPeriod = DateUtils.toStartOfPeriod((Calendar) calendar.clone(), Calendar.MONTH);
347 assertEquals(year, monthPeriod.get(Calendar.YEAR));
348 assertEquals(month, monthPeriod.get(Calendar.MONTH));
349 assertEquals(1, monthPeriod.get(Calendar.DATE));
350 assertEquals(0, monthPeriod.get(Calendar.HOUR_OF_DAY));
351 assertEquals(0, monthPeriod.get(Calendar.MINUTE));
352 assertEquals(0, monthPeriod.get(Calendar.SECOND));
353
354
355 Calendar datePeriod = DateUtils.toStartOfPeriod((Calendar) calendar.clone(), Calendar.DATE);
356 assertEquals(year, datePeriod.get(Calendar.YEAR));
357 assertEquals(month, datePeriod.get(Calendar.MONTH));
358 assertEquals(date, datePeriod.get(Calendar.DATE));
359 assertEquals(0, datePeriod.get(Calendar.HOUR_OF_DAY));
360 assertEquals(0, datePeriod.get(Calendar.MINUTE));
361 assertEquals(0, datePeriod.get(Calendar.SECOND));
362
363
364 Calendar hourPeriod = DateUtils.toStartOfPeriod((Calendar) calendar.clone(), Calendar.HOUR_OF_DAY);
365 assertEquals(year, hourPeriod.get(Calendar.YEAR));
366 assertEquals(month, hourPeriod.get(Calendar.MONTH));
367 assertEquals(date, hourPeriod.get(Calendar.DATE));
368 assertEquals(hour, hourPeriod.get(Calendar.HOUR_OF_DAY));
369 assertEquals(0, hourPeriod.get(Calendar.MINUTE));
370 assertEquals(0, hourPeriod.get(Calendar.SECOND));
371
372
373 Calendar minutePeriod = DateUtils.toStartOfPeriod((Calendar) calendar.clone(), Calendar.MINUTE);
374 assertEquals(year, minutePeriod.get(Calendar.YEAR));
375 assertEquals(month, minutePeriod.get(Calendar.MONTH));
376 assertEquals(date, minutePeriod.get(Calendar.DATE));
377 assertEquals(hour, minutePeriod.get(Calendar.HOUR_OF_DAY));
378 assertEquals(minute, minutePeriod.get(Calendar.MINUTE));
379 assertEquals(0, minutePeriod.get(Calendar.SECOND));
380 }
381
382
383 public TestDateUtils(String s)
384 {
385 super(s);
386 }
387
388 public static Test suite()
389 {
390 return new TestSuite(TestDateUtils.class);
391 }
392 }