/* * Copyright (c) 2007, 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 6452848 * @summary Make sure that the resolution of (WEKK_OF_MONTH + * DAY_OF_WEEK) and (DAY_OF_WEEK_IN_MONTH + DAY_OF_WEEK) works as * specified in the API. * @key randomness */ import java.util.*; import static java.util.Calendar.*; public class ResolutionTest { static Random rand = new Random(); public static void main(String[] args) { for (int year = 1995; year < 2011; year++) { for (int month = JANUARY; month <= DECEMBER; month++) { for (int dow = SUNDAY; dow <= SATURDAY; dow++) { test(year, month, dow); } } } } static void test(int year, int month, int dow) { Calendar cal = new GregorianCalendar(year, month, 1); int max = cal.getActualMaximum(DAY_OF_MONTH); ArrayList<Integer> list = new ArrayList<Integer>(); for (int d = 1; d <= max; d++) { cal.clear(); cal.set(year, month, d); if (cal.get(DAY_OF_WEEK) == dow) { list.add(d); } } for (int i = 0; i < 100; i++) { int nth = rand.nextInt(list.size()); // 0-based int day = list.get(nth); nth++; // 1-based testDayOfWeekInMonth(year, month, nth, dow, day); } // Put WEEK_OF_MONTH-DAY_OF_MONTH pairs list = new ArrayList<Integer>(); for (int d = 1; d <= max; d++) { cal.clear(); cal.set(year, month, d); if (cal.get(DAY_OF_WEEK) == dow) { list.add(cal.get(WEEK_OF_MONTH)); list.add(d); } } for (int i = 0; i < list.size(); i++) { int nth = list.get(i++); int day = list.get(i); testWeekOfMonth(year, month, nth, dow, day); } } static Koyomi cal = new Koyomi(); static void testDayOfWeekInMonth(int year, int month, int nth, int dow, int expected) { // don't call clear() here cal.set(YEAR, year); cal.set(MONTH, month); // Set DAY_OF_WEEK_IN_MONTH before DAY_OF_WEEK cal.set(DAY_OF_WEEK_IN_MONTH, nth); cal.set(DAY_OF_WEEK, dow); if (!cal.checkDate(year, month, expected)) { throw new RuntimeException(String.format("DOWIM: year=%d, month=%d, nth=%d, dow=%d:%s%n", year, month+1, nth, dow, cal.getMessage())); } } static void testWeekOfMonth(int year, int month, int nth, int dow, int expected) { // don't call clear() here cal.set(YEAR, year); cal.set(MONTH, month); // Set WEEK_OF_MONTH before DAY_OF_WEEK cal.set(WEEK_OF_MONTH, nth); cal.set(DAY_OF_WEEK, dow); if (!cal.checkDate(year, month, expected)) { throw new RuntimeException(String.format("WOM: year=%d, month=%d, nth=%d, dow=%d:%s%n", year, month+1, nth, dow, cal.getMessage())); } } }