test/jdk/java/util/Calendar/bug4409072.java
author mli
Wed, 24 Oct 2018 17:52:06 +0800
changeset 52234 5bd3a6017943
parent 47216 71c04702a3d5
permissions -rw-r--r--
8210407: Refactor java.util.Calendar:i18n shell tests to plain java tests Reviewed-by: naoto

/*
 * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/*
 * @test
 * @bug 4409072
 * @summary tests for set(), add(), and roll() with various week parameters.
 * @library /java/text/testlib
 * @run main bug4409072
 */

import  java.util.*;
import static java.util.Calendar.*;

public class bug4409072 extends IntlTest {

    public static void main(String[] args) throws Exception {
        new bug4409072().run(args);
    }

    /* Confirm some public methods' behavior in Calendar.
     * (e.g. add(), roll(), set())
     */
    public void Test4409072() {
        Locale locale = Locale.getDefault();
        if (!TestUtils.usesGregorianCalendar(locale)) {
            logln("Skipping this test because locale is " + locale);
            return;
        }

        Locale savedLocale = Locale.getDefault();
        TimeZone savedTZ = TimeZone.getDefault();
        try {
            TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
            testSet();
            testAdd();
            testRoll();
        } finally {
            TimeZone.setDefault(savedTZ);
            Locale.setDefault(savedLocale);
        }
    }

    /*
     * Golden data for set() test
     */
    static final int[][][] resultWOMForSetTest = {
        { /* For year1998 */
          /* Min =     1        2        3        4        5        6        7  */
          /* Sun */ {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11,11}, {11,11},
          /* Mon */ {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11,11},
          /* Tue */ {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4},
          /* Wed */ {10,27}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4},
          /* Thu */ {10,27}, {10,27}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4},
          /* Fri */ {10,27}, {10,27}, {10,27}, {11, 4}, {11, 4}, {11, 4}, {11, 4},
          /* Sat */ {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11,11}, {11,11}, {11,11},
        },
        { /* For year1999 */
          /* Min =     1        2        3        4        5        6        7  */
          /* Sun */ {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11,10}, {11,10}, {11,10},
          /* Mon */ {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11,10}, {11,10},
          /* Tue */ {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11,10},
          /* Wed */ {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3},
          /* Thu */ {10,26}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3},
          /* Fri */ {10,26}, {10,26}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3},
          /* Sat */ {11, 3}, {11, 3}, {11, 3}, {11,10}, {11,10}, {11,10}, {11,10},
        },
        { /* For year2000 */
          /* Min =     1        2        3        4        5        6        7  */
          /* Sun */ {11, 1}, {11, 1}, {11, 8}, {11, 8}, {11, 8}, {11, 8}, {11, 8},
          /* Mon */ {11, 1}, {11, 1}, {11, 1}, {11, 8}, {11, 8}, {11, 8}, {11, 8},
          /* Tue */ {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 8}, {11, 8}, {11, 8},
          /* Wed */ {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 8}, {11, 8},
          /* Thu */ {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 8},
          /* Fri */ {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 1},
          /* Sat */ {11, 1}, {11, 8}, {11, 8}, {11, 8}, {11, 8}, {11, 8}, {11, 8},
        },
        { /* For year2001 */
          /* Min =     1        2        3        4        5        6        7  */
          /* Sun */ {10,30}, {11, 7}, {11, 7}, {11, 7}, {11, 7}, {11, 7}, {11, 7},
          /* Mon */ {10,30}, {10,30}, {11, 7}, {11, 7}, {11, 7}, {11, 7}, {11, 7},
          /* Tue */ {10,30}, {10,30}, {10,30}, {11, 7}, {11, 7}, {11, 7}, {11, 7},
          /* Wed */ {10,30}, {10,30}, {10,30}, {10,30}, {11, 7}, {11, 7}, {11, 7},
          /* Thu */ {10,30}, {10,30}, {10,30}, {10,30}, {10,30}, {11, 7}, {11, 7},
          /* Fri */ {10,30}, {10,30}, {10,30}, {10,30}, {10,30}, {10,30}, {11, 7},
          /* Sat */ {11, 7}, {11, 7}, {11, 7}, {11, 7}, {11, 7}, {11, 7}, {11, 7},
        },
        { /* For year2002 */
          /* Min =     1        2        3        4        5        6        7  */
          /* Sun */ {11, 6}, {11, 6}, {11, 6}, {11, 6}, {11, 6}, {11, 6}, {11, 6},
          /* Mon */ {10,29}, {11, 6}, {11, 6}, {11, 6}, {11, 6}, {11, 6}, {11, 6},
          /* Tue */ {10,29}, {10,29}, {11, 6}, {11, 6}, {11, 6}, {11, 6}, {11, 6},
          /* Wed */ {10,29}, {10,29}, {10,29}, {11, 6}, {11, 6}, {11, 6}, {11, 6},
          /* Thu */ {10,29}, {10,29}, {10,29}, {10,29}, {11, 6}, {11, 6}, {11, 6},
          /* Fri */ {10,29}, {10,29}, {10,29}, {10,29}, {10,29}, {11, 6}, {11, 6},
          /* Sat */ {11, 6}, {11, 6}, {11, 6}, {11, 6}, {11, 6}, {11, 6}, {11,13},
        },
        { /* For year2003 */
          /* Min =     1        2        3        4        5        6        7  */
          /* Sun */ {11, 5}, {11, 5}, {11, 5}, {11, 5}, {11, 5}, {11, 5}, {11,12},
          /* Mon */ {11, 5}, {11, 5}, {11, 5}, {11, 5}, {11, 5}, {11, 5}, {11, 5},
          /* Tue */ {10,28}, {11, 5}, {11, 5}, {11, 5}, {11, 5}, {11, 5}, {11, 5},
          /* Wed */ {10,28}, {10,28}, {11, 5}, {11, 5}, {11, 5}, {11, 5}, {11, 5},
          /* Thu */ {10,28}, {10,28}, {10,28}, {11, 5}, {11, 5}, {11, 5}, {11, 5},
          /* Fri */ {10,28}, {10,28}, {10,28}, {10,28}, {11, 5}, {11, 5}, {11, 5},
          /* Sat */ {11, 5}, {11, 5}, {11, 5}, {11, 5}, {11, 5}, {11,12}, {11,12},
        },
        { /* For year2004 */
          /* Min =     1        2        3        4        5        6        7  */
          /* Sun */ {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11,10}, {11,10}, {11,10},
          /* Mon */ {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11,10}, {11,10},
          /* Tue */ {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11,10},
          /* Wed */ {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3},
          /* Thu */ {10,26}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3},
          /* Fri */ {10,26}, {10,26}, {11, 3}, {11, 3}, {11, 3}, {11, 3}, {11, 3},
          /* Sat */ {11, 3}, {11, 3}, {11, 3}, {11,10}, {11,10}, {11,10}, {11,10},
        },
        { /* For year2005 */
          /* Min =     1        2        3        4        5        6        7  */
          /* Sun */ {11, 2}, {11, 2}, {11, 2}, {11, 9}, {11, 9}, {11, 9}, {11, 9},
          /* Mon */ {11, 2}, {11, 2}, {11, 2}, {11, 2}, {11, 9}, {11, 9}, {11, 9},
          /* Tue */ {11, 2}, {11, 2}, {11, 2}, {11, 2}, {11, 2}, {11, 9}, {11, 9},
          /* Wed */ {11, 2}, {11, 2}, {11, 2}, {11, 2}, {11, 2}, {11, 2}, {11, 9},
          /* Thu */ {11, 2}, {11, 2}, {11, 2}, {11, 2}, {11, 2}, {11, 2}, {11, 2},
          /* Fri */ {10,25}, {11, 2}, {11, 2}, {11, 2}, {11, 2}, {11, 2}, {11, 2},
          /* Sat */ {11, 2}, {11, 2}, {11, 9}, {11, 9}, {11, 9}, {11, 9}, {11, 9},
        },
        { /* For year2006 */
          /* Min =     1        2        3        4        5        6        7  */
          /* Sun */ {11, 1}, {11, 1}, {11, 8}, {11, 8}, {11, 8}, {11, 8}, {11, 8},
          /* Mon */ {11, 1}, {11, 1}, {11, 1}, {11, 8}, {11, 8}, {11, 8}, {11, 8},
          /* Tue */ {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 8}, {11, 8}, {11, 8},
          /* Wed */ {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 8}, {11, 8},
          /* Thu */ {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 8},
          /* Fri */ {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 1}, {11, 1},
          /* Sat */ {11, 1}, {11, 8}, {11, 8}, {11, 8}, {11, 8}, {11, 8}, {11, 8},
        },
    };

    static final int[][][] resultWOYForSetTest1 = {
        { /* For year1998 */
            /* FirstDayOfWeek = Sunday */
              {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 9},
              {1998, 0, 9}, {1998, 0, 9}, {1998, 0, 9},
            /* FirstDayOfWeek = Monday */
              {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 2},
              {1998, 0, 9}, {1998, 0, 9}, {1998, 0, 9},
            /* FirstDayOfWeek = Tuesday */
              {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 2},
              {1998, 0, 2}, {1998, 0, 9}, {1998, 0, 9},
            /* FirstDayOfWeek = Wednesday */
              {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 2},
              {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 9},
            /* FirstDayOfWeek = Thursday */
              {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 2},
              {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 2},
            /* FirstDayOfWeek = Friday */
              {1997,11,26}, {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 2},
              {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 2},
            /* FirstDayOfWeek = Saturday */
              {1998, 0, 2}, {1998, 0, 2}, {1998, 0, 9}, {1998, 0, 9},
              {1998, 0, 9}, {1998, 0, 9}, {1998, 0, 9},
        },
        { /* For year1999 */
            /* FirstDayOfWeek = Sunday */
              {1999, 0, 1}, {1999, 0, 1}, {1999, 0, 8}, {1999, 0, 8},
              {1999, 0, 8}, {1999, 0, 8}, {1999, 0, 8},
            /* FirstDayOfWeek = Monday */
              {1999, 0, 1}, {1999, 0, 1}, {1999, 0, 1}, {1999, 0, 8},
              {1999, 0, 8}, {1999, 0, 8}, {1999, 0, 8},
            /* FirstDayOfWeek = Tuesday */
              {1999, 0, 1}, {1999, 0, 1}, {1999, 0, 1}, {1999, 0, 1},
              {1999, 0, 8}, {1999, 0, 8}, {1999, 0, 8},
            /* FirstDayOfWeek = Wednesday */
              {1999, 0, 1}, {1999, 0, 1}, {1999, 0, 1}, {1999, 0, 1},
              {1999, 0, 1}, {1999, 0, 8}, {1999, 0, 8},
            /* FirstDayOfWeek = Thursday */
              {1999, 0, 1}, {1999, 0, 1}, {1999, 0, 1}, {1999, 0, 1},
              {1999, 0, 1}, {1999, 0, 1}, {1999, 0, 8},
            /* FirstDayOfWeek = Friday */
              {1999, 0, 1}, {1999, 0, 1}, {1999, 0, 1}, {1999, 0, 1},
              {1999, 0, 1}, {1999, 0, 1}, {1999, 0, 1},
            /* FirstDayOfWeek = Saturday */
              {1999, 0, 1}, {1999, 0, 8}, {1999, 0, 8}, {1999, 0, 8},
              {1999, 0, 8}, {1999, 0, 8}, {1999, 0, 8},
        },
        { /* For year2000 */
            /* FirstDayOfWeek = Sunday */
              {1999,11,31}, {2000, 0, 7}, {2000, 0, 7}, {2000, 0, 7},
              {2000, 0, 7}, {2000, 0, 7}, {2000, 0, 7},
            /* FirstDayOfWeek = Monday */
              {1999,11,31}, {1999,11,31}, {2000, 0, 7}, {2000, 0, 7},
              {2000, 0, 7}, {2000, 0, 7}, {2000, 0, 7},
            /* FirstDayOfWeek = Tuesday */
              {1999,11,31}, {1999,11,31}, {1999,11,31}, {2000, 0, 7},
              {2000, 0, 7}, {2000, 0, 7}, {2000, 0, 7},
            /* FirstDayOfWeek = Wednesday */
              {1999,11,31}, {1999,11,31}, {1999,11,31}, {1999,11,31},
              {2000, 0, 7}, {2000, 0, 7}, {2000, 0, 7},
            /* FirstDayOfWeek = Thursday */
              {1999,11,31}, {1999,11,31}, {1999,11,31}, {1999,11,31},
              {1999,11,31}, {2000, 0, 7}, {2000, 0, 7},
            /* FirstDayOfWeek = Friday */
              {1999,11,31}, {1999,11,31}, {1999,11,31}, {1999,11,31},
              {1999,11,31}, {1999,11,31}, {2000, 0, 7},
            /* FirstDayOfWeek = Saturday */
              {2000, 0, 7}, {2000, 0, 7}, {2000, 0, 7}, {2000, 0, 7},
              {2000, 0, 7}, {2000, 0, 7}, {2000, 0, 7},
        },
        { /* For year2001 */
            /* FirstDayOfWeek = Sunday */
              {2001, 0, 5}, {2001, 0, 5}, {2001, 0, 5}, {2001, 0, 5},
              {2001, 0, 5}, {2001, 0, 5}, {2001, 0,12},
            /* FirstDayOfWeek = Monday */
              {2001, 0, 5}, {2001, 0, 5}, {2001, 0, 5}, {2001, 0, 5},
              {2001, 0, 5}, {2001, 0, 5}, {2001, 0, 5},
            /* FirstDayOfWeek = Tuesday */
              {2000,11,29}, {2001, 0, 5}, {2001, 0, 5}, {2001, 0, 5},
              {2001, 0, 5}, {2001, 0, 5}, {2001, 0, 5},
            /* FirstDayOfWeek = Wednesday */
              {2000,11,29}, {2000,11,29}, {2001, 0, 5}, {2001, 0, 5},
              {2001, 0, 5}, {2001, 0, 5}, {2001, 0, 5},
            /* FirstDayOfWeek = Thursday */
              {2000,11,29}, {2000,11,29}, {2000,11,29}, {2001, 0, 5},
              {2001, 0, 5}, {2001, 0, 5}, {2001, 0, 5},
            /* FirstDayOfWeek = Friday */
              {2000,11,29}, {2000,11,29}, {2000,11,29}, {2000,11,29},
              {2001, 0, 5}, {2001, 0, 5}, {2001, 0, 5},
            /* FirstDayOfWeek = Saturday */
              {2001, 0, 5}, {2001, 0, 5}, {2001, 0, 5}, {2001, 0, 5},
              {2001, 0, 5}, {2001, 0,12}, {2001, 0,12},
        },
        { /* For year2002 */
            /* FirstDayOfWeek = Sunday */
              {2002, 0, 4}, {2002, 0, 4}, {2002, 0, 4}, {2002, 0, 4},
              {2002, 0, 4}, {2002, 0,11}, {2002, 0,11},
            /* FirstDayOfWeek = Monday */
              {2002, 0, 4}, {2002, 0, 4}, {2002, 0, 4}, {2002, 0, 4},
              {2002, 0, 4}, {2002, 0, 4}, {2002, 0,11},
            /* FirstDayOfWeek = Tuesday */
              {2002, 0, 4}, {2002, 0, 4}, {2002, 0, 4}, {2002, 0, 4},
              {2002, 0, 4}, {2002, 0, 4}, {2002, 0, 4},
            /* FirstDayOfWeek = Wednesday */
              {2001,11,28}, {2002, 0, 4}, {2002, 0, 4}, {2002, 0, 4},
              {2002, 0, 4}, {2002, 0, 4}, {2002, 0, 4},
            /* FirstDayOfWeek = Thursday */
              {2001,11,28}, {2001,11,28}, {2002, 0, 4}, {2002, 0, 4},
              {2002, 0, 4}, {2002, 0, 4}, {2002, 0, 4},
            /* FirstDayOfWeek = Friday */
              {2001,11,28}, {2001,11,28}, {2001,11,28}, {2002, 0, 4},
              {2002, 0, 4}, {2002, 0, 4}, {2002, 0, 4},
            /* FirstDayOfWeek = Saturday */
              {2002, 0, 4}, {2002, 0, 4}, {2002, 0, 4}, {2002, 0, 4},
              {2002, 0,11}, {2002, 0,11}, {2002, 0,11},
        },
        { /* For year2003 */
            /* FirstDayOfWeek = Sunday */
              {2003, 0, 3}, {2003, 0, 3}, {2003, 0, 3}, {2003, 0, 3},
              {2003, 0,10}, {2003, 0,10}, {2003, 0,10},
            /* FirstDayOfWeek = Monday */
              {2003, 0, 3}, {2003, 0, 3}, {2003, 0, 3}, {2003, 0, 3},
              {2003, 0, 3}, {2003, 0,10}, {2003, 0,10},
            /* FirstDayOfWeek = Tuesday */
              {2003, 0, 3}, {2003, 0, 3}, {2003, 0, 3}, {2003, 0, 3},
              {2003, 0, 3}, {2003, 0, 3}, {2003, 0,10},
            /* FirstDayOfWeek = Wednesday */
              {2003, 0, 3}, {2003, 0, 3}, {2003, 0, 3}, {2003, 0, 3},
              {2003, 0, 3}, {2003, 0, 3}, {2003, 0, 3},
            /* FirstDayOfWeek = Thursday */
              {2002,11,27}, {2003, 0, 3}, {2003, 0, 3}, {2003, 0, 3},
              {2003, 0, 3}, {2003, 0, 3}, {2003, 0, 3},
            /* FirstDayOfWeek = Friday */
              {2002,11,27}, {2002,11,27}, {2003, 0, 3}, {2003, 0, 3},
              {2003, 0, 3}, {2003, 0, 3}, {2003, 0, 3},
            /* FirstDayOfWeek = Saturday */
              {2003, 0, 3}, {2003, 0, 3}, {2003, 0, 3}, {2003, 0,10},
              {2003, 0,10}, {2003, 0,10}, {2003, 0,10},
        },
        { /* For year2004 */
            /* FirstDayOfWeek = Sunday */
              {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 9},
              {2004, 0, 9}, {2004, 0, 9}, {2004, 0, 9},
            /* FirstDayOfWeek = Monday */
              {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 2},
              {2004, 0, 9}, {2004, 0, 9}, {2004, 0, 9},
            /* FirstDayOfWeek = Tuesday */
              {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 2},
              {2004, 0, 2}, {2004, 0, 9}, {2004, 0, 9},
            /* FirstDayOfWeek = Wednesday */
              {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 2},
              {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 9},
            /* FirstDayOfWeek = Thursday */
              {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 2},
              {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 2},
            /* FirstDayOfWeek = Friday */
              {2003,11,26}, {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 2},
              {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 2},
            /* FirstDayOfWeek = Saturday */
              {2004, 0, 2}, {2004, 0, 2}, {2004, 0, 9}, {2004, 0, 9},
              {2004, 0, 9}, {2004, 0, 9}, {2004, 0, 9},
        },
        { /* For year2005 */
            /* FirstDayOfWeek = Sunday */
              {2004,11,31}, {2005, 0, 7}, {2005, 0, 7}, {2005, 0, 7},
              {2005, 0, 7}, {2005, 0, 7}, {2005, 0, 7},
            /* FirstDayOfWeek = Monday */
              {2004,11,31}, {2004,11,31}, {2005, 0, 7}, {2005, 0, 7},
              {2005, 0, 7}, {2005, 0, 7}, {2005, 0, 7},
            /* FirstDayOfWeek = Tuesday */
              {2004,11,31}, {2004,11,31}, {2004,11,31}, {2005, 0, 7},
              {2005, 0, 7}, {2005, 0, 7}, {2005, 0, 7},
            /* FirstDayOfWeek = Wednesday */
              {2004,11,31}, {2004,11,31}, {2004,11,31}, {2004,11,31},
              {2005, 0, 7}, {2005, 0, 7}, {2005, 0, 7},
            /* FirstDayOfWeek = Thursday */
              {2004,11,31}, {2004,11,31}, {2004,11,31}, {2004,11,31},
              {2004,11,31}, {2005, 0, 7}, {2005, 0, 7},
            /* FirstDayOfWeek = Friday */
              {2004,11,31}, {2004,11,31}, {2004,11,31}, {2004,11,31},
              {2004,11,31}, {2004,11,31}, {2005, 0, 7},
            /* FirstDayOfWeek = Saturday */
              {2005, 0, 7}, {2005, 0, 7}, {2005, 0, 7}, {2005, 0, 7},
              {2005, 0, 7}, {2005, 0, 7}, {2005, 0, 7},
        },
        { /* For year2006 */
            /* FirstDayOfWeek = Sunday */
              {2006, 0, 6}, {2006, 0, 6}, {2006, 0, 6}, {2006, 0, 6},
              {2006, 0, 6}, {2006, 0, 6}, {2006, 0, 6},
            /* FirstDayOfWeek = Monday */
              {2005,11,30}, {2006, 0, 6}, {2006, 0, 6}, {2006, 0, 6},
              {2006, 0, 6}, {2006, 0, 6}, {2006, 0, 6},
            /* FirstDayOfWeek = Tuesday */
              {2005,11,30}, {2005,11,30}, {2006, 0, 6}, {2006, 0, 6},
              {2006, 0, 6}, {2006, 0, 6}, {2006, 0, 6},
            /* FirstDayOfWeek = Wednesday */
              {2005,11,30}, {2005,11,30}, {2005,11,30}, {2006, 0, 6},
              {2006, 0, 6}, {2006, 0, 6}, {2006, 0, 6},
            /* FirstDayOfWeek = Thursday */
              {2005,11,30}, {2005,11,30}, {2005,11,30}, {2005,11,30},
              {2006, 0, 6}, {2006, 0, 6}, {2006, 0, 6},
            /* FirstDayOfWeek = Friday */
              {2005,11,30}, {2005,11,30}, {2005,11,30}, {2005,11,30},
              {2005,11,30}, {2006, 0, 6}, {2006, 0, 6},
            /* FirstDayOfWeek = Saturday */
              {2006, 0, 6}, {2006, 0, 6}, {2006, 0, 6}, {2006, 0, 6},
              {2006, 0, 6}, {2006, 0, 6}, {2006, 0,13},
        }
    };

    static final int[][] resultWOYForSetTest2 = {
          /* Min =    1       2       3       4       5       6       7  */
          /* Sun */ {4,25}, {5, 1}, {5, 1}, {5, 1}, {5, 1}, {5, 1}, {5, 1},
          /* Mon */ {4,25}, {4,25}, {5, 1}, {5, 1}, {5, 1}, {5, 1}, {5, 1},
          /* Tue */ {4,25}, {4,25}, {4,25}, {5, 1}, {5, 1}, {5, 1}, {5, 1},
          /* Wed */ {4,25}, {4,25}, {4,25}, {4,25}, {5, 1}, {5, 1}, {5, 1},
          /* Thu */ {5, 1}, {5, 1}, {5, 1}, {5, 1}, {5, 1}, {5, 8}, {5, 8},
          /* Fri */ {5, 1}, {5, 1}, {5, 1}, {5, 1}, {5, 1}, {5, 1}, {5, 8},
          /* Sat */ {5, 1}, {5, 1}, {5, 1}, {5, 1}, {5, 1}, {5, 1}, {5, 1},
    };

    /**
     * Test for set()
     */
    void testSet() {
        boolean noerror = true;
        Calendar cal = Calendar.getInstance();
        int sYear=1998;
        int eYear=2006;

        // Loop for FirstDayOfWeek: SUNDAY..SATURDAY
        for (int dow = SUNDAY; dow <= SATURDAY; dow++) {

            // Loop for MinimalDaysInFirstWeek: 1..7
            for (int minDow = 1; minDow <= 7; minDow++) {
                int index = (dow-1)*7 + (minDow-1);

                cal.clear();
                cal.setLenient(true);
                cal.setMinimalDaysInFirstWeek(minDow);
                cal.setFirstDayOfWeek(dow);
                cal.set(YEAR, 2005);
                cal.set(DAY_OF_WEEK, WEDNESDAY);
                cal.set(WEEK_OF_YEAR, 22);

                int y = 2005;
                int m = resultWOYForSetTest2[index][0];
                int d = resultWOYForSetTest2[index][1];
                int year = cal.get(YEAR);
                int month = cal.get(MONTH);
                int date = cal.get(DATE);

                if (cal.get(WEEK_OF_YEAR) != 22) {
                    noerror = false;
                    errln("Failed : set(WEEK_OF_YEAR=22)" +
                          " *** get(WEEK_OF_YEAR=" +
                          cal.get(WEEK_OF_YEAR) + ")" +
                          ", got " + (month+1)+"/"+date+"/"+year +
                          ", expected " + (m+1)+"/"+d+"/"+2005 +
                          ", MinFirstDOW=" + minDow +
                          ", FirstDOW=" + dow);
                } else if ((year != y) || (month != m) || (date != d)) {
                    noerror = false;
                    errln("Failed : set(WEEK_OF_YEAR=22)" +
                          " got " + (month+1)+"/"+date+"/"+year +
                          ", expected " + (m+1)+"/"+d+"/"+y +
                          ", MinFirstDOW=" + minDow +
                          ", FirstDOW=" + dow);
                }

                for (int targetYear = sYear; targetYear<= eYear; targetYear++) {
                    cal.clear();
                    cal.setLenient(true);
                    cal.setMinimalDaysInFirstWeek(minDow);
                    cal.setFirstDayOfWeek(dow);
                    cal.set(YEAR, targetYear);
                    cal.set(DAY_OF_WEEK, FRIDAY);
                    cal.set(MONTH, DECEMBER);
                    cal.set(WEEK_OF_MONTH, 1);

                    y = targetYear;
                    m = resultWOMForSetTest[targetYear-sYear][index][0];
                    d = resultWOMForSetTest[targetYear-sYear][index][1];
                    year = cal.get(YEAR);
                    month = cal.get(MONTH);
                    date = cal.get(DATE);

                    if ((year != y) || (month != m) || (date != d)) {
                        noerror = false;
                        errln("Failed : set(WEEK_OF_MONTH=1)" +
                              " got " + (month+1)+"/"+date+"/"+year +
                              ", expected " + (m+1)+"/"+d+"/"+y +
                              ", MinFirstDOW=" + minDow +
                              ", FirstDOW=" + dow);
                    }

                    cal.clear();
                    cal.setLenient(true);
                    cal.setMinimalDaysInFirstWeek(minDow);
                    cal.setFirstDayOfWeek(dow);
                    cal.set(YEAR, targetYear);
                    cal.set(DAY_OF_WEEK, FRIDAY);
                    cal.set(WEEK_OF_YEAR, 1);

                    y = resultWOYForSetTest1[targetYear-sYear][index][0];
                    m = resultWOYForSetTest1[targetYear-sYear][index][1];
                    d = resultWOYForSetTest1[targetYear-sYear][index][2];
                    year = cal.get(YEAR);
                    month = cal.get(MONTH);
                    date = cal.get(DATE);

                    if (cal.get(WEEK_OF_YEAR) != 1) {
                        noerror = false;
                        errln("Failed : set(WEEK_OF_YEAR=1)" +
                              " *** get(WEEK_OF_YEAR=" +
                              cal.get(WEEK_OF_YEAR) + ")" +
                              ", got " + (month+1)+"/"+date+"/"+year +
                              ", expected " + (m+1)+"/"+d+"/"+y +
                              ", MinFirstDOW=" + minDow +
                              ", FirstDOW=" + dow);
                    } else if ((year != y) || (month != m) || (date != d)) {
                        noerror = false;
                        errln("Failed : set(WEEK_OF_YEAR=1)" +
                              " got " + (month+1)+"/"+date+"/"+year +
                              ", expected " + (m+1)+"/"+d+"/"+y +
                              ", MinFirstDOW=" + minDow +
                              ", FirstDOW=" + dow);
                    }
                }
            }
        }

        if (noerror) {
            logln("Passed : set() test");
        }
    }

    /**
     * Test for add()
     */
    void testAdd() {
        boolean noerror = true;
        Calendar cal = Calendar.getInstance();

        // Loop for FirstDayOfWeek: SUNDAY..SATURDAY
        for (int dow = SUNDAY; dow <= SATURDAY; dow++) {

            // Loop for MinimalDaysInFirstWeek: 1..7
            for (int minDow = 1; minDow <= 7; minDow++) {
                int oldWOY, newWOY;

                cal.clear();
                cal.setLenient(true);
                cal.setMinimalDaysInFirstWeek(minDow);
                cal.setFirstDayOfWeek(dow);
                cal.set(2005, DECEMBER, 7);
                oldWOY = cal.get(WEEK_OF_YEAR);

                for (int cnt = 0; cnt < 7; cnt++) {
                    cal.add(WEEK_OF_YEAR, 1);
                }

                int year = cal.get(YEAR);
                int month = cal.get(MONTH);
                int date = cal.get(DATE);

                if ((year != 2006) || (month != 0) || (date != 25)) {
                    noerror = false;
                    errln("Failed : add(WEEK_OF_YEAR+1)" +
                          " got " + (month+1)+"/"+date+"/"+year +
                          ", expected 1/25/2006" +
                          ", MinFirstDOW=" + minDow +
                          ", FirstDOW=" + dow);
                }

                for (int cnt = 0; cnt < 10; cnt++) {
                    cal.add(WEEK_OF_YEAR, -1);
                }
                newWOY = cal.get(WEEK_OF_YEAR);

                year = cal.get(YEAR);
                month = cal.get(MONTH);
                date = cal.get(DATE);

                if ((oldWOY - newWOY) != 3) {
                    errln("Failed : add(WEEK_OF_YEAR-1)" +
                          " got " + (month+1)+"/"+date+"/"+year +
                          ", expected 11/16/2005" +
                          ", MinFirstDOW=" + minDow +
                          ", FirstDOW=" + dow +
                          ", WEEK_OF_YEAR=" + newWOY +
                          " should be " + (oldWOY-3));
                } else if ((year != 2005) || (month != 10) || (date != 16)) {
                    errln("Failed : add(-1)" +
                          " got " + (month+1)+"/"+date+"/"+year +
                          ", expected 11/16/2005" +
                          ", MinFirstDOW=" + minDow +
                          ", FirstDOW=" + dow);
                }
            }
        }

        if (noerror) {
            logln("Passed : add() test");
        }
    }

    /*
     * Golden data for roll() test
     */
    static final int[] resultWOMForRollTest = {
          /* Min =    1   2   3   4   5   6   7  */
          /* Sun */   1,  1,  1, 26, 26, 26, 26,
          /* Mon */   1,  1,  1,  1, 26, 26, 26,
          /* Tue */  31, 31, 31, 31, 31, 24, 24,
          /* Wed */  31, 31, 31, 31, 31, 31, 24,
          /* Thu */  31, 31, 31, 31, 31, 31, 31,
          /* Fri */   1, 31, 31, 31, 31, 31, 31,
          /* Sat */   1,  1, 31, 31, 31, 31, 31,
    };

    static final int[][] resultWOYForRollTest = {
          /* Min =    1       2       3       4       5       6       7  */
          /* Sun */ {0,26}, {0,26}, {0,26}, {0,26}, {0,26}, {0,26}, {0,26},
          /* Mon */ {1, 2}, {0,26}, {0,26}, {0,26}, {0,26}, {0,26}, {0,26},
          /* Tue */ {1, 2}, {1, 2}, {0,26}, {0,26}, {0,26}, {0,26}, {0,26},
          /* Wed */ {1, 2}, {1, 2}, {1, 2}, {0,26}, {0,26}, {0,26}, {0,26},
          /* Thu */ {0,26}, {0,26}, {0,26}, {0,26}, {0,26}, {1, 2}, {1, 2},
          /* Fri */ {0,26}, {0,26}, {0,26}, {0,26}, {0,26}, {0,26}, {1, 2},
          /* Sat */ {0,26}, {0,26}, {0,26}, {0,26}, {0,26}, {0,26}, {0,26},
    };

    /**
     * Test for roll()
     */
    void testRoll() {
        boolean noerror = true;
        Calendar cal = Calendar.getInstance();

        // Loop for FirstDayOfWeek: SUNDAY..SATURDAY
        for (int dow = SUNDAY; dow <= SATURDAY; dow++) {

            // Loop for MinimalDaysInFirstWeek: 1..7
            for (int minDow = 1; minDow <= 7; minDow++) {
                int oldWOY, newWOY;
                int index = (dow-1)*7 + (minDow-1);

                cal.clear();
                cal.setLenient(true);
                cal.setMinimalDaysInFirstWeek(minDow);
                cal.setFirstDayOfWeek(dow);
                cal.set(2005, DECEMBER, 12);
                oldWOY = cal.get(WEEK_OF_YEAR);
                for (int cnt = 0; cnt < 2; cnt++) {
                    cal.roll(WEEK_OF_MONTH, -1);
                }
                int y = 2005;
                int m = DECEMBER;
                int d = resultWOMForRollTest[index];
                int year = cal.get(YEAR);
                int month = cal.get(MONTH);
                int date = cal.get(DATE);

                if ((year != y) || (month != m) || (date != d)) {
                    noerror = false;
                    errln("Failed : roll(WEEK_OF_MONTH-1)" +
                          " got " + (month+1) + "/" + date + "/" + year +
                          ", expected " + (m+1) + "/" + d + "/" + y +
                          ", MinFirstDOW=" + minDow +
                          ", FirstDOW=" + dow);
                }

                cal.clear();
                cal.setLenient(true);
                cal.setMinimalDaysInFirstWeek(minDow);
                cal.setFirstDayOfWeek(dow);
                cal.set(2005, DECEMBER, 7);
                oldWOY = cal.get(WEEK_OF_YEAR);

                for (int cnt = 0; cnt < 7; cnt++) {
                    cal.roll(WEEK_OF_YEAR, 1);
                }

                y = 2005;
                m = resultWOYForRollTest[index][0];
                d = resultWOYForRollTest[index][1];
                year = cal.get(YEAR);
                month = cal.get(MONTH);
                date = cal.get(DATE);

                if ((year != y) || (month != m) || (date != d)) {
                    noerror = false;
                    errln("Failed : roll(WEEK_OF_YEAR+1)" +
                          " got " + (month+1) + "/" + date + "/" + year +
                          ", expected " + (m+1) + "/" + d + "/" + y +
                          ", MinFirstDOW=" + minDow +
                          ", FirstDOW=" + dow);
                }

                for (int cnt = 0; cnt < 10; cnt++) {
                    cal.roll(WEEK_OF_YEAR, -1);
                }
                newWOY = cal.get(WEEK_OF_YEAR);

                y = 2005;
                m = NOVEMBER;
                d = 16;
                year = cal.get(YEAR);
                month = cal.get(MONTH);
                date = cal.get(DATE);

                if ((year != y) || (month != m) || (date != d)) {
                    noerror = false;
                    errln("Failed : roll(WEEK_OF_YEAR-1)" +
                          " got " + (month+1)+"/"+date+"/"+year +
                          ", expected " + (m+1)+"/"+d+"/"+y +
                          ", MinFirstDOW=" + minDow +
                          ", FirstDOW=" + dow);
                }
            }
        }

        if (noerror) {
            logln("Passed : roll() test");
        }
    }
}