1/*
2 * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/*
25 * @test
26 * @bug 4409072
27 * @summary tests for set(), add(), and roll() with various week parameters.
28 * @library /java/text/testlib
29 * @run main bug4409072
30 */
31
32import  java.util.*;
33import static java.util.Calendar.*;
34
35public class bug4409072 extends IntlTest {
36
37    public static void main(String[] args) throws Exception {
38        new bug4409072().run(args);
39    }
40
41    /* Confirm some public methods' behavior in Calendar.
42     * (e.g. add(), roll(), set())
43     */
44    public void Test4409072() {
45        Locale locale = Locale.getDefault();
46        if (!TestUtils.usesGregorianCalendar(locale)) {
47            logln("Skipping this test because locale is " + locale);
48            return;
49        }
50
51        Locale savedLocale = Locale.getDefault();
52        TimeZone savedTZ = TimeZone.getDefault();
53        try {
54            TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
55            testSet();
56            testAdd();
57            testRoll();
58        } finally {
59            TimeZone.setDefault(savedTZ);
60            Locale.setDefault(savedLocale);
61        }
62    }
63
64    /*
65     * Golden data for set() test
66     */
67    static final int[][][] resultWOMForSetTest = {
68        { /* For year1998 */
69          /* Min =     1        2        3        4        5        6        7  */
70          /* Sun */ {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11,11}, {11,11},
71          /* Mon */ {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11,11},
72          /* Tue */ {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4},
73          /* Wed */ {10,27}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4},
74          /* Thu */ {10,27}, {10,27}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4},
75          /* Fri */ {10,27}, {10,27}, {10,27}, {11, 4}, {11, 4}, {11, 4}, {11, 4},
76          /* Sat */ {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11,11}, {11,11}, {11,11},
77        },
78        { /* For year1999 */
79          /* Min =     1        2        3        4        5        6        7  */
80          /* Sun */ {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11,10}, {11,10}, {11,10},
81          /* Mon */ {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11,10}, {11,10},
82          /* Tue */ {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11,10},
83          /* Wed */ {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3},
84          /* Thu */ {10,26}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3},
85          /* Fri */ {10,26}, {10,26}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3},
86          /* Sat */ {11, 3}, {11, 3}, {11, 3}, {11,10}, {11,10}, {11,10}, {11,10},
87        },
88        { /* For year2000 */
89          /* Min =     1        2        3        4        5        6        7  */
90          /* Sun */ {11, 1}, {11, 1}, {11, 8}, {11, 8}, {11, 8}, {11, 8}, {11, 8},
91          /* Mon */ {11, 1}, {11, 1}, {11, 1}, {11, 8}, {11, 8}, {11, 8}, {11, 8},
92          /* Tue */ {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 8}, {11, 8}, {11, 8},
93          /* Wed */ {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 8}, {11, 8},
94          /* Thu */ {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 8},
95          /* Fri */ {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 1},
96          /* Sat */ {11, 1}, {11, 8}, {11, 8}, {11, 8}, {11, 8}, {11, 8}, {11, 8},
97        },
98        { /* For year2001 */
99          /* Min =     1        2        3        4        5        6        7  */
100          /* Sun */ {10,30}, {11, 7}, {11, 7}, {11, 7}, {11, 7}, {11, 7}, {11, 7},
101          /* Mon */ {10,30}, {10,30}, {11, 7}, {11, 7}, {11, 7}, {11, 7}, {11, 7},
102          /* Tue */ {10,30}, {10,30}, {10,30}, {11, 7}, {11, 7}, {11, 7}, {11, 7},
103          /* Wed */ {10,30}, {10,30}, {10,30}, {10,30}, {11, 7}, {11, 7}, {11, 7},
104          /* Thu */ {10,30}, {10,30}, {10,30}, {10,30}, {10,30}, {11, 7}, {11, 7},
105          /* Fri */ {10,30}, {10,30}, {10,30}, {10,30}, {10,30}, {10,30}, {11, 7},
106          /* Sat */ {11, 7}, {11, 7}, {11, 7}, {11, 7}, {11, 7}, {11, 7}, {11, 7},
107        },
108        { /* For year2002 */
109          /* Min =     1        2        3        4        5        6        7  */
110          /* Sun */ {11, 6}, {11, 6}, {11, 6}, {11, 6}, {11, 6}, {11, 6}, {11, 6},
111          /* Mon */ {10,29}, {11, 6}, {11, 6}, {11, 6}, {11, 6}, {11, 6}, {11, 6},
112          /* Tue */ {10,29}, {10,29}, {11, 6}, {11, 6}, {11, 6}, {11, 6}, {11, 6},
113          /* Wed */ {10,29}, {10,29}, {10,29}, {11, 6}, {11, 6}, {11, 6}, {11, 6},
114          /* Thu */ {10,29}, {10,29}, {10,29}, {10,29}, {11, 6}, {11, 6}, {11, 6},
115          /* Fri */ {10,29}, {10,29}, {10,29}, {10,29}, {10,29}, {11, 6}, {11, 6},
116          /* Sat */ {11, 6}, {11, 6}, {11, 6}, {11, 6}, {11, 6}, {11, 6}, {11,13},
117        },
118        { /* For year2003 */
119          /* Min =     1        2        3        4        5        6        7  */
120          /* Sun */ {11, 5}, {11, 5}, {11, 5}, {11, 5}, {11, 5}, {11, 5}, {11,12},
121          /* Mon */ {11, 5}, {11, 5}, {11, 5}, {11, 5}, {11, 5}, {11, 5}, {11, 5},
122          /* Tue */ {10,28}, {11, 5}, {11, 5}, {11, 5}, {11, 5}, {11, 5}, {11, 5},
123          /* Wed */ {10,28}, {10,28}, {11, 5}, {11, 5}, {11, 5}, {11, 5}, {11, 5},
124          /* Thu */ {10,28}, {10,28}, {10,28}, {11, 5}, {11, 5}, {11, 5}, {11, 5},
125          /* Fri */ {10,28}, {10,28}, {10,28}, {10,28}, {11, 5}, {11, 5}, {11, 5},
126          /* Sat */ {11, 5}, {11, 5}, {11, 5}, {11, 5}, {11, 5}, {11,12}, {11,12},
127        },
128        { /* For year2004 */
129          /* Min =     1        2        3        4        5        6        7  */
130          /* Sun */ {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11,10}, {11,10}, {11,10},
131          /* Mon */ {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11,10}, {11,10},
132          /* Tue */ {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11,10},
133          /* Wed */ {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3},
134          /* Thu */ {10,26}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3},
135          /* Fri */ {10,26}, {10,26}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3},
136          /* Sat */ {11, 3}, {11, 3}, {11, 3}, {11,10}, {11,10}, {11,10}, {11,10},
137        },
138        { /* For year2005 */
139          /* Min =     1        2        3        4        5        6        7  */
140          /* Sun */ {11, 2}, {11, 2}, {11, 2}, {11, 9}, {11, 9}, {11, 9}, {11, 9},
141          /* Mon */ {11, 2}, {11, 2}, {11, 2}, {11, 2}, {11, 9}, {11, 9}, {11, 9},
142          /* Tue */ {11, 2}, {11, 2}, {11, 2}, {11, 2}, {11, 2}, {11, 9}, {11, 9},
143          /* Wed */ {11, 2}, {11, 2}, {11, 2}, {11, 2}, {11, 2}, {11, 2}, {11, 9},
144          /* Thu */ {11, 2}, {11, 2}, {11, 2}, {11, 2}, {11, 2}, {11, 2}, {11, 2},
145          /* Fri */ {10,25}, {11, 2}, {11, 2}, {11, 2}, {11, 2}, {11, 2}, {11, 2},
146          /* Sat */ {11, 2}, {11, 2}, {11, 9}, {11, 9}, {11, 9}, {11, 9}, {11, 9},
147        },
148        { /* For year2006 */
149          /* Min =     1        2        3        4        5        6        7  */
150          /* Sun */ {11, 1}, {11, 1}, {11, 8}, {11, 8}, {11, 8}, {11, 8}, {11, 8},
151          /* Mon */ {11, 1}, {11, 1}, {11, 1}, {11, 8}, {11, 8}, {11, 8}, {11, 8},
152          /* Tue */ {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 8}, {11, 8}, {11, 8},
153          /* Wed */ {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 8}, {11, 8},
154          /* Thu */ {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 8},
155          /* Fri */ {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 1},
156          /* Sat */ {11, 1}, {11, 8}, {11, 8}, {11, 8}, {11, 8}, {11, 8}, {11, 8},
157        },
158    };
159
160    static final int[][][] resultWOYForSetTest1 = {
161        { /* For year1998 */
162            /* FirstDayOfWeek = Sunday */
163              {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 9},
164              {1998, 0, 9}, {1998, 0, 9}, {1998, 0, 9},
165            /* FirstDayOfWeek = Monday */
166              {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 2},
167              {1998, 0, 9}, {1998, 0, 9}, {1998, 0, 9},
168            /* FirstDayOfWeek = Tuesday */
169              {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 2},
170              {1998, 0, 2}, {1998, 0, 9}, {1998, 0, 9},
171            /* FirstDayOfWeek = Wednesday */
172              {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 2},
173              {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 9},
174            /* FirstDayOfWeek = Thursday */
175              {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 2},
176              {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 2},
177            /* FirstDayOfWeek = Friday */
178              {1997,11,26}, {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 2},
179              {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 2},
180            /* FirstDayOfWeek = Saturday */
181              {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 9}, {1998, 0, 9},
182              {1998, 0, 9}, {1998, 0, 9}, {1998, 0, 9},
183        },
184        { /* For year1999 */
185            /* FirstDayOfWeek = Sunday */
186              {1999, 0, 1}, {1999, 0, 1}, {1999, 0, 8}, {1999, 0, 8},
187              {1999, 0, 8}, {1999, 0, 8}, {1999, 0, 8},
188            /* FirstDayOfWeek = Monday */
189              {1999, 0, 1}, {1999, 0, 1}, {1999, 0, 1}, {1999, 0, 8},
190              {1999, 0, 8}, {1999, 0, 8}, {1999, 0, 8},
191            /* FirstDayOfWeek = Tuesday */
192              {1999, 0, 1}, {1999, 0, 1}, {1999, 0, 1}, {1999, 0, 1},
193              {1999, 0, 8}, {1999, 0, 8}, {1999, 0, 8},
194            /* FirstDayOfWeek = Wednesday */
195              {1999, 0, 1}, {1999, 0, 1}, {1999, 0, 1}, {1999, 0, 1},
196              {1999, 0, 1}, {1999, 0, 8}, {1999, 0, 8},
197            /* FirstDayOfWeek = Thursday */
198              {1999, 0, 1}, {1999, 0, 1}, {1999, 0, 1}, {1999, 0, 1},
199              {1999, 0, 1}, {1999, 0, 1}, {1999, 0, 8},
200            /* FirstDayOfWeek = Friday */
201              {1999, 0, 1}, {1999, 0, 1}, {1999, 0, 1}, {1999, 0, 1},
202              {1999, 0, 1}, {1999, 0, 1}, {1999, 0, 1},
203            /* FirstDayOfWeek = Saturday */
204              {1999, 0, 1}, {1999, 0, 8}, {1999, 0, 8}, {1999, 0, 8},
205              {1999, 0, 8}, {1999, 0, 8}, {1999, 0, 8},
206        },
207        { /* For year2000 */
208            /* FirstDayOfWeek = Sunday */
209              {1999,11,31}, {2000, 0, 7}, {2000, 0, 7}, {2000, 0, 7},
210              {2000, 0, 7}, {2000, 0, 7}, {2000, 0, 7},
211            /* FirstDayOfWeek = Monday */
212              {1999,11,31}, {1999,11,31}, {2000, 0, 7}, {2000, 0, 7},
213              {2000, 0, 7}, {2000, 0, 7}, {2000, 0, 7},
214            /* FirstDayOfWeek = Tuesday */
215              {1999,11,31}, {1999,11,31}, {1999,11,31}, {2000, 0, 7},
216              {2000, 0, 7}, {2000, 0, 7}, {2000, 0, 7},
217            /* FirstDayOfWeek = Wednesday */
218              {1999,11,31}, {1999,11,31}, {1999,11,31}, {1999,11,31},
219              {2000, 0, 7}, {2000, 0, 7}, {2000, 0, 7},
220            /* FirstDayOfWeek = Thursday */
221              {1999,11,31}, {1999,11,31}, {1999,11,31}, {1999,11,31},
222              {1999,11,31}, {2000, 0, 7}, {2000, 0, 7},
223            /* FirstDayOfWeek = Friday */
224              {1999,11,31}, {1999,11,31}, {1999,11,31}, {1999,11,31},
225              {1999,11,31}, {1999,11,31}, {2000, 0, 7},
226            /* FirstDayOfWeek = Saturday */
227              {2000, 0, 7}, {2000, 0, 7}, {2000, 0, 7}, {2000, 0, 7},
228              {2000, 0, 7}, {2000, 0, 7}, {2000, 0, 7},
229        },
230        { /* For year2001 */
231            /* FirstDayOfWeek = Sunday */
232              {2001, 0, 5}, {2001, 0, 5}, {2001, 0, 5}, {2001, 0, 5},
233              {2001, 0, 5}, {2001, 0, 5}, {2001, 0,12},
234            /* FirstDayOfWeek = Monday */
235              {2001, 0, 5}, {2001, 0, 5}, {2001, 0, 5}, {2001, 0, 5},
236              {2001, 0, 5}, {2001, 0, 5}, {2001, 0, 5},
237            /* FirstDayOfWeek = Tuesday */
238              {2000,11,29}, {2001, 0, 5}, {2001, 0, 5}, {2001, 0, 5},
239              {2001, 0, 5}, {2001, 0, 5}, {2001, 0, 5},
240            /* FirstDayOfWeek = Wednesday */
241              {2000,11,29}, {2000,11,29}, {2001, 0, 5}, {2001, 0, 5},
242              {2001, 0, 5}, {2001, 0, 5}, {2001, 0, 5},
243            /* FirstDayOfWeek = Thursday */
244              {2000,11,29}, {2000,11,29}, {2000,11,29}, {2001, 0, 5},
245              {2001, 0, 5}, {2001, 0, 5}, {2001, 0, 5},
246            /* FirstDayOfWeek = Friday */
247              {2000,11,29}, {2000,11,29}, {2000,11,29}, {2000,11,29},
248              {2001, 0, 5}, {2001, 0, 5}, {2001, 0, 5},
249            /* FirstDayOfWeek = Saturday */
250              {2001, 0, 5}, {2001, 0, 5}, {2001, 0, 5}, {2001, 0, 5},
251              {2001, 0, 5}, {2001, 0,12}, {2001, 0,12},
252        },
253        { /* For year2002 */
254            /* FirstDayOfWeek = Sunday */
255              {2002, 0, 4}, {2002, 0, 4}, {2002, 0, 4}, {2002, 0, 4},
256              {2002, 0, 4}, {2002, 0,11}, {2002, 0,11},
257            /* FirstDayOfWeek = Monday */
258              {2002, 0, 4}, {2002, 0, 4}, {2002, 0, 4}, {2002, 0, 4},
259              {2002, 0, 4}, {2002, 0, 4}, {2002, 0,11},
260            /* FirstDayOfWeek = Tuesday */
261              {2002, 0, 4}, {2002, 0, 4}, {2002, 0, 4}, {2002, 0, 4},
262              {2002, 0, 4}, {2002, 0, 4}, {2002, 0, 4},
263            /* FirstDayOfWeek = Wednesday */
264              {2001,11,28}, {2002, 0, 4}, {2002, 0, 4}, {2002, 0, 4},
265              {2002, 0, 4}, {2002, 0, 4}, {2002, 0, 4},
266            /* FirstDayOfWeek = Thursday */
267              {2001,11,28}, {2001,11,28}, {2002, 0, 4}, {2002, 0, 4},
268              {2002, 0, 4}, {2002, 0, 4}, {2002, 0, 4},
269            /* FirstDayOfWeek = Friday */
270              {2001,11,28}, {2001,11,28}, {2001,11,28}, {2002, 0, 4},
271              {2002, 0, 4}, {2002, 0, 4}, {2002, 0, 4},
272            /* FirstDayOfWeek = Saturday */
273              {2002, 0, 4}, {2002, 0, 4}, {2002, 0, 4}, {2002, 0, 4},
274              {2002, 0,11}, {2002, 0,11}, {2002, 0,11},
275        },
276        { /* For year2003 */
277            /* FirstDayOfWeek = Sunday */
278              {2003, 0, 3}, {2003, 0, 3}, {2003, 0, 3}, {2003, 0, 3},
279              {2003, 0,10}, {2003, 0,10}, {2003, 0,10},
280            /* FirstDayOfWeek = Monday */
281              {2003, 0, 3}, {2003, 0, 3}, {2003, 0, 3}, {2003, 0, 3},
282              {2003, 0, 3}, {2003, 0,10}, {2003, 0,10},
283            /* FirstDayOfWeek = Tuesday */
284              {2003, 0, 3}, {2003, 0, 3}, {2003, 0, 3}, {2003, 0, 3},
285              {2003, 0, 3}, {2003, 0, 3}, {2003, 0,10},
286            /* FirstDayOfWeek = Wednesday */
287              {2003, 0, 3}, {2003, 0, 3}, {2003, 0, 3}, {2003, 0, 3},
288              {2003, 0, 3}, {2003, 0, 3}, {2003, 0, 3},
289            /* FirstDayOfWeek = Thursday */
290              {2002,11,27}, {2003, 0, 3}, {2003, 0, 3}, {2003, 0, 3},
291              {2003, 0, 3}, {2003, 0, 3}, {2003, 0, 3},
292            /* FirstDayOfWeek = Friday */
293              {2002,11,27}, {2002,11,27}, {2003, 0, 3}, {2003, 0, 3},
294              {2003, 0, 3}, {2003, 0, 3}, {2003, 0, 3},
295            /* FirstDayOfWeek = Saturday */
296              {2003, 0, 3}, {2003, 0, 3}, {2003, 0, 3}, {2003, 0,10},
297              {2003, 0,10}, {2003, 0,10}, {2003, 0,10},
298        },
299        { /* For year2004 */
300            /* FirstDayOfWeek = Sunday */
301              {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 9},
302              {2004, 0, 9}, {2004, 0, 9}, {2004, 0, 9},
303            /* FirstDayOfWeek = Monday */
304              {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 2},
305              {2004, 0, 9}, {2004, 0, 9}, {2004, 0, 9},
306            /* FirstDayOfWeek = Tuesday */
307              {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 2},
308              {2004, 0, 2}, {2004, 0, 9}, {2004, 0, 9},
309            /* FirstDayOfWeek = Wednesday */
310              {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 2},
311              {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 9},
312            /* FirstDayOfWeek = Thursday */
313              {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 2},
314              {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 2},
315            /* FirstDayOfWeek = Friday */
316              {2003,11,26}, {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 2},
317              {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 2},
318            /* FirstDayOfWeek = Saturday */
319              {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 9}, {2004, 0, 9},
320              {2004, 0, 9}, {2004, 0, 9}, {2004, 0, 9},
321        },
322        { /* For year2005 */
323            /* FirstDayOfWeek = Sunday */
324              {2004,11,31}, {2005, 0, 7}, {2005, 0, 7}, {2005, 0, 7},
325              {2005, 0, 7}, {2005, 0, 7}, {2005, 0, 7},
326            /* FirstDayOfWeek = Monday */
327              {2004,11,31}, {2004,11,31}, {2005, 0, 7}, {2005, 0, 7},
328              {2005, 0, 7}, {2005, 0, 7}, {2005, 0, 7},
329            /* FirstDayOfWeek = Tuesday */
330              {2004,11,31}, {2004,11,31}, {2004,11,31}, {2005, 0, 7},
331              {2005, 0, 7}, {2005, 0, 7}, {2005, 0, 7},
332            /* FirstDayOfWeek = Wednesday */
333              {2004,11,31}, {2004,11,31}, {2004,11,31}, {2004,11,31},
334              {2005, 0, 7}, {2005, 0, 7}, {2005, 0, 7},
335            /* FirstDayOfWeek = Thursday */
336              {2004,11,31}, {2004,11,31}, {2004,11,31}, {2004,11,31},
337              {2004,11,31}, {2005, 0, 7}, {2005, 0, 7},
338            /* FirstDayOfWeek = Friday */
339              {2004,11,31}, {2004,11,31}, {2004,11,31}, {2004,11,31},
340              {2004,11,31}, {2004,11,31}, {2005, 0, 7},
341            /* FirstDayOfWeek = Saturday */
342              {2005, 0, 7}, {2005, 0, 7}, {2005, 0, 7}, {2005, 0, 7},
343              {2005, 0, 7}, {2005, 0, 7}, {2005, 0, 7},
344        },
345        { /* For year2006 */
346            /* FirstDayOfWeek = Sunday */
347              {2006, 0, 6}, {2006, 0, 6}, {2006, 0, 6}, {2006, 0, 6},
348              {2006, 0, 6}, {2006, 0, 6}, {2006, 0, 6},
349            /* FirstDayOfWeek = Monday */
350              {2005,11,30}, {2006, 0, 6}, {2006, 0, 6}, {2006, 0, 6},
351              {2006, 0, 6}, {2006, 0, 6}, {2006, 0, 6},
352            /* FirstDayOfWeek = Tuesday */
353              {2005,11,30}, {2005,11,30}, {2006, 0, 6}, {2006, 0, 6},
354              {2006, 0, 6}, {2006, 0, 6}, {2006, 0, 6},
355            /* FirstDayOfWeek = Wednesday */
356              {2005,11,30}, {2005,11,30}, {2005,11,30}, {2006, 0, 6},
357              {2006, 0, 6}, {2006, 0, 6}, {2006, 0, 6},
358            /* FirstDayOfWeek = Thursday */
359              {2005,11,30}, {2005,11,30}, {2005,11,30}, {2005,11,30},
360              {2006, 0, 6}, {2006, 0, 6}, {2006, 0, 6},
361            /* FirstDayOfWeek = Friday */
362              {2005,11,30}, {2005,11,30}, {2005,11,30}, {2005,11,30},
363              {2005,11,30}, {2006, 0, 6}, {2006, 0, 6},
364            /* FirstDayOfWeek = Saturday */
365              {2006, 0, 6}, {2006, 0, 6}, {2006, 0, 6}, {2006, 0, 6},
366              {2006, 0, 6}, {2006, 0, 6}, {2006, 0,13},
367        }
368    };
369
370    static final int[][] resultWOYForSetTest2 = {
371          /* Min =    1       2       3       4       5       6       7  */
372          /* Sun */ {4,25}, {5, 1}, {5, 1}, {5, 1}, {5, 1}, {5, 1}, {5, 1},
373          /* Mon */ {4,25}, {4,25}, {5, 1}, {5, 1}, {5, 1}, {5, 1}, {5, 1},
374          /* Tue */ {4,25}, {4,25}, {4,25}, {5, 1}, {5, 1}, {5, 1}, {5, 1},
375          /* Wed */ {4,25}, {4,25}, {4,25}, {4,25}, {5, 1}, {5, 1}, {5, 1},
376          /* Thu */ {5, 1}, {5, 1}, {5, 1}, {5, 1}, {5, 1}, {5, 8}, {5, 8},
377          /* Fri */ {5, 1}, {5, 1}, {5, 1}, {5, 1}, {5, 1}, {5, 1}, {5, 8},
378          /* Sat */ {5, 1}, {5, 1}, {5, 1}, {5, 1}, {5, 1}, {5, 1}, {5, 1},
379    };
380
381    /**
382     * Test for set()
383     */
384    void testSet() {
385        boolean noerror = true;
386        Calendar cal = Calendar.getInstance();
387        int sYear=1998;
388        int eYear=2006;
389
390        // Loop for FirstDayOfWeek: SUNDAY..SATURDAY
391        for (int dow = SUNDAY; dow <= SATURDAY; dow++) {
392
393            // Loop for MinimalDaysInFirstWeek: 1..7
394            for (int minDow = 1; minDow <= 7; minDow++) {
395                int index = (dow-1)*7 + (minDow-1);
396
397                cal.clear();
398                cal.setLenient(true);
399                cal.setMinimalDaysInFirstWeek(minDow);
400                cal.setFirstDayOfWeek(dow);
401                cal.set(YEAR, 2005);
402                cal.set(DAY_OF_WEEK, WEDNESDAY);
403                cal.set(WEEK_OF_YEAR, 22);
404
405                int y = 2005;
406                int m = resultWOYForSetTest2[index][0];
407                int d = resultWOYForSetTest2[index][1];
408                int year = cal.get(YEAR);
409                int month = cal.get(MONTH);
410                int date = cal.get(DATE);
411
412                if (cal.get(WEEK_OF_YEAR) != 22) {
413                    noerror = false;
414                    errln("Failed : set(WEEK_OF_YEAR=22)" +
415                          " *** get(WEEK_OF_YEAR=" +
416                          cal.get(WEEK_OF_YEAR) + ")" +
417                          ", got " + (month+1)+"/"+date+"/"+year +
418                          ", expected " + (m+1)+"/"+d+"/"+2005 +
419                          ", MinFirstDOW=" + minDow +
420                          ", FirstDOW=" + dow);
421                } else if ((year != y) || (month != m) || (date != d)) {
422                    noerror = false;
423                    errln("Failed : set(WEEK_OF_YEAR=22)" +
424                          " got " + (month+1)+"/"+date+"/"+year +
425                          ", expected " + (m+1)+"/"+d+"/"+y +
426                          ", MinFirstDOW=" + minDow +
427                          ", FirstDOW=" + dow);
428                }
429
430                for (int targetYear = sYear; targetYear<= eYear; targetYear++) {
431                    cal.clear();
432                    cal.setLenient(true);
433                    cal.setMinimalDaysInFirstWeek(minDow);
434                    cal.setFirstDayOfWeek(dow);
435                    cal.set(YEAR, targetYear);
436                    cal.set(DAY_OF_WEEK, FRIDAY);
437                    cal.set(MONTH, DECEMBER);
438                    cal.set(WEEK_OF_MONTH, 1);
439
440                    y = targetYear;
441                    m = resultWOMForSetTest[targetYear-sYear][index][0];
442                    d = resultWOMForSetTest[targetYear-sYear][index][1];
443                    year = cal.get(YEAR);
444                    month = cal.get(MONTH);
445                    date = cal.get(DATE);
446
447                    if ((year != y) || (month != m) || (date != d)) {
448                        noerror = false;
449                        errln("Failed : set(WEEK_OF_MONTH=1)" +
450                              " got " + (month+1)+"/"+date+"/"+year +
451                              ", expected " + (m+1)+"/"+d+"/"+y +
452                              ", MinFirstDOW=" + minDow +
453                              ", FirstDOW=" + dow);
454                    }
455
456                    cal.clear();
457                    cal.setLenient(true);
458                    cal.setMinimalDaysInFirstWeek(minDow);
459                    cal.setFirstDayOfWeek(dow);
460                    cal.set(YEAR, targetYear);
461                    cal.set(DAY_OF_WEEK, FRIDAY);
462                    cal.set(WEEK_OF_YEAR, 1);
463
464                    y = resultWOYForSetTest1[targetYear-sYear][index][0];
465                    m = resultWOYForSetTest1[targetYear-sYear][index][1];
466                    d = resultWOYForSetTest1[targetYear-sYear][index][2];
467                    year = cal.get(YEAR);
468                    month = cal.get(MONTH);
469                    date = cal.get(DATE);
470
471                    if (cal.get(WEEK_OF_YEAR) != 1) {
472                        noerror = false;
473                        errln("Failed : set(WEEK_OF_YEAR=1)" +
474                              " *** get(WEEK_OF_YEAR=" +
475                              cal.get(WEEK_OF_YEAR) + ")" +
476                              ", got " + (month+1)+"/"+date+"/"+year +
477                              ", expected " + (m+1)+"/"+d+"/"+y +
478                              ", MinFirstDOW=" + minDow +
479                              ", FirstDOW=" + dow);
480                    } else if ((year != y) || (month != m) || (date != d)) {
481                        noerror = false;
482                        errln("Failed : set(WEEK_OF_YEAR=1)" +
483                              " got " + (month+1)+"/"+date+"/"+year +
484                              ", expected " + (m+1)+"/"+d+"/"+y +
485                              ", MinFirstDOW=" + minDow +
486                              ", FirstDOW=" + dow);
487                    }
488                }
489            }
490        }
491
492        if (noerror) {
493            logln("Passed : set() test");
494        }
495    }
496
497    /**
498     * Test for add()
499     */
500    void testAdd() {
501        boolean noerror = true;
502        Calendar cal = Calendar.getInstance();
503
504        // Loop for FirstDayOfWeek: SUNDAY..SATURDAY
505        for (int dow = SUNDAY; dow <= SATURDAY; dow++) {
506
507            // Loop for MinimalDaysInFirstWeek: 1..7
508            for (int minDow = 1; minDow <= 7; minDow++) {
509                int oldWOY, newWOY;
510
511                cal.clear();
512                cal.setLenient(true);
513                cal.setMinimalDaysInFirstWeek(minDow);
514                cal.setFirstDayOfWeek(dow);
515                cal.set(2005, DECEMBER, 7);
516                oldWOY = cal.get(WEEK_OF_YEAR);
517
518                for (int cnt = 0; cnt < 7; cnt++) {
519                    cal.add(WEEK_OF_YEAR, 1);
520                }
521
522                int year = cal.get(YEAR);
523                int month = cal.get(MONTH);
524                int date = cal.get(DATE);
525
526                if ((year != 2006) || (month != 0) || (date != 25)) {
527                    noerror = false;
528                    errln("Failed : add(WEEK_OF_YEAR+1)" +
529                          " got " + (month+1)+"/"+date+"/"+year +
530                          ", expected 1/25/2006" +
531                          ", MinFirstDOW=" + minDow +
532                          ", FirstDOW=" + dow);
533                }
534
535                for (int cnt = 0; cnt < 10; cnt++) {
536                    cal.add(WEEK_OF_YEAR, -1);
537                }
538                newWOY = cal.get(WEEK_OF_YEAR);
539
540                year = cal.get(YEAR);
541                month = cal.get(MONTH);
542                date = cal.get(DATE);
543
544                if ((oldWOY - newWOY) != 3) {
545                    errln("Failed : add(WEEK_OF_YEAR-1)" +
546                          " got " + (month+1)+"/"+date+"/"+year +
547                          ", expected 11/16/2005" +
548                          ", MinFirstDOW=" + minDow +
549                          ", FirstDOW=" + dow +
550                          ", WEEK_OF_YEAR=" + newWOY +
551                          " should be " + (oldWOY-3));
552                } else if ((year != 2005) || (month != 10) || (date != 16)) {
553                    errln("Failed : add(-1)" +
554                          " got " + (month+1)+"/"+date+"/"+year +
555                          ", expected 11/16/2005" +
556                          ", MinFirstDOW=" + minDow +
557                          ", FirstDOW=" + dow);
558                }
559            }
560        }
561
562        if (noerror) {
563            logln("Passed : add() test");
564        }
565    }
566
567    /*
568     * Golden data for roll() test
569     */
570    static final int[] resultWOMForRollTest = {
571          /* Min =    1   2   3   4   5   6   7  */
572          /* Sun */   1,  1,  1, 26, 26, 26, 26,
573          /* Mon */   1,  1,  1,  1, 26, 26, 26,
574          /* Tue */  31, 31, 31, 31, 31, 24, 24,
575          /* Wed */  31, 31, 31, 31, 31, 31, 24,
576          /* Thu */  31, 31, 31, 31, 31, 31, 31,
577          /* Fri */   1, 31, 31, 31, 31, 31, 31,
578          /* Sat */   1,  1, 31, 31, 31, 31, 31,
579    };
580
581    static final int[][] resultWOYForRollTest = {
582          /* Min =    1       2       3       4       5       6       7  */
583          /* Sun */ {0,26}, {0,26}, {0,26}, {0,26}, {0,26}, {0,26}, {0,26},
584          /* Mon */ {1, 2}, {0,26}, {0,26}, {0,26}, {0,26}, {0,26}, {0,26},
585          /* Tue */ {1, 2}, {1, 2}, {0,26}, {0,26}, {0,26}, {0,26}, {0,26},
586          /* Wed */ {1, 2}, {1, 2}, {1, 2}, {0,26}, {0,26}, {0,26}, {0,26},
587          /* Thu */ {0,26}, {0,26}, {0,26}, {0,26}, {0,26}, {1, 2}, {1, 2},
588          /* Fri */ {0,26}, {0,26}, {0,26}, {0,26}, {0,26}, {0,26}, {1, 2},
589          /* Sat */ {0,26}, {0,26}, {0,26}, {0,26}, {0,26}, {0,26}, {0,26},
590    };
591
592    /**
593     * Test for roll()
594     */
595    void testRoll() {
596        boolean noerror = true;
597        Calendar cal = Calendar.getInstance();
598
599        // Loop for FirstDayOfWeek: SUNDAY..SATURDAY
600        for (int dow = SUNDAY; dow <= SATURDAY; dow++) {
601
602            // Loop for MinimalDaysInFirstWeek: 1..7
603            for (int minDow = 1; minDow <= 7; minDow++) {
604                int oldWOY, newWOY;
605                int index = (dow-1)*7 + (minDow-1);
606
607                cal.clear();
608                cal.setLenient(true);
609                cal.setMinimalDaysInFirstWeek(minDow);
610                cal.setFirstDayOfWeek(dow);
611                cal.set(2005, DECEMBER, 12);
612                oldWOY = cal.get(WEEK_OF_YEAR);
613                for (int cnt = 0; cnt < 2; cnt++) {
614                    cal.roll(WEEK_OF_MONTH, -1);
615                }
616                int y = 2005;
617                int m = DECEMBER;
618                int d = resultWOMForRollTest[index];
619                int year = cal.get(YEAR);
620                int month = cal.get(MONTH);
621                int date = cal.get(DATE);
622
623                if ((year != y) || (month != m) || (date != d)) {
624                    noerror = false;
625                    errln("Failed : roll(WEEK_OF_MONTH-1)" +
626                          " got " + (month+1) + "/" + date + "/" + year +
627                          ", expected " + (m+1) + "/" + d + "/" + y +
628                          ", MinFirstDOW=" + minDow +
629                          ", FirstDOW=" + dow);
630                }
631
632                cal.clear();
633                cal.setLenient(true);
634                cal.setMinimalDaysInFirstWeek(minDow);
635                cal.setFirstDayOfWeek(dow);
636                cal.set(2005, DECEMBER, 7);
637                oldWOY = cal.get(WEEK_OF_YEAR);
638
639                for (int cnt = 0; cnt < 7; cnt++) {
640                    cal.roll(WEEK_OF_YEAR, 1);
641                }
642
643                y = 2005;
644                m = resultWOYForRollTest[index][0];
645                d = resultWOYForRollTest[index][1];
646                year = cal.get(YEAR);
647                month = cal.get(MONTH);
648                date = cal.get(DATE);
649
650                if ((year != y) || (month != m) || (date != d)) {
651                    noerror = false;
652                    errln("Failed : roll(WEEK_OF_YEAR+1)" +
653                          " got " + (month+1) + "/" + date + "/" + year +
654                          ", expected " + (m+1) + "/" + d + "/" + y +
655                          ", MinFirstDOW=" + minDow +
656                          ", FirstDOW=" + dow);
657                }
658
659                for (int cnt = 0; cnt < 10; cnt++) {
660                    cal.roll(WEEK_OF_YEAR, -1);
661                }
662                newWOY = cal.get(WEEK_OF_YEAR);
663
664                y = 2005;
665                m = NOVEMBER;
666                d = 16;
667                year = cal.get(YEAR);
668                month = cal.get(MONTH);
669                date = cal.get(DATE);
670
671                if ((year != y) || (month != m) || (date != d)) {
672                    noerror = false;
673                    errln("Failed : roll(WEEK_OF_YEAR-1)" +
674                          " got " + (month+1)+"/"+date+"/"+year +
675                          ", expected " + (m+1)+"/"+d+"/"+y +
676                          ", MinFirstDOW=" + minDow +
677                          ", FirstDOW=" + dow);
678                }
679            }
680        }
681
682        if (noerror) {
683            logln("Passed : roll() test");
684        }
685    }
686}
687