blob: 9a6197fd3593bf3b97058214dd1fc01753cbb0e7 [file] [log] [blame]
/*
*******************************************************************************
* Copyright (C) 1996-2014, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*/
package com.ibm.icu.dev.test.calendar;
import java.util.Date;
import java.util.Locale;
import com.ibm.icu.dev.test.TestFmwk;
import com.ibm.icu.impl.LocaleUtility;
import com.ibm.icu.util.Calendar;
import com.ibm.icu.util.EasterHoliday;
import com.ibm.icu.util.GregorianCalendar;
import com.ibm.icu.util.Holiday;
import com.ibm.icu.util.RangeDateRule;
import com.ibm.icu.util.SimpleDateRule;
import com.ibm.icu.util.SimpleHoliday;
import com.ibm.icu.util.TimeZone;
import com.ibm.icu.util.ULocale;
/**
* Tests for the <code>Holiday</code> class.
*/
public class HolidayTest extends TestFmwk {
public static void main(String args[]) throws Exception {
new HolidayTest().run(args);
}
protected void init()throws Exception{
if(cal==null){
cal = new GregorianCalendar(1, 0, 1);
longTimeAgo = cal.getTime();
now = new Date();
}
}
static Calendar cal;
static Date longTimeAgo;
static Date now;
static long awhile = 3600L * 24 * 28; // 28 days
public void TestAPI() {
{
// getHolidays
Holiday[] holidays = Holiday.getHolidays();
exerciseHolidays(holidays, Locale.getDefault());
}
{
// getHolidays(Locale)
String[] localeNames =
{
"en_US",
"da",
"da_DK",
"de",
"de_AT",
"de_DE",
"el",
"el_GR",
"en",
"en_CA",
"en_GB",
"es",
"es_MX",
"fr",
"fr_CA",
"fr_FR",
"it",
"it_IT",
"iw",
"iw_IL",
"ja",
"ja_JP",
};
for (int i = 0; i < localeNames.length; ++i) {
Locale locale = LocaleUtility.getLocaleFromName(localeNames[i]);
Holiday[] holidays = Holiday.getHolidays(locale);
exerciseHolidays(holidays, locale);
}
}
}
void exerciseHolidays(Holiday[] holidays, Locale locale) {
for (int i = 0; i < holidays.length; ++i) {
exerciseHoliday(holidays[i], locale);
}
}
void exerciseHoliday(Holiday h, Locale locale) {
logln("holiday: " + h.getDisplayName());
logln("holiday in " + locale + ": " + h.getDisplayName(locale));
Date first = h.firstAfter(longTimeAgo);
logln("firstAfter: " + longTimeAgo + " is " + first);
if (first == null) {
first = longTimeAgo;
}
first.setTime(first.getTime() + awhile);
Date second = h.firstBetween(first, now);
logln("firstBetween: " + first + " and " + now + " is " + second);
if (second == null) {
second = now;
} else {
if(second.after(now)) {
errln("Error: "+h.getDisplayName()+".firstBetween("+first+", "+now+")="+second);
}
}
logln("is on " + first + ": " + h.isOn(first));
logln("is on " + now + ": " + h.isOn(now));
logln(
"is between "
+ first
+ " and "
+ now
+ ": "
+ h.isBetween(first, now));
logln(
"is between "
+ first
+ " and "
+ second
+ ": "
+ h.isBetween(first, second));
// logln("rule: " + h.getRule().toString());
// h.setRule(h.getRule());
logln("HolidayCalendarDemo test");
{
final Calendar c = Calendar.getInstance(TimeZone.GMT_ZONE); // Temporary copy
c.set(2014, 10, 8); // when this test was hit
final Date fStartOfMonth = startOfMonth((Calendar)c.clone());
// Stash away a few useful constants for this calendar and display
//minDay = c.getMinimum(Calendar.DAY_OF_WEEK);
//daysInWeek = c.getMaximum(Calendar.DAY_OF_WEEK) - minDay + 1;
//firstDayOfWeek = Calendar.getInstance(fDisplayLocale).getFirstDayOfWeek();
// Stash away a Date for the start of this month
// Find the day of week of the first day in this month
c.setTime(fStartOfMonth);
//firstDayInMonth = c.get(Calendar.DAY_OF_WEEK);
// Now find the # of days in the month
c.roll(Calendar.DATE, false);
final int daysInMonth = c.get(Calendar.DATE);
// Finally, find the end of the month, i.e. the start of the next one
c.roll(Calendar.DATE, true);
c.add(Calendar.MONTH, 1);
c.getTime(); // JDK 1.1.2 bug workaround
c.add(Calendar.SECOND, -1);
Date endOfMonth = c.getTime();
//
// Calculate the number of full or partial weeks in this month.
// To do this I can just reuse the code that calculates which
// calendar cell contains a given date.
//
//numWeeks = dateToCell(daysInMonth).y - dateToCell(1).y + 1;
// Remember which holidays fall on which days in this month,
// to save the trouble of having to do it later
//fHolidays.setSize(0);
int patience=100;
//for (int h = 0; h < fAllHolidays.length; h++)
{
Date d = fStartOfMonth;
while ( (d = h.firstBetween(d, endOfMonth) ) != null)
{
if(--patience <= 0) {
errln("Patience exceeded for " + h.getDisplayName() +" at " + d);
break;
}
if(d.after(endOfMonth)) {
errln("Error: for " + h.getDisplayName()+": " + d +" is after end of month " + endOfMonth);
break;
}
c.setTime(d);
logln("New date: " + d);
// fHolidays.addElement( new HolidayInfo(c.get(Calendar.DATE),
// fAllHolidays[h],
// fAllHolidays[h].getDisplayName(fDisplayLocale) ));
d.setTime( d.getTime() + 1000 ); // "d++"
}
}
// dirty = false;
}
// end HolidayDemoApplet code
}
// from HolidayCalendarDemo
private Date startOfMonth(/*Date dateInMonth,*/ Calendar fCalendar)
{
//synchronized(fCalendar) {
// fCalendar.setTime(dateInMonth); // TODO: synchronization
int era = fCalendar.get(Calendar.ERA);
int year = fCalendar.get(Calendar.YEAR);
int month = fCalendar.get(Calendar.MONTH);
fCalendar.clear();
fCalendar.set(Calendar.ERA, era);
fCalendar.set(Calendar.YEAR, year);
fCalendar.set(Calendar.MONTH, month);
fCalendar.set(Calendar.DATE, 1);
return fCalendar.getTime();
// }
}
public void TestCoverage(){
Holiday[] h = { new EasterHoliday("Ram's Easter"),
new SimpleHoliday(2, 29, 0, "Leap year", 1900, 2100)};
exerciseHolidays(h, Locale.getDefault());
RangeDateRule rdr = new RangeDateRule();
rdr.add(new SimpleDateRule(7, 10));
Date mbd = getDate(1953, Calendar.JULY, 10);
Date dbd = getDate(1958, Calendar.AUGUST, 15);
Date nbd = getDate(1990, Calendar.DECEMBER, 17);
Date abd = getDate(1992, Calendar.SEPTEMBER, 16);
Date xbd = getDate(1976, Calendar.JULY, 4);
Date ybd = getDate(2003, Calendar.DECEMBER, 8);
rdr.add(new SimpleDateRule(Calendar.JULY, 10, Calendar.MONDAY, false));
rdr.add(dbd, new SimpleDateRule(Calendar.AUGUST, 15, Calendar.WEDNESDAY, true));
rdr.add(xbd, null);
rdr.add(nbd, new SimpleDateRule(Calendar.DECEMBER, 17, Calendar.MONDAY, false));
rdr.add(ybd, null);
logln("first after " + mbd + " is " + rdr.firstAfter(mbd));
logln("first between " + mbd + " and " + dbd + " is " + rdr.firstBetween(mbd, dbd));
logln("first between " + dbd + " and " + nbd + " is " + rdr.firstBetween(dbd, nbd));
logln("first between " + nbd + " and " + abd + " is " + rdr.firstBetween(nbd, abd));
logln("first between " + abd + " and " + xbd + " is " + rdr.firstBetween(abd, xbd));
logln("first between " + abd + " and " + null + " is " + rdr.firstBetween(abd, null));
logln("first between " + xbd + " and " + null + " is " + rdr.firstBetween(xbd, null));
//getRule, setRule
logln("The rule in the holiday: " + h[1].getRule());
exerciseHoliday(h[1], Locale.getDefault());
h[1].setRule(rdr);
logln("Set the new rule to the SimpleHoliday ...");
if (!rdr.equals(h[1].getRule())) {
errln("FAIL: getRule and setRule not matched.");
}
exerciseHoliday(h[1], Locale.getDefault());
}
public void TestEaster(){
// Verify that Easter is working. Should be April 20, 2014
final Holiday h = new EasterHoliday("Easter Sunday");
final Date beginApril = getDate(2014, Calendar.APRIL, 1);
final Date endApril = getDate(2014, Calendar.APRIL, 30);
final Date expect = getDate(2014, Calendar.APRIL, 20);
final Date actual = h.firstBetween(beginApril, endApril);
if(actual == null) {
errln("Error: Easter 2014 should be on " + expect + " but got null.");
} else {
Calendar c = Calendar.getInstance(TimeZone.GMT_ZONE, Locale.US);
c.setTime(actual);
assertEquals("Easter's year: ", 2014, c.get(Calendar.YEAR));
assertEquals("Easter's month: ", Calendar.APRIL, c.get(Calendar.MONTH));
assertEquals("Easter's date: ", 20, c.get(Calendar.DATE));
}
}
public void TestIsOn() {
// jb 1901
SimpleHoliday sh = new SimpleHoliday(Calendar.AUGUST, 15, "Doug's Day", 1958, 2058);
Calendar gcal = new GregorianCalendar();
gcal.clear();
gcal.set(Calendar.YEAR, 2000);
gcal.set(Calendar.MONTH, Calendar.AUGUST);
gcal.set(Calendar.DAY_OF_MONTH, 15);
Date d0 = gcal.getTime();
gcal.add(Calendar.SECOND, 1);
Date d1 = gcal.getTime();
gcal.add(Calendar.SECOND, -2);
Date d2 = gcal.getTime();
gcal.add(Calendar.DAY_OF_MONTH, 1);
Date d3 = gcal.getTime();
gcal.add(Calendar.SECOND, 1);
Date d4 = gcal.getTime();
gcal.add(Calendar.SECOND, -2);
gcal.set(Calendar.YEAR, 1957);
Date d5 = gcal.getTime();
gcal.set(Calendar.YEAR, 1958);
Date d6 = gcal.getTime();
gcal.set(Calendar.YEAR, 2058);
Date d7 = gcal.getTime();
gcal.set(Calendar.YEAR, 2059);
Date d8 = gcal.getTime();
Date[] dates = { d0, d1, d2, d3, d4, d5, d6, d7, d8 };
boolean[] isOns = { true, true, false, true, false, false, true, true, false };
for (int i = 0; i < dates.length; ++i) {
Date d = dates[i];
logln("\ndate: " + d);
boolean isOn = sh.isOn(d);
logln("isOnDate: " + isOn);
if (isOn != isOns[i]) {
errln("date: " + d + " should be on Doug's Day!");
}
Date h = sh.firstAfter(d);
logln("firstAfter: " + h);
}
}
public void TestDisplayName() {
Holiday[] holidays = Holiday.getHolidays(ULocale.US);
for (int i = 0; i < holidays.length; ++i) {
Holiday h = holidays[i];
// only need to test one
// if the display names differ, we're using our data. We know these names
// should differ for this holiday (not all will).
if ("Christmas".equals(h.getDisplayName(ULocale.US))) {
if ("Christmas".equals(h.getDisplayName(ULocale.GERMANY))) {
errln("Using default name for holidays");
}
}
}
}
}