2 *******************************************************************************
\r
3 * Copyright (C) 1996-2010, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
7 package com.ibm.icu.dev.test.calendar;
\r
9 import java.util.Date;
\r
10 import java.util.Locale;
\r
12 import com.ibm.icu.dev.test.TestFmwk;
\r
13 import com.ibm.icu.impl.LocaleUtility;
\r
14 import com.ibm.icu.util.Calendar;
\r
15 import com.ibm.icu.util.EasterHoliday;
\r
16 import com.ibm.icu.util.GregorianCalendar;
\r
17 import com.ibm.icu.util.Holiday;
\r
18 import com.ibm.icu.util.RangeDateRule;
\r
19 import com.ibm.icu.util.SimpleDateRule;
\r
20 import com.ibm.icu.util.SimpleHoliday;
\r
21 import com.ibm.icu.util.ULocale;
\r
24 * Tests for the <code>Holiday</code> class.
\r
26 public class HolidayTest extends TestFmwk {
\r
27 public static void main(String args[]) throws Exception {
\r
28 new HolidayTest().run(args);
\r
30 protected void init()throws Exception{
\r
32 cal = new GregorianCalendar(1, 0, 1);
\r
33 longTimeAgo = cal.getTime();
\r
37 static Calendar cal;
\r
38 static Date longTimeAgo;
\r
40 static long awhile = 3600L * 24 * 28; // 28 days
\r
42 public void TestAPI() {
\r
45 Holiday[] holidays = Holiday.getHolidays();
\r
46 exerciseHolidays(holidays, Locale.getDefault());
\r
50 // getHolidays(Locale)
\r
51 String[] localeNames =
\r
77 for (int i = 0; i < localeNames.length; ++i) {
\r
78 Locale locale = LocaleUtility.getLocaleFromName(localeNames[i]);
\r
79 Holiday[] holidays = Holiday.getHolidays(locale);
\r
80 exerciseHolidays(holidays, locale);
\r
85 void exerciseHolidays(Holiday[] holidays, Locale locale) {
\r
86 for (int i = 0; i < holidays.length; ++i) {
\r
87 exerciseHoliday(holidays[i], locale);
\r
91 void exerciseHoliday(Holiday h, Locale locale) {
\r
92 logln("holiday: " + h.getDisplayName());
\r
93 logln("holiday in " + locale + ": " + h.getDisplayName(locale));
\r
95 Date first = h.firstAfter(longTimeAgo);
\r
96 logln("firstAfter: " + longTimeAgo + " is " + first);
\r
97 if (first == null) {
\r
98 first = longTimeAgo;
\r
100 first.setTime(first.getTime() + awhile);
\r
102 Date second = h.firstBetween(first, now);
\r
103 logln("firstBetween: " + first + " and " + now + " is " + second);
\r
104 if (second == null) {
\r
108 logln("is on " + first + ": " + h.isOn(first));
\r
109 logln("is on " + now + ": " + h.isOn(now));
\r
116 + h.isBetween(first, now));
\r
123 + h.isBetween(first, second));
\r
125 // logln("rule: " + h.getRule().toString());
\r
127 // h.setRule(h.getRule());
\r
130 public void TestCoverage(){
\r
131 Holiday[] h = { new EasterHoliday("Ram's Easter"),
\r
132 new SimpleHoliday(2, 29, 0, "Leap year", 1900, 2100)};
\r
133 exerciseHolidays(h, Locale.getDefault());
\r
135 RangeDateRule rdr = new RangeDateRule();
\r
136 rdr.add(new SimpleDateRule(7, 10));
\r
137 Date mbd = getDate(1953, Calendar.JULY, 10);
\r
138 Date dbd = getDate(1958, Calendar.AUGUST, 15);
\r
139 Date nbd = getDate(1990, Calendar.DECEMBER, 17);
\r
140 Date abd = getDate(1992, Calendar.SEPTEMBER, 16);
\r
141 Date xbd = getDate(1976, Calendar.JULY, 4);
\r
142 Date ybd = getDate(2003, Calendar.DECEMBER, 8);
\r
143 rdr.add(new SimpleDateRule(Calendar.JULY, 10, Calendar.MONDAY, false));
\r
144 rdr.add(dbd, new SimpleDateRule(Calendar.AUGUST, 15, Calendar.WEDNESDAY, true));
\r
145 rdr.add(xbd, null);
\r
146 rdr.add(nbd, new SimpleDateRule(Calendar.DECEMBER, 17, Calendar.MONDAY, false));
\r
147 rdr.add(ybd, null);
\r
149 logln("first after " + mbd + " is " + rdr.firstAfter(mbd));
\r
150 logln("first between " + mbd + " and " + dbd + " is " + rdr.firstBetween(mbd, dbd));
\r
151 logln("first between " + dbd + " and " + nbd + " is " + rdr.firstBetween(dbd, nbd));
\r
152 logln("first between " + nbd + " and " + abd + " is " + rdr.firstBetween(nbd, abd));
\r
153 logln("first between " + abd + " and " + xbd + " is " + rdr.firstBetween(abd, xbd));
\r
154 logln("first between " + abd + " and " + null + " is " + rdr.firstBetween(abd, null));
\r
155 logln("first between " + xbd + " and " + null + " is " + rdr.firstBetween(xbd, null));
\r
158 logln("The rule in the holiday: " + h[1].getRule());
\r
159 exerciseHoliday(h[1], Locale.getDefault());
\r
161 logln("Set the new rule to the SimpleHoliday ...");
\r
162 if (!rdr.equals(h[1].getRule())) {
\r
163 errln("FAIL: getRule and setRule not matched.");
\r
165 exerciseHoliday(h[1], Locale.getDefault());
\r
168 public void TestIsOn() {
\r
170 SimpleHoliday sh = new SimpleHoliday(Calendar.AUGUST, 15, "Doug's Day", 1958, 2058);
\r
172 Calendar gcal = new GregorianCalendar();
\r
174 gcal.set(Calendar.YEAR, 2000);
\r
175 gcal.set(Calendar.MONTH, Calendar.AUGUST);
\r
176 gcal.set(Calendar.DAY_OF_MONTH, 15);
\r
178 Date d0 = gcal.getTime();
\r
179 gcal.add(Calendar.SECOND, 1);
\r
180 Date d1 = gcal.getTime();
\r
181 gcal.add(Calendar.SECOND, -2);
\r
182 Date d2 = gcal.getTime();
\r
183 gcal.add(Calendar.DAY_OF_MONTH, 1);
\r
184 Date d3 = gcal.getTime();
\r
185 gcal.add(Calendar.SECOND, 1);
\r
186 Date d4 = gcal.getTime();
\r
187 gcal.add(Calendar.SECOND, -2);
\r
188 gcal.set(Calendar.YEAR, 1957);
\r
189 Date d5 = gcal.getTime();
\r
190 gcal.set(Calendar.YEAR, 1958);
\r
191 Date d6 = gcal.getTime();
\r
192 gcal.set(Calendar.YEAR, 2058);
\r
193 Date d7 = gcal.getTime();
\r
194 gcal.set(Calendar.YEAR, 2059);
\r
195 Date d8 = gcal.getTime();
\r
197 Date[] dates = { d0, d1, d2, d3, d4, d5, d6, d7, d8 };
\r
198 boolean[] isOns = { true, true, false, true, false, false, true, true, false };
\r
199 for (int i = 0; i < dates.length; ++i) {
\r
201 logln("\ndate: " + d);
\r
202 boolean isOn = sh.isOn(d);
\r
203 logln("isOnDate: " + isOn);
\r
204 if (isOn != isOns[i]) {
\r
205 errln("date: " + d + " should be on Doug's Day!");
\r
207 Date h = sh.firstAfter(d);
\r
208 logln("firstAfter: " + h);
\r
212 public void TestDisplayName() {
\r
213 Holiday[] holidays = Holiday.getHolidays(ULocale.US);
\r
214 for (int i = 0; i < holidays.length; ++i) {
\r
215 Holiday h = holidays[i];
\r
216 // only need to test one
\r
217 // if the display names differ, we're using our data. We know these names
\r
218 // should differ for this holiday (not all will).
\r
219 if ("Christmas".equals(h.getDisplayName(ULocale.US))) {
\r
220 if ("Christmas".equals(h.getDisplayName(ULocale.GERMANY))) {
\r
221 errln("Using default name for holidays");
\r