diff options
Diffstat (limited to 'test/java/util/Calendar/ResolutionTest.java')
-rw-r--r-- | test/java/util/Calendar/ResolutionTest.java | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/test/java/util/Calendar/ResolutionTest.java b/test/java/util/Calendar/ResolutionTest.java new file mode 100644 index 0000000000..98356131b0 --- /dev/null +++ b/test/java/util/Calendar/ResolutionTest.java @@ -0,0 +1,111 @@ +/* + * 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())); + } + } +} |