| /* | |
| * 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())); | |
| } | |
| } | |
| } |