1/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.calendar;
18
19import android.test.AndroidTestCase;
20import android.test.suitebuilder.annotation.SmallTest;
21import android.test.suitebuilder.annotation.Smoke;
22import android.text.format.DateUtils;
23import android.text.format.Time;
24import android.util.Log;
25
26
27/**
28 * Unit tests for {@link android.text.format.Time#getWeekNumber}.
29 */
30public class WeekNumberTest extends AndroidTestCase {
31
32    static private class DateAndWeekNumber {
33        public Time date;
34        public Time allDayDate;
35        public int expectedWeekNumber;
36
37        public DateAndWeekNumber(int year, int month, int day, int expectedWeekNumber) {
38            date = new Time();
39            allDayDate = new Time(Time.TIMEZONE_UTC);
40
41            date.set(0, 0, 0, day, month, year);
42            date.normalize(true /* ignore isDst */);
43
44            allDayDate.set(day, month, year);
45            allDayDate.normalize(true /* ignore isDst */);
46
47            this.expectedWeekNumber = expectedWeekNumber;
48        }
49    }
50
51    DateAndWeekNumber[] tests = {
52            new DateAndWeekNumber(1998, 11, 28, 53),
53            new DateAndWeekNumber(1998, 11, 29, 53),
54            new DateAndWeekNumber(1998, 11, 30, 53),
55            new DateAndWeekNumber(1998, 11, 31, 53),
56            new DateAndWeekNumber(1999, 0, 1, 53),
57            new DateAndWeekNumber(1999, 0, 2, 53),
58            new DateAndWeekNumber(1999, 0, 3, 53),
59            new DateAndWeekNumber(1999, 0, 4, 1),
60            new DateAndWeekNumber(1999, 0, 10, 1),
61            new DateAndWeekNumber(1999, 0, 20, 3),
62            new DateAndWeekNumber(1999, 0, 30, 4),
63
64            new DateAndWeekNumber(1999, 11, 28, 52),
65            new DateAndWeekNumber(1999, 11, 29, 52),
66            new DateAndWeekNumber(1999, 11, 30, 52),
67            new DateAndWeekNumber(1999, 11, 31, 52),
68            new DateAndWeekNumber(2000, 0, 1, 52),
69            new DateAndWeekNumber(2000, 0, 2, 52),
70            new DateAndWeekNumber(2000, 0, 3, 1),
71            new DateAndWeekNumber(2000, 0, 4, 1),
72            new DateAndWeekNumber(2000, 0, 10, 2),
73            new DateAndWeekNumber(2000, 0, 20, 3),
74            new DateAndWeekNumber(2000, 0, 30, 4),
75
76            new DateAndWeekNumber(2000, 11, 28, 52),
77            new DateAndWeekNumber(2000, 11, 29, 52),
78            new DateAndWeekNumber(2000, 11, 30, 52),
79            new DateAndWeekNumber(2000, 11, 31, 52),
80            new DateAndWeekNumber(2001, 0, 1, 1),
81            new DateAndWeekNumber(2001, 0, 2, 1),
82            new DateAndWeekNumber(2001, 0, 3, 1),
83            new DateAndWeekNumber(2001, 0, 4, 1),
84            new DateAndWeekNumber(2001, 0, 10, 2),
85            new DateAndWeekNumber(2001, 0, 20, 3),
86            new DateAndWeekNumber(2001, 0, 30, 5),
87
88            new DateAndWeekNumber(2001, 11, 28, 52),
89            new DateAndWeekNumber(2001, 11, 29, 52),
90            new DateAndWeekNumber(2001, 11, 30, 52),
91            new DateAndWeekNumber(2001, 11, 31, 1),
92            new DateAndWeekNumber(2002, 0, 1, 1),
93            new DateAndWeekNumber(2002, 0, 2, 1),
94            new DateAndWeekNumber(2002, 0, 3, 1),
95            new DateAndWeekNumber(2002, 0, 4, 1),
96            new DateAndWeekNumber(2002, 0, 10, 2),
97            new DateAndWeekNumber(2002, 0, 20, 3),
98            new DateAndWeekNumber(2002, 0, 30, 5),
99
100            new DateAndWeekNumber(2002, 11, 28, 52),
101            new DateAndWeekNumber(2002, 11, 29, 52),
102            new DateAndWeekNumber(2002, 11, 30, 1),
103            new DateAndWeekNumber(2002, 11, 31, 1),
104            new DateAndWeekNumber(2003, 0, 1, 1),
105            new DateAndWeekNumber(2003, 0, 2, 1),
106            new DateAndWeekNumber(2003, 0, 3, 1),
107            new DateAndWeekNumber(2003, 0, 4, 1),
108            new DateAndWeekNumber(2003, 0, 10, 2),
109            new DateAndWeekNumber(2003, 0, 20, 4),
110            new DateAndWeekNumber(2003, 0, 30, 5),
111
112            new DateAndWeekNumber(2003, 11, 28, 52),
113            new DateAndWeekNumber(2003, 11, 29, 1),
114            new DateAndWeekNumber(2003, 11, 30, 1),
115            new DateAndWeekNumber(2003, 11, 31, 1),
116            new DateAndWeekNumber(2004, 0, 1, 1),
117            new DateAndWeekNumber(2004, 0, 2, 1),
118            new DateAndWeekNumber(2004, 0, 3, 1),
119            new DateAndWeekNumber(2004, 0, 4, 1),
120            new DateAndWeekNumber(2004, 0, 10, 2),
121            new DateAndWeekNumber(2004, 0, 20, 4),
122            new DateAndWeekNumber(2004, 0, 30, 5),
123
124            new DateAndWeekNumber(2004, 0, 1, 1),
125            new DateAndWeekNumber(2004, 1, 1, 5),
126            new DateAndWeekNumber(2004, 2, 1, 10),
127            new DateAndWeekNumber(2004, 3, 1, 14),
128            new DateAndWeekNumber(2004, 4, 1, 18),
129            new DateAndWeekNumber(2004, 5, 1, 23),
130            new DateAndWeekNumber(2004, 6, 1, 27),
131            new DateAndWeekNumber(2004, 7, 1, 31),
132            new DateAndWeekNumber(2004, 8, 1, 36),
133            new DateAndWeekNumber(2004, 9, 1, 40),
134            new DateAndWeekNumber(2004, 10, 1, 45),
135            new DateAndWeekNumber(2004, 11, 1, 49),
136
137            new DateAndWeekNumber(2004, 11, 28, 53),
138            new DateAndWeekNumber(2004, 11, 29, 53),
139            new DateAndWeekNumber(2004, 11, 30, 53),
140            new DateAndWeekNumber(2004, 11, 31, 53),
141            new DateAndWeekNumber(2005, 0, 1, 53),
142            new DateAndWeekNumber(2005, 0, 2, 53),
143            new DateAndWeekNumber(2005, 0, 3, 1),
144            new DateAndWeekNumber(2005, 0, 4, 1),
145            new DateAndWeekNumber(2005, 0, 10, 2),
146            new DateAndWeekNumber(2005, 0, 20, 3),
147            new DateAndWeekNumber(2005, 0, 30, 4),
148
149            new DateAndWeekNumber(2005, 11, 28, 52),
150            new DateAndWeekNumber(2005, 11, 29, 52),
151            new DateAndWeekNumber(2005, 11, 30, 52),
152            new DateAndWeekNumber(2005, 11, 31, 52),
153            new DateAndWeekNumber(2006, 0, 1, 52),
154            new DateAndWeekNumber(2006, 0, 2, 1),
155            new DateAndWeekNumber(2006, 0, 3, 1),
156            new DateAndWeekNumber(2006, 0, 4, 1),
157            new DateAndWeekNumber(2006, 0, 10, 2),
158            new DateAndWeekNumber(2006, 0, 20, 3),
159            new DateAndWeekNumber(2006, 0, 30, 5),
160
161            new DateAndWeekNumber(2006, 11, 28, 52),
162            new DateAndWeekNumber(2006, 11, 29, 52),
163            new DateAndWeekNumber(2006, 11, 30, 52),
164            new DateAndWeekNumber(2006, 11, 31, 52),
165            new DateAndWeekNumber(2007, 0, 1, 1),
166            new DateAndWeekNumber(2007, 0, 2, 1),
167            new DateAndWeekNumber(2007, 0, 3, 1),
168            new DateAndWeekNumber(2007, 0, 4, 1),
169            new DateAndWeekNumber(2007, 0, 10, 2),
170            new DateAndWeekNumber(2007, 0, 20, 3),
171            new DateAndWeekNumber(2007, 0, 30, 5),
172
173            new DateAndWeekNumber(2007, 11, 28, 52),
174            new DateAndWeekNumber(2007, 11, 29, 52),
175            new DateAndWeekNumber(2007, 11, 30, 52),
176            new DateAndWeekNumber(2007, 11, 31, 1),
177            new DateAndWeekNumber(2008, 0, 1, 1),
178            new DateAndWeekNumber(2008, 0, 2, 1),
179            new DateAndWeekNumber(2008, 0, 3, 1),
180            new DateAndWeekNumber(2008, 0, 4, 1),
181            new DateAndWeekNumber(2008, 0, 10, 2),
182            new DateAndWeekNumber(2008, 0, 20, 3),
183            new DateAndWeekNumber(2008, 0, 30, 5),
184
185            new DateAndWeekNumber(2008, 11, 28, 52),
186            new DateAndWeekNumber(2008, 11, 29, 1),
187            new DateAndWeekNumber(2008, 11, 30, 1),
188            new DateAndWeekNumber(2008, 11, 31, 1),
189            new DateAndWeekNumber(2009, 0, 1, 1),
190            new DateAndWeekNumber(2009, 0, 2, 1),
191            new DateAndWeekNumber(2009, 0, 3, 1),
192            new DateAndWeekNumber(2009, 0, 4, 1),
193            new DateAndWeekNumber(2009, 0, 10, 2),
194            new DateAndWeekNumber(2009, 0, 20, 4),
195            new DateAndWeekNumber(2009, 0, 30, 5),
196    };
197
198    @Override
199    protected void setUp() throws Exception {
200        super.setUp();
201    }
202
203    @Smoke
204    @SmallTest
205    public void testAll() throws Exception {
206        int len = tests.length;
207        for (int index = 0; index < len; index++) {
208            DateAndWeekNumber test = tests[index];
209            int weekNumber = test.date.getWeekNumber();
210            if (weekNumber != test.expectedWeekNumber) {
211                long millis = test.date.toMillis(false /* use isDst */);
212                int flags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_NUMERIC_DATE;
213                String output = DateUtils.formatDateTime(mContext, millis, flags);
214                Log.i("WeekNumberTest", "index " + index
215                        + " date: " + output
216                        + " expected: " + test.expectedWeekNumber
217                        + " actual: " + weekNumber);
218            }
219            assertEquals(weekNumber, test.expectedWeekNumber);
220
221            weekNumber = test.allDayDate.getWeekNumber();
222            if (weekNumber != test.expectedWeekNumber) {
223                long millis = test.date.toMillis(false /* use isDst */);
224                int flags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_NUMERIC_DATE;
225                String output = DateUtils.formatDateTime(mContext, millis, flags);
226                Log.i("WeekNumberTest", "(all-day) index " + index
227                        + " date: " + output
228                        + " expected: " + test.expectedWeekNumber
229                        + " actual: " + weekNumber);
230            }
231            assertEquals(weekNumber, test.expectedWeekNumber);
232        }
233    }
234}
235