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