1   package ch.qos.logback.core.util;
2   
3   import static org.junit.Assert.assertEquals;
4   
5   import java.util.Calendar;
6   import java.util.Date;
7   import java.util.TimeZone;
8   
9   import org.junit.Test;
10  
11  public class TimeUtilTest  {
12  
13    @Test
14    public void testSecond() {
15      // Mon Nov 20 18:05:17,522 CET 2006
16      long now = 1164042317522L;
17      // Mon Nov 20 18:05:18,000 CET 2006
18      long expected = 1164042318000L;
19      long computed = TimeUtil.computeStartOfNextSecond(now);
20      assertEquals(expected - now, 478);
21      assertEquals(expected, computed);
22    }
23    
24    @Test
25    public void testMinute() {
26      // Mon Nov 20 18:05:17,522 CET 2006
27      long now = 1164042317522L;
28      // Mon Nov 20 18:06:00 CET 2006
29      long expected = 1164042360000L;
30  
31      long computed = TimeUtil.computeStartOfNextMinute(now);
32      assertEquals(expected - now, 1000 * 42 + 478);
33      assertEquals(expected, computed);
34    }
35    
36    @Test
37    public void testHour() {
38      // Mon Nov 20 18:05:17,522 GMT 2006
39      long now = 1164045917522L;
40      now = correctBasedOnTimeZone(now);
41      // Mon Nov 20 19:00:00 GMT 2006
42      long expected = 1164049200000L;
43      expected = correctBasedOnTimeZone(expected);
44      
45      long computed = TimeUtil.computeStartOfNextHour(now);
46      assertEquals(expected - now, 1000 * (42 + 60 * 54) + 478);
47      assertEquals(expected, computed);
48    }
49    
50    @Test
51    public void testDay() {
52      // Mon Nov 20 18:05:17 GMT 2006
53      long now = 1164045917522L;
54      now = correctBasedOnTimeZone(now);
55      // Tue Nov 21 00:00:00 GMT 2006
56      long expected = 1164067200000L;
57      expected = correctBasedOnTimeZone(expected);
58      long computed = TimeUtil.computeStartOfNextDay(now);
59      
60      assertEquals(expected - now, 1000 * (3600 * 5 + 60 * 54 + 42) + 478);
61      assertEquals(expected, computed);
62    }
63    
64    @Test
65    public void testWeek() {
66      // Mon Nov 20 18:05:17 GMT 2006
67      long now = 1164045917522L;
68      now = correctBasedOnTimeZone(now);
69      // Sun Nov 26 00:00:00 GMT 2006
70      long expected = 1164499200000L;
71      expected = correctBasedOnTimeZone(expected);
72  
73      Calendar cal = Calendar.getInstance();
74      cal.setTime(new Date(now));
75  
76      int dayOffset = cal.getFirstDayOfWeek() - Calendar.SUNDAY;
77      if (dayOffset != 0) {
78        expected += 24L * 3600 * 1000 * (cal.getFirstDayOfWeek() - Calendar.SUNDAY);
79      }
80  
81      long computed = TimeUtil.computeStartOfNextWeek(now);
82      // System.out.println("now "+new Date(now));
83      // System.out.println("computed "+new Date(computed));
84      // System.out.println("expected "+new Date(expected));
85      assertEquals(expected - now,
86          1000 * (3600 * (5 + 24 * (5 + dayOffset)) + 60 * 54 + 42) + 478);
87      assertEquals(expected, computed);
88    }
89    
90    @Test
91    public void testMonth() {
92      // Mon Nov 20 18:05:17 GMT 2006
93      long now = 1164045917522L;
94      now = correctBasedOnTimeZone(now);
95      // Fri Dec 01 00:00:00 GMT 2006
96      long expected = 1164931200000L;
97      expected = correctBasedOnTimeZone(expected);
98      
99      long computed = TimeUtil.computeStartOfNextMonth(now);
100     assertEquals(expected - now,
101         1000 * (3600 * (5 + 24 * 10) + 60 * 54 + 42) + 478);
102     assertEquals(expected, computed);
103   }
104   
105   private long correctBasedOnTimeZone(long gmtLong) {
106     int offset = TimeZone.getDefault().getRawOffset();
107     return gmtLong - offset;
108   }
109 
110 }