| /* |
| * Copyright (c) 2003, 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 4817812 4847186 4956227 4956479 |
| * @summary Confirm that BuddhistCalendar's add(), roll() and toString() work correctly with Buddhist Era years. |
| */ |
| |
| import java.util.Calendar; |
| import java.util.GregorianCalendar; |
| import java.util.Locale; |
| import static java.util.Calendar.*; |
| |
| public class BuddhistCalendarTest { |
| |
| private static final Locale THAI_LOCALE = new Locale("th", "TH"); |
| |
| public static void main(String[] args) { |
| testAddRoll(); |
| testToString(); |
| testException(); |
| testLeastMax(); |
| } |
| |
| /** |
| * 4817812 |
| */ |
| static void testAddRoll() { |
| Calendar cal; |
| int base, year; |
| |
| /* |
| * Test: BuddhistCalendar.add(YEAR) |
| */ |
| cal = getBuddhistCalendar(); |
| base = cal.get(YEAR); |
| cal.add(YEAR, 1); |
| year = cal.get(YEAR); |
| check(year, base+1, "add(+YEAR)"); |
| |
| cal = getBuddhistCalendar(); |
| base = cal.get(YEAR); |
| cal.add(YEAR, -3); |
| year = cal.get(YEAR); |
| check(year, base-3, "add(-YEAR)"); |
| |
| /* |
| * Test BuddhistCalendar.add(MONTH) |
| */ |
| cal = getBuddhistCalendar(); |
| base = cal.get(YEAR); |
| cal.set(MONTH, DECEMBER); |
| cal.add(MONTH, 2); |
| year = cal.get(YEAR); |
| check(year, base+1, "add(+MONTH)"); |
| |
| cal = getBuddhistCalendar(); |
| base = cal.get(YEAR); |
| cal.set(MONTH, FEBRUARY); |
| cal.add(MONTH, -4); |
| year = cal.get(YEAR); |
| check(year, base-1, "add(-MONTH)"); |
| |
| /* |
| * Test BuddhistCalendar.roll(YEAR) |
| */ |
| cal = getBuddhistCalendar(); |
| base = cal.get(YEAR); |
| cal.roll(YEAR, 2); |
| year = cal.get(YEAR); |
| check(year, base+2, "roll(+YEAR)"); |
| |
| cal = getBuddhistCalendar(); |
| base = cal.get(YEAR); |
| cal.roll(YEAR, -4); |
| year = cal.get(YEAR); |
| check(year, base-4, "roll(-YEAR)"); |
| |
| /* |
| * Test BuddhistCalendar.roll(WEEK_OF_YEAR) |
| */ |
| cal = getBuddhistCalendar(); |
| cal.set(YEAR, 2543); // A.D.2000 |
| cal.set(MONTH, DECEMBER); |
| cal.set(DATE, 31); |
| base = cal.get(YEAR); |
| check(base, 2543, "roll(+WEEK_OF_YEAR)"); |
| cal.roll(WEEK_OF_YEAR, 10); |
| year = cal.get(YEAR); |
| check(year, base, "roll(+WEEK_OF_YEAR)"); |
| |
| cal = getBuddhistCalendar(); |
| cal.set(YEAR, 2543); // A.D.2000 |
| cal.set(MONTH, JANUARY); |
| cal.set(DATE, 1); |
| base = cal.get(YEAR); |
| check(base, 2543, "roll(+WEEK_OF_YEAR)"); |
| cal.roll(WEEK_OF_YEAR, -10); |
| year = cal.get(YEAR); |
| check(year, base, "roll(-WEEK_OF_YEAR)"); |
| |
| /* |
| * Test Calendar.set(year, month, date) |
| */ |
| cal = getBuddhistCalendar(); |
| base = cal.get(YEAR); |
| cal.set(3001, APRIL, 10); |
| year = cal.get(YEAR); |
| check(year, 3001, "set(year, month, date)"); |
| |
| /* |
| * Test Calendar.set(year, month, date, hour, minute) |
| */ |
| cal = getBuddhistCalendar(); |
| base = cal.get(YEAR); |
| cal.set(3020, MAY, 20, 9, 10); |
| year = cal.get(YEAR); |
| check(year, 3020, "set(year, month, date, hour, minute)"); |
| |
| /* |
| * Test Calendar.set(year, month, date, hour, minute, second) |
| */ |
| cal = getBuddhistCalendar(); |
| base = cal.get(YEAR); |
| cal.set(3120, MAY, 20, 9, 10, 52); |
| year = cal.get(YEAR); |
| check(year, 3120, "set(year, month, date, hour, minute, second)"); |
| |
| /* |
| * Test BuddhistCalendar.getActualMaximum(YEAR); |
| * set(YEAR)/get(YEAR) in this method doesn't affect the real |
| * YEAR value because a clone is used with set()&get(). |
| */ |
| cal = getBuddhistCalendar(); |
| base = cal.get(YEAR); |
| int limit = cal.getActualMaximum(YEAR); |
| year = cal.get(YEAR); |
| check(year, base, "BuddhistCalendar.getActualMaximum(YEAR)"); |
| |
| /* |
| * Test BuddhistCalendar.getActualMinimum(YEAR); |
| * This doesn't call set(YEAR) nor get(YEAR), though. |
| */ |
| cal = getBuddhistCalendar(); |
| base = cal.get(YEAR); |
| limit = cal.getActualMinimum(YEAR); |
| year = cal.get(YEAR); |
| check(year, base, "BuddhistCalendar.getActualMinimum(YEAR)"); |
| } |
| |
| /** |
| * 4847186: BuddhistCalendar: toString() returns Gregorian year |
| */ |
| static void testToString() { |
| Calendar cal = getBuddhistCalendar(); |
| int year = cal.get(YEAR); |
| String s = cal.toString(); |
| String y = s.replaceAll(".+,YEAR=(\\d+),.+", "$1"); |
| if (Integer.parseInt(y) != year) { |
| throw new RuntimeException("toString(): wrong year value: got " + y |
| + ", expected " + year); |
| } |
| } |
| |
| /** |
| * 4956479: BuddhistCalendar methods may return wrong values after exception |
| */ |
| static void testException() { |
| Calendar cal = getBuddhistCalendar(); |
| int year = cal.get(YEAR); |
| boolean exceptionOccurred = false; |
| try { |
| cal.add(100, +1); // cause exception |
| } catch (Exception e) { |
| exceptionOccurred = true; |
| } |
| if (!exceptionOccurred) { |
| throw new RuntimeException("testException: test case failed: no exception thrown"); |
| } |
| int year2 = cal.get(YEAR); |
| if (year2 != year) { |
| throw new RuntimeException("wrong year value after exception: got " + year2 |
| + ", expected " + year); |
| } |
| } |
| |
| /** |
| * 4956227: getLeastMaximum(WEEK_OF_MONTH) return diff. val. for Greg. and Buddhist Calendar |
| */ |
| static void testLeastMax() { |
| Calendar bc = getBuddhistCalendar(); |
| // Specify THAI_LOCALE to get the same params for WEEK |
| // calculations (6904680). |
| Calendar gc = new GregorianCalendar(THAI_LOCALE); |
| for (int f = 0; f < Calendar.FIELD_COUNT; f++) { |
| if (f == ERA || f == YEAR) { |
| continue; |
| } |
| int bn = bc.getLeastMaximum(f); |
| int gn = gc.getLeastMaximum(f); |
| if (bn != gn) { |
| throw new RuntimeException("inconsistent Least Max value for " + Koyomi.getFieldName(f) |
| + ": Buddhist=" + bn |
| + ": Gregorian=" + gn); |
| } |
| } |
| } |
| |
| /** |
| * @return a BuddhistCalendar |
| */ |
| static Calendar getBuddhistCalendar() { |
| return Calendar.getInstance(THAI_LOCALE); |
| } |
| |
| static void check(int got, int expected, String s) { |
| if (got != expected) { |
| throw new RuntimeException("Failed: " + |
| s + ": got:" + got + ", expected:" + expected); |
| } |
| } |
| } |