/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.basics.date;
import static com.opengamma.strata.collect.TestHelper.coverPrivateConstructor;
import static com.opengamma.strata.collect.TestHelper.date;
import static java.time.DayOfWeek.SATURDAY;
import static java.time.DayOfWeek.SUNDAY;
import static org.testng.Assert.assertEquals;
import java.time.LocalDate;
import java.time.MonthDay;
import java.util.ArrayList;
import java.util.List;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
/**
* Test {@code GlobalHolidayCalendars}.
*/
@Test
public class GlobalHolidayCalendarsTest {
@DataProvider(name = "easter")
Object[][] data_easter() {
return new Object[][] {
{15, 4, 1900},
{15, 4, 1900},
{7, 4, 1901},
{30, 3, 1902},
{12, 4, 1903},
{3, 4, 1904},
{23, 4, 1905},
{15, 4, 1906},
{31, 3, 1907},
{19, 4, 1908},
{11, 4, 1909},
{27, 3, 1910},
{16, 4, 1911},
{7, 4, 1912},
{23, 3, 1913},
{12, 4, 1914},
{4, 4, 1915},
{23, 4, 1916},
{8, 4, 1917},
{31, 3, 1918},
{20, 4, 1919},
{4, 4, 1920},
{27, 3, 1921},
{16, 4, 1922},
{1, 4, 1923},
{20, 4, 1924},
{12, 4, 1925},
{4, 4, 1926},
{17, 4, 1927},
{8, 4, 1928},
{31, 3, 1929},
{20, 4, 1930},
{5, 4, 1931},
{27, 3, 1932},
{16, 4, 1933},
{1, 4, 1934},
{21, 4, 1935},
{12, 4, 1936},
{28, 3, 1937},
{17, 4, 1938},
{9, 4, 1939},
{24, 3, 1940},
{13, 4, 1941},
{5, 4, 1942},
{25, 4, 1943},
{9, 4, 1944},
{1, 4, 1945},
{21, 4, 1946},
{6, 4, 1947},
{28, 3, 1948},
{17, 4, 1949},
{9, 4, 1950},
{25, 3, 1951},
{13, 4, 1952},
{5, 4, 1953},
{18, 4, 1954},
{10, 4, 1955},
{1, 4, 1956},
{21, 4, 1957},
{6, 4, 1958},
{29, 3, 1959},
{17, 4, 1960},
{2, 4, 1961},
{22, 4, 1962},
{14, 4, 1963},
{29, 3, 1964},
{18, 4, 1965},
{10, 4, 1966},
{26, 3, 1967},
{14, 4, 1968},
{6, 4, 1969},
{29, 3, 1970},
{11, 4, 1971},
{2, 4, 1972},
{22, 4, 1973},
{14, 4, 1974},
{30, 3, 1975},
{18, 4, 1976},
{10, 4, 1977},
{26, 3, 1978},
{15, 4, 1979},
{6, 4, 1980},
{19, 4, 1981},
{11, 4, 1982},
{3, 4, 1983},
{22, 4, 1984},
{7, 4, 1985},
{30, 3, 1986},
{19, 4, 1987},
{3, 4, 1988},
{26, 3, 1989},
{15, 4, 1990},
{31, 3, 1991},
{19, 4, 1992},
{11, 4, 1993},
{3, 4, 1994},
{16, 4, 1995},
{7, 4, 1996},
{30, 3, 1997},
{12, 4, 1998},
{4, 4, 1999},
{23, 4, 2000},
{15, 4, 2001},
{31, 3, 2002},
{20, 4, 2003},
{11, 4, 2004},
{27, 3, 2005},
{16, 4, 2006},
{8, 4, 2007},
{23, 3, 2008},
{12, 4, 2009},
{4, 4, 2010},
{24, 4, 2011},
{8, 4, 2012},
{31, 3, 2013},
{20, 4, 2014},
{5, 4, 2015},
{27, 3, 2016},
{16, 4, 2017},
{1, 4, 2018},
{21, 4, 2019},
{12, 4, 2020},
{4, 4, 2021},
{17, 4, 2022},
{9, 4, 2023},
{31, 3, 2024},
{20, 4, 2025},
{5, 4, 2026},
{28, 3, 2027},
{16, 4, 2028},
{1, 4, 2029},
{21, 4, 2030},
{13, 4, 2031},
{28, 3, 2032},
{17, 4, 2033},
{9, 4, 2034},
{25, 3, 2035},
{13, 4, 2036},
{5, 4, 2037},
{25, 4, 2038},
{10, 4, 2039},
{1, 4, 2040},
{21, 4, 2041},
{6, 4, 2042},
{29, 3, 2043},
{17, 4, 2044},
{9, 4, 2045},
{25, 3, 2046},
{14, 4, 2047},
{5, 4, 2048},
{18, 4, 2049},
{10, 4, 2050},
{2, 4, 2051},
{21, 4, 2052},
{6, 4, 2053},
{29, 3, 2054},
{18, 4, 2055},
{2, 4, 2056},
{22, 4, 2057},
{14, 4, 2058},
{30, 3, 2059},
{18, 4, 2060},
{10, 4, 2061},
{26, 3, 2062},
{15, 4, 2063},
{6, 4, 2064},
{29, 3, 2065},
{11, 4, 2066},
{3, 4, 2067},
{22, 4, 2068},
{14, 4, 2069},
{30, 3, 2070},
{19, 4, 2071},
{10, 4, 2072},
{26, 3, 2073},
{15, 4, 2074},
{7, 4, 2075},
{19, 4, 2076},
{11, 4, 2077},
{3, 4, 2078},
{23, 4, 2079},
{7, 4, 2080},
{30, 3, 2081},
{19, 4, 2082},
{4, 4, 2083},
{26, 3, 2084},
{15, 4, 2085},
{31, 3, 2086},
{20, 4, 2087},
{11, 4, 2088},
{3, 4, 2089},
{16, 4, 2090},
{8, 4, 2091},
{30, 3, 2092},
{12, 4, 2093},
{4, 4, 2094},
{24, 4, 2095},
{15, 4, 2096},
{31, 3, 2097},
{20, 4, 2098},
{12, 4, 2099},
};
}
@Test(dataProvider = "easter")
public void test_easter(int day, int month, int year) {
assertEquals(GlobalHolidayCalendars.easter(year), LocalDate.of(year, month, day));
}
//-------------------------------------------------------------------------
private static final HolidayCalendar GBLO = GlobalHolidayCalendars.generateLondon();
@DataProvider(name = "gblo")
Object[][] data_gblo() {
return new Object[][] {
// Whitsun, Last Mon Aug - http://hansard.millbanksystems.com/commons/1964/mar/04/staggered-holidays
{1965, mds(1965, md(4, 16), md(4, 19), md(6, 7), md(8, 30), md(12, 27), md(12, 28))},
// Whitsun May - http://hansard.millbanksystems.com/commons/1964/mar/04/staggered-holidays
// 29th Aug - http://hansard.millbanksystems.com/written_answers/1965/nov/25/august-bank-holiday
{1966, mds(1966, md(4, 8), md(4, 11), md(5, 30), md(8, 29), md(12, 26), md(12, 27))},
// 29th May, 28th Aug - http://hansard.millbanksystems.com/written_answers/1965/jun/03/bank-holidays-1967-and-1968
{1967, mds(1967, md(3, 24), md(3, 27), md(5, 29), md(8, 28), md(12, 25), md(12, 26))},
// 3rd Jun, 2nd Sep - http://hansard.millbanksystems.com/written_answers/1965/jun/03/bank-holidays-1967-and-1968
{1968, mds(1968, md(4, 12), md(4, 15), md(6, 3), md(9, 2), md(12, 25), md(12, 26))},
// 26th May, 1st Sep - http://hansard.millbanksystems.com/written_answers/1967/mar/21/bank-holidays-1969-dates
{1969, mds(1969, md(4, 4), md(4, 7), md(5, 26), md(9, 1), md(12, 25), md(12, 26))},
// 25th May, 31st Aug - http://hansard.millbanksystems.com/written_answers/1967/jul/28/bank-holidays
{1970, mds(1970, md(3, 27), md(3, 30), md(5, 25), md(8, 31), md(12, 25), md(12, 28))},
// applying rules
{1971, mds(1971, md(4, 9), md(4, 12), md(5, 31), md(8, 30), md(12, 27), md(12, 28))},
{2009, mds(2009, md(1, 1), md(4, 10), md(4, 13), md(5, 4), md(5, 25), md(8, 31), md(12, 25), md(12, 28))},
{2010, mds(2010, md(1, 1), md(4, 2), md(4, 5), md(5, 3), md(5, 31), md(8, 30), md(12, 27), md(12, 28))},
// https://www.gov.uk/bank-holidays
{2012, mds(2012, md(1, 2), md(4, 6), md(4, 9), md(5, 7), md(6, 4), md(6, 5), md(8, 27), md(12, 25), md(12, 26))},
{2013, mds(2013, md(1, 1), md(3, 29), md(4, 1), md(5, 6), md(5, 27), md(8, 26), md(12, 25), md(12, 26))},
{2014, mds(2014, md(1, 1), md(4, 18), md(4, 21), md(5, 5), md(5, 26), md(8, 25), md(12, 25), md(12, 26))},
{2015, mds(2015, md(1, 1), md(4, 3), md(4, 6), md(5, 4), md(5, 25), md(8, 31), md(12, 25), md(12, 28))},
{2016, mds(2016, md(1, 1), md(3, 25), md(3, 28), md(5, 2), md(5, 30), md(8, 29), md(12, 26), md(12, 27))},
};
}
@Test(dataProvider = "gblo")
public void test_gblo(int year, List<LocalDate> holidays) {
LocalDate date = LocalDate.of(year, 1, 1);
int len = date.lengthOfYear();
for (int i = 0; i < len; i++) {
boolean isHoliday = holidays.contains(date) || date.getDayOfWeek() == SATURDAY || date.getDayOfWeek() == SUNDAY;
assertEquals(GBLO.isHoliday(date), isHoliday, date.toString());
date = date.plusDays(1);
}
}
//-------------------------------------------------------------------------
private static final HolidayCalendar FRPA = GlobalHolidayCalendars.generateParis();
@DataProvider(name = "frpa")
Object[][] data_frpa() {
return new Object[][] {
// dates not shifted if fall on a weekend
{2003, mds(2003, md(1, 1), md(4, 18), md(4, 21), md(5, 1), md(5, 2), md(5, 8), md(5, 9), md(5, 29), md(5, 30),
md(6, 9), md(7, 14), md(8, 15), md(11, 1), md(11, 10), md(11, 11), md(12, 25), md(12, 26))},
{2004, mds(2004, md(1, 1), md(1, 2), md(4, 9), md(4, 12), md(5, 1), md(5, 8), md(5, 20), md(5, 21), md(5, 31),
md(7, 14), md(8, 15), md(11, 1), md(11, 11), md(11, 12), md(12, 25), md(12, 26))},
{2005, mds(2005, md(1, 1), md(3, 25), md(3, 28), md(5, 1), md(5, 5), md(5, 6), md(5, 8),
md(7, 14), md(7, 15), md(8, 15), md(10, 31), md(11, 1), md(11, 11), md(12, 25), md(12, 26))},
{2006, mds(2006, md(1, 1), md(4, 14), md(4, 17), md(5, 1), md(5, 8), md(5, 25), md(5, 26),
md(7, 14), md(8, 14), md(8, 15), md(11, 1), md(11, 11), md(12, 25), md(12, 26))},
{2007, mds(2007, md(1, 1), md(4, 6), md(4, 9), md(4, 30), md(5, 1), md(5, 7), md(5, 8), md(5, 17), md(5, 18),
md(7, 14), md(8, 15), md(11, 1), md(11, 2), md(11, 11), md(12, 24), md(12, 25), md(12, 26))},
{2008, mds(2008, md(1, 1), md(3, 21), md(3, 24), md(5, 1), md(5, 2), md(5, 8), md(5, 9), md(5, 12), md(5, 24),
md(7, 14), md(8, 15), md(11, 1), md(11, 10), md(11, 11), md(12, 25), md(12, 26))},
{2012, mds(2012, md(1, 1), md(4, 6), md(4, 9), md(4, 30), md(5, 1), md(5, 7), md(5, 8), md(5, 17), md(5, 18),
md(5, 28), md(7, 14), md(8, 15), md(11, 1), md(11, 2), md(11, 10), md(11, 11), md(12, 24), md(12, 25), md(12, 26))},
{2013, mds(2013, md(1, 1), md(3, 29), md(4, 1), md(5, 1), md(5, 8), md(5, 9), md(5, 10), md(5, 20),
md(7, 14), md(8, 15), md(8, 16), md(11, 1), md(11, 11), md(12, 25), md(12, 26))},
{2014, mds(2014, md(1, 1), md(4, 18), md(4, 21), md(5, 1), md(5, 2), md(5, 8), md(5, 9), md(5, 29), md(5, 30),
md(6, 9), md(7, 14), md(8, 15), md(11, 1), md(11, 10), md(11, 11), md(12, 25), md(12, 26))},
{2015, mds(2015, md(1, 1), md(1, 2), md(4, 3), md(4, 6), md(5, 1), md(5, 8), md(5, 14), md(5, 15), md(5, 25),
md(7, 13), md(7, 14), md(8, 15), md(11, 1), md(11, 11), md(12, 25), md(12, 26))},
{2016, mds(2016, md(1, 1), md(3, 25), md(3, 28), md(5, 1), md(5, 5), md(5, 6), md(5, 8), md(5, 16),
md(7, 14), md(7, 15), md(8, 15), md(10, 31), md(11, 1), md(11, 11), md(12, 25), md(12, 26))},
};
}
@Test(dataProvider = "frpa")
public void test_frpa(int year, List<LocalDate> holidays) {
LocalDate date = LocalDate.of(year, 1, 1);
int len = date.lengthOfYear();
for (int i = 0; i < len; i++) {
boolean isHoliday = holidays.contains(date) || date.getDayOfWeek() == SATURDAY || date.getDayOfWeek() == SUNDAY;
assertEquals(FRPA.isHoliday(date), isHoliday, date.toString());
date = date.plusDays(1);
}
}
//-------------------------------------------------------------------------
private static final HolidayCalendar CHZU = GlobalHolidayCalendars.generateZurich();
@DataProvider(name = "chzu")
Object[][] data_chzu() {
return new Object[][] {
// dates not shifted if fall on a weekend
{2012, mds(2012, md(1, 1), md(1, 2), md(4, 6), md(4, 9), md(5, 1), md(5, 17), md(5, 28),
md(8, 1), md(12, 25), md(12, 26))},
{2013, mds(2013, md(1, 1), md(1, 2), md(3, 29), md(4, 1), md(5, 1), md(5, 9), md(5, 20),
md(8, 1), md(12, 25), md(12, 26))},
{2014, mds(2014, md(1, 1), md(1, 2), md(4, 18), md(4, 21), md(5, 1), md(5, 29), md(6, 9),
md(8, 1), md(12, 25), md(12, 26))},
{2015, mds(2015, md(1, 1), md(1, 2), md(4, 3), md(4, 6), md(5, 1), md(5, 14), md(5, 25),
md(8, 1), md(12, 25), md(12, 26))},
{2016, mds(2016, md(1, 1), md(1, 2), md(3, 25), md(3, 28), md(5, 1), md(5, 5), md(5, 16),
md(8, 1), md(12, 25), md(12, 26))},
};
}
@Test(dataProvider = "chzu")
public void test_chzu(int year, List<LocalDate> holidays) {
LocalDate date = LocalDate.of(year, 1, 1);
int len = date.lengthOfYear();
for (int i = 0; i < len; i++) {
boolean isHoliday = holidays.contains(date) || date.getDayOfWeek() == SATURDAY || date.getDayOfWeek() == SUNDAY;
assertEquals(CHZU.isHoliday(date), isHoliday, date.toString());
date = date.plusDays(1);
}
}
//-------------------------------------------------------------------------
private static final HolidayCalendar EUTA = GlobalHolidayCalendars.generateEuropeanTarget();
@DataProvider(name = "euta")
Object[][] data_euta() {
return new Object[][] {
// 1997 - 1998 (testing phase), Jan 1, christmas day
{1997, mds(1997, md(1, 1), md(12, 25))},
{1998, mds(1998, md(1, 1), md(12, 25))},
// in 1999, Jan 1, christmas day, Dec 26, Dec 31
{1999, mds(1999, md(1, 1), md(12, 25), md(12, 31))},
// in 2000, Jan 1, good friday, easter monday, May 1, christmas day, Dec 26
{2000, mds(2000, md(1, 1), md(4, 21), md(4, 24), md(5, 1), md(12, 25), md(12, 26))},
// in 2001, Jan 1, good friday, easter monday, May 1, christmas day, Dec 26, Dec 31
{2001, mds(2001, md(1, 1), md(4, 13), md(4, 16), md(5, 1), md(12, 25), md(12, 26), md(12, 31))},
// from 2002, Jan 1, good friday, easter monday, May 1, christmas day, Dec 26
{2002, mds(2002, md(1, 1), md(3, 29), md(4, 1), md(5, 1), md(12, 25), md(12, 26))},
{2003, mds(2003, md(1, 1), md(4, 18), md(4, 21), md(5, 1), md(12, 25), md(12, 26))},
// http://www.ecb.europa.eu/home/html/holidays.en.html
{2014, mds(2014, md(1, 1), md(4, 18), md(4, 21), md(5, 1), md(12, 25), md(12, 26))},
{2015, mds(2015, md(1, 1), md(4, 3), md(4, 6), md(5, 1), md(12, 25), md(12, 26))},
};
}
@Test(dataProvider = "euta")
public void test_euta(int year, List<LocalDate> holidays) {
LocalDate date = LocalDate.of(year, 1, 1);
int len = date.lengthOfYear();
for (int i = 0; i < len; i++) {
boolean isHoliday = holidays.contains(date) || date.getDayOfWeek() == SATURDAY || date.getDayOfWeek() == SUNDAY;
assertEquals(EUTA.isHoliday(date), isHoliday, date.toString());
date = date.plusDays(1);
}
}
//-------------------------------------------------------------------------
private static final HolidayCalendar USGS = GlobalHolidayCalendars.generateUsGovtSecurities();
@DataProvider(name = "usgs")
Object[][] data_usgs() {
return new Object[][] {
// http://www.sifma.org/uploadedfiles/research/statistics/statisticsfiles/misc-us-historical-holiday-market-recommendations-sifma.pdf?n=53384
{1996, mds(1996, md(1, 1), md(1, 15), md(2, 19), md(4, 5), md(5, 27), md(7, 4),
md(9, 2), md(10, 14), md(11, 11), md(11, 28), md(12, 25))},
{1997, mds(1997, md(1, 1), md(1, 20), md(2, 17), md(3, 28), md(5, 26), md(7, 4),
md(9, 1), md(10, 13), md(11, 11), md(11, 27), md(12, 25))},
{1998, mds(1998, md(1, 1), md(1, 19), md(2, 16), md(4, 10), md(5, 25), md(7, 3),
md(9, 7), md(10, 12), md(11, 11), md(11, 26), md(12, 25))},
{1999, mds(1999, md(1, 1), md(1, 18), md(2, 15), md(4, 2), md(5, 31), md(7, 5),
md(9, 6), md(10, 11), md(11, 11), md(11, 25), md(12, 24))},
{2000, mds(2000, md(1, 17), md(2, 21), md(4, 21), md(5, 29), md(7, 4),
md(9, 4), md(10, 9), md(11, 23), md(12, 25))},
{2001, mds(2001, md(1, 1), md(1, 15), md(2, 19), md(4, 13), md(5, 28), md(7, 4),
md(9, 3), md(10, 8), md(11, 12), md(11, 22), md(12, 25))},
{2002, mds(2002, md(1, 1), md(1, 21), md(2, 18), md(3, 29), md(5, 27), md(7, 4),
md(9, 2), md(10, 14), md(11, 11), md(11, 28), md(12, 25))},
{2003, mds(2003, md(1, 1), md(1, 20), md(2, 17), md(4, 18), md(5, 26), md(7, 4),
md(9, 1), md(10, 13), md(11, 11), md(11, 27), md(12, 25))},
{2004, mds(2004, md(1, 1), md(1, 19), md(2, 16), md(4, 9), md(5, 31), md(7, 5),
md(9, 6), md(10, 11), md(11, 11), md(11, 25), md(12, 24))},
{2005, mds(2005, md(1, 17), md(2, 21), md(3, 25), md(5, 30), md(7, 4),
md(9, 5), md(10, 10), md(11, 11), md(11, 24), md(12, 26))},
{2006, mds(2006, md(1, 2), md(1, 16), md(2, 20), md(4, 14), md(5, 29), md(7, 4),
md(9, 4), md(10, 9), md(11, 23), md(12, 25))},
{2007, mds(2007, md(1, 1), md(1, 15), md(2, 19), md(4, 6), md(5, 28), md(7, 4),
md(9, 3), md(10, 8), md(11, 12), md(11, 22), md(12, 25))},
{2008, mds(2008, md(1, 1), md(1, 21), md(2, 18), md(3, 21), md(5, 26), md(7, 4),
md(9, 1), md(10, 13), md(11, 11), md(11, 27), md(12, 25))},
{2009, mds(2009, md(1, 1), md(1, 19), md(2, 16), md(4, 10), md(5, 25), md(7, 3),
md(9, 7), md(10, 12), md(11, 11), md(11, 26), md(12, 25))},
{2010, mds(2010, md(1, 1), md(1, 18), md(2, 15), md(4, 2), md(5, 31), md(7, 5),
md(9, 6), md(10, 11), md(11, 11), md(11, 25), md(12, 24))},
{2011, mds(2011, md(1, 17), md(2, 21), md(4, 22), md(5, 30), md(7, 4),
md(9, 5), md(10, 10), md(11, 11), md(11, 24), md(12, 26))},
{2012, mds(2012, md(1, 2), md(1, 16), md(2, 20), md(4, 6), md(5, 28), md(7, 4),
md(9, 3), md(10, 8), md(10, 30), md(11, 12), md(11, 22), md(12, 25))},
{2013, mds(2013, md(1, 1), md(1, 21), md(2, 18), md(3, 29), md(5, 27), md(7, 4),
md(9, 2), md(10, 14), md(11, 11), md(11, 28), md(12, 25))},
{2014, mds(2014, md(1, 1), md(1, 20), md(2, 17), md(4, 18), md(5, 26), md(7, 4),
md(9, 1), md(10, 13), md(11, 11), md(11, 27), md(12, 25))},
{2015, mds(2015, md(1, 1), md(1, 19), md(2, 16), md(4, 3), md(5, 25), md(7, 3),
md(9, 7), md(10, 12), md(11, 11), md(11, 26), md(12, 25))},
};
}
@Test(dataProvider = "usgs")
public void test_usgs(int year, List<LocalDate> holidays) {
LocalDate date = LocalDate.of(year, 1, 1);
int len = date.lengthOfYear();
for (int i = 0; i < len; i++) {
boolean isHoliday = holidays.contains(date) || date.getDayOfWeek() == SATURDAY || date.getDayOfWeek() == SUNDAY;
assertEquals(USGS.isHoliday(date), isHoliday, date.toString());
date = date.plusDays(1);
}
}
//-------------------------------------------------------------------------
private static final HolidayCalendar USNY = GlobalHolidayCalendars.generateUsNewYork();
@DataProvider(name = "usny")
Object[][] data_usny() {
return new Object[][] {
// http://www.cs.ny.gov/attendance_leave/2012_legal_holidays.cfm
// change year for other pages
{2008, mds(2008, md(1, 1), md(1, 21), md(2, 18), md(5, 26), md(7, 4),
md(9, 1), md(10, 13), md(11, 11), md(11, 27), md(12, 25))},
{2009, mds(2009, md(1, 1), md(1, 19), md(2, 16), md(5, 25), md(7, 4),
md(9, 7), md(10, 12), md(11, 11), md(11, 26), md(12, 25))},
{2010, mds(2010, md(1, 1), md(1, 18), md(2, 15), md(5, 31), md(7, 5),
md(9, 6), md(10, 11), md(11, 11), md(11, 25), md(12, 25))},
{2011, mds(2011, md(1, 1), md(1, 17), md(2, 21), md(5, 30), md(7, 4),
md(9, 5), md(10, 10), md(11, 11), md(11, 24), md(12, 26))},
{2012, mds(2012, md(1, 2), md(1, 16), md(2, 20), md(5, 28), md(7, 4),
md(9, 3), md(10, 8), md(11, 12), md(11, 22), md(12, 25))},
{2013, mds(2013, md(1, 1), md(1, 21), md(2, 18), md(5, 27), md(7, 4),
md(9, 2), md(10, 14), md(11, 11), md(11, 28), md(12, 25))},
{2014, mds(2014, md(1, 1), md(1, 20), md(2, 17), md(5, 26), md(7, 4),
md(9, 1), md(10, 13), md(11, 11), md(11, 27), md(12, 25))},
{2015, mds(2015, md(1, 1), md(1, 19), md(2, 16), md(5, 25), md(7, 4),
md(9, 7), md(10, 12), md(11, 11), md(11, 26), md(12, 25))},
};
}
@Test(dataProvider = "usny")
public void test_usny(int year, List<LocalDate> holidays) {
LocalDate date = LocalDate.of(year, 1, 1);
int len = date.lengthOfYear();
for (int i = 0; i < len; i++) {
boolean isHoliday = holidays.contains(date) || date.getDayOfWeek() == SATURDAY || date.getDayOfWeek() == SUNDAY;
assertEquals(USNY.isHoliday(date), isHoliday, date.toString());
date = date.plusDays(1);
}
}
//-------------------------------------------------------------------------
private static final HolidayCalendar NYFD = GlobalHolidayCalendars.generateNewYorkFed();
@DataProvider(name = "nyfd")
Object[][] data_nyfd() {
return new Object[][] {
// http://www.ny.frb.org/aboutthefed/holiday_schedule.html
// http://web.archive.org/web/20080403230805/http://www.ny.frb.org/aboutthefed/holiday_schedule.html
// http://web.archive.org/web/20100827003740/http://www.ny.frb.org/aboutthefed/holiday_schedule.html
// http://web.archive.org/web/20031007222458/http://www.ny.frb.org/aboutthefed/holiday_schedule.html
// http://www.federalreserve.gov/aboutthefed/k8.htm
{2003, mds(2003, md(1, 1), md(1, 20), md(2, 17), md(5, 26), md(7, 4),
md(9, 1), md(10, 13), md(11, 11), md(11, 27), md(12, 25))},
{2004, mds(2004, md(1, 1), md(1, 19), md(2, 16), md(5, 31), md(7, 5),
md(9, 6), md(10, 11), md(11, 11), md(11, 25))},
{2005, mds(2005, md(1, 17), md(2, 21), md(5, 30), md(7, 4),
md(9, 5), md(10, 10), md(11, 11), md(11, 24), md(12, 26))},
{2006, mds(2006, md(1, 2), md(1, 16), md(2, 20), md(5, 29), md(7, 4),
md(9, 4), md(10, 9), md(11, 23), md(12, 25))},
{2007, mds(2007, md(1, 1), md(1, 15), md(2, 19), md(5, 28), md(7, 4),
md(9, 3), md(10, 8), md(11, 12), md(11, 22), md(12, 25))},
{2008, mds(2008, md(1, 1), md(1, 21), md(2, 18), md(5, 26), md(7, 4),
md(9, 1), md(10, 13), md(11, 11), md(11, 27), md(12, 25))},
{2009, mds(2009, md(1, 1), md(1, 19), md(2, 16), md(5, 25),
md(9, 7), md(10, 12), md(11, 11), md(11, 26), md(12, 25))},
{2010, mds(2010, md(1, 1), md(1, 18), md(2, 15), md(5, 31), md(7, 5),
md(9, 6), md(10, 11), md(11, 11), md(11, 25))},
{2011, mds(2011, md(1, 17), md(2, 21), md(5, 30), md(7, 4),
md(9, 5), md(10, 10), md(11, 11), md(11, 24), md(12, 26))},
{2012, mds(2012, md(1, 2), md(1, 16), md(2, 20), md(5, 28), md(7, 4),
md(9, 3), md(10, 8), md(11, 12), md(11, 22), md(12, 25))},
{2013, mds(2013, md(1, 1), md(1, 21), md(2, 18), md(5, 27), md(7, 4),
md(9, 2), md(10, 14), md(11, 11), md(11, 28), md(12, 25))},
{2014, mds(2014, md(1, 1), md(1, 20), md(2, 17), md(5, 26), md(7, 4),
md(9, 1), md(10, 13), md(11, 11), md(11, 27), md(12, 25))},
{2015, mds(2015, md(1, 1), md(1, 19), md(2, 16), md(5, 25),
md(9, 7), md(10, 12), md(11, 11), md(11, 26), md(12, 25))},
{2016, mds(2016, md(1, 1), md(1, 18), md(2, 15), md(5, 30), md(7, 4),
md(9, 5), md(10, 10), md(11, 11), md(11, 24), md(12, 26))},
{2017, mds(2017, md(1, 2), md(1, 16), md(2, 20), md(5, 29), md(7, 4),
md(9, 4), md(10, 9), md(11, 23), md(12, 25))},
{2018, mds(2018, md(1, 1), md(1, 15), md(2, 19), md(5, 28), md(7, 4),
md(9, 3), md(10, 8), md(11, 12), md(11, 22), md(12, 25))},
};
}
@Test(dataProvider = "nyfd")
public void test_nyfd(int year, List<LocalDate> holidays) {
LocalDate date = LocalDate.of(year, 1, 1);
int len = date.lengthOfYear();
for (int i = 0; i < len; i++) {
boolean isHoliday = holidays.contains(date) || date.getDayOfWeek() == SATURDAY || date.getDayOfWeek() == SUNDAY;
assertEquals(NYFD.isHoliday(date), isHoliday, date.toString());
date = date.plusDays(1);
}
}
//-------------------------------------------------------------------------
private static final HolidayCalendar NYSE = GlobalHolidayCalendars.generateNewYorkStockExchange();
@DataProvider(name = "nyse")
Object[][] data_nyse() {
return new Object[][] {
// https://www.nyse.com/markets/hours-calendars
// http://web.archive.org/web/20110320011340/http://www.nyse.com/about/newsevents/1176373643795.html?sa_campaign=/internal_ads/homepage/08262008holidays
// http://web.archive.org/web/20080901164729/http://www.nyse.com/about/newsevents/1176373643795.html?sa_campaign=/internal_ads/homepage/08262008holidays
{2008, mds(2008, md(1, 1), md(1, 21), md(2, 18), md(3, 21), md(5, 26), md(7, 4),
md(9, 1), md(11, 27), md(12, 25))},
{2009, mds(2009, md(1, 1), md(1, 19), md(2, 16), md(4, 10), md(5, 25), md(7, 3),
md(9, 7), md(11, 26), md(12, 25))},
{2010, mds(2010, md(1, 1), md(1, 18), md(2, 15), md(4, 2), md(5, 31), md(7, 5),
md(9, 6), md(11, 25), md(12, 24))},
{2011, mds(2011, md(1, 1), md(1, 17), md(2, 21), md(4, 22), md(5, 30), md(7, 4),
md(9, 5), md(11, 24), md(12, 26))},
{2012, mds(2012, md(1, 2), md(1, 16), md(2, 20), md(4, 6), md(5, 28), md(7, 4),
md(9, 3), md(10, 30), md(11, 22), md(12, 25))},
{2013, mds(2013, md(1, 1), md(1, 21), md(2, 18), md(3, 29), md(5, 27), md(7, 4),
md(9, 2), md(11, 28), md(12, 25))},
{2014, mds(2014, md(1, 1), md(1, 20), md(2, 17), md(4, 18), md(5, 26), md(7, 4),
md(9, 1), md(11, 27), md(12, 25))},
{2015, mds(2015, md(1, 1), md(1, 19), md(2, 16), md(4, 3), md(5, 25), md(7, 3),
md(9, 7), md(11, 26), md(12, 25))},
};
}
@Test(dataProvider = "nyse")
public void test_nyse(int year, List<LocalDate> holidays) {
LocalDate date = LocalDate.of(year, 1, 1);
int len = date.lengthOfYear();
for (int i = 0; i < len; i++) {
boolean isHoliday = holidays.contains(date) || date.getDayOfWeek() == SATURDAY || date.getDayOfWeek() == SUNDAY;
assertEquals(NYSE.isHoliday(date), isHoliday, date.toString());
date = date.plusDays(1);
}
}
//-------------------------------------------------------------------------
private static final HolidayCalendar JPTO = GlobalHolidayCalendars.generateTokyo();
@DataProvider(name = "jpto")
Object[][] data_jpto() {
return new Object[][] {
// https://www.boj.or.jp/en/about/outline/holi.htm/
// http://web.archive.org/web/20110513190217/http://www.boj.or.jp/en/about/outline/holi.htm/
{1999, mds(1999, md(1, 1), md(1, 2), md(1, 3), md(1, 15), md(2, 11), md(3, 22), md(4, 29), md(5, 3), md(5, 4), md(5, 5),
md(7, 20), md(9, 15), md(9, 23), md(10, 11), md(11, 3), md(11, 23), md(12, 23), md(12, 31))},
{2000, mds(2000, md(1, 1), md(1, 2), md(1, 3), md(1, 10), md(2, 11), md(3, 20), md(4, 29), md(5, 3), md(5, 4), md(5, 5),
md(7, 20), md(9, 15), md(9, 23), md(10, 9), md(11, 3), md(11, 23), md(12, 23), md(12, 31))},
{2001, mds(2001, md(1, 1), md(1, 2), md(1, 3), md(1, 8), md(2, 12), md(3, 20), md(4, 30), md(5, 3), md(5, 4), md(5, 5),
md(7, 20), md(9, 15), md(9, 24), md(10, 8), md(11, 3), md(11, 23), md(12, 24), md(12, 31))},
{2002, mds(2002, md(1, 1), md(1, 2), md(1, 3), md(1, 14), md(2, 11), md(3, 21), md(4, 29), md(5, 3), md(5, 4), md(5, 6),
md(7, 20), md(9, 16), md(9, 23), md(10, 14), md(11, 4), md(11, 23), md(12, 23), md(12, 31))},
{2003, mds(2003, md(1, 1), md(1, 2), md(1, 3), md(1, 13), md(2, 11), md(3, 21), md(4, 29), md(5, 3), md(5, 4), md(5, 5),
md(7, 21), md(9, 15), md(9, 23), md(10, 13), md(11, 3), md(11, 24), md(12, 23), md(12, 31))},
{2004, mds(2004, md(1, 1), md(1, 2), md(1, 3), md(1, 12), md(2, 11), md(3, 20), md(4, 29), md(5, 3), md(5, 4), md(5, 5),
md(7, 19), md(9, 20), md(9, 23), md(10, 11), md(11, 3), md(11, 23), md(12, 23), md(12, 31))},
{2005, mds(2005, md(1, 1), md(1, 2), md(1, 3), md(1, 10), md(2, 11), md(3, 21), md(4, 29), md(5, 3), md(5, 4), md(5, 5),
md(7, 18), md(9, 19), md(9, 23), md(10, 10), md(11, 3), md(11, 23), md(12, 23), md(12, 31))},
{2006, mds(2006, md(1, 1), md(1, 2), md(1, 3), md(1, 9), md(2, 11), md(3, 21), md(4, 29), md(5, 3), md(5, 4), md(5, 5),
md(7, 17), md(9, 18), md(9, 23), md(10, 9), md(11, 3), md(11, 23), md(12, 23), md(12, 31))},
{2011, mds(2011, md(1, 1), md(1, 2), md(1, 3), md(1, 10), md(2, 11), md(3, 21), md(4, 29), md(5, 3), md(5, 4), md(5, 5),
md(7, 18), md(9, 19), md(9, 23), md(10, 10), md(11, 3), md(11, 23), md(12, 23), md(12, 31))},
{2012, mds(2012, md(1, 1), md(1, 2), md(1, 3), md(1, 9), md(2, 11), md(3, 20), md(4, 30), md(5, 3), md(5, 4), md(5, 5),
md(7, 16), md(9, 17), md(9, 22), md(10, 8), md(11, 3), md(11, 23), md(12, 24), md(12, 31))},
{2013, mds(2013, md(1, 1), md(1, 2), md(1, 3), md(1, 14), md(2, 11), md(3, 20), md(4, 29),
md(5, 3), md(5, 4), md(5, 5), md(5, 6),
md(7, 15), md(9, 16), md(9, 23), md(10, 14), md(11, 4), md(11, 23), md(12, 23), md(12, 31))},
{2014, mds(2014, md(1, 1), md(1, 2), md(1, 3), md(1, 13), md(2, 11), md(3, 21), md(4, 29),
md(5, 3), md(5, 4), md(5, 5), md(5, 6),
md(7, 21), md(9, 15), md(9, 23), md(10, 13), md(11, 3), md(11, 24), md(12, 23), md(12, 31))},
{2015, mds(2015, md(1, 1), md(1, 2), md(1, 3), md(1, 12), md(2, 11), md(3, 21), md(4, 29),
md(5, 3), md(5, 4), md(5, 5), md(5, 6),
md(7, 20), md(9, 21), md(9, 22), md(9, 23), md(10, 12), md(11, 3), md(11, 23), md(12, 23), md(12, 31))},
};
}
@Test(dataProvider = "jpto")
public void test_jpto(int year, List<LocalDate> holidays) {
LocalDate date = LocalDate.of(year, 1, 1);
int len = date.lengthOfYear();
for (int i = 0; i < len; i++) {
boolean isHoliday = holidays.contains(date) || date.getDayOfWeek() == SATURDAY || date.getDayOfWeek() == SUNDAY;
assertEquals(JPTO.isHoliday(date), isHoliday, date.toString());
date = date.plusDays(1);
}
}
//-------------------------------------------------------------------------
private static final HolidayCalendar AUSY = GlobalHolidayCalendars.generateSydney();
@DataProvider(name = "ausy")
Object[][] data_ausy() {
return new Object[][] {
{2012, mds(2012, md(1, 1), md(1, 2), md(1, 26), md(4, 6), md(4, 7), md(4, 8), md(4, 9),
md(4, 25), md(6, 11), md(8, 6), md(10, 1), md(12, 25), md(12, 26))},
{2013, mds(2013, md(1, 1), md(1, 26), md(1, 28), md(3, 29), md(3, 30), md(3, 31), md(4, 1),
md(4, 25), md(6, 10), md(8, 5), md(10, 7), md(12, 25), md(12, 26))},
{2014, mds(2014, md(1, 1), md(1, 26), md(1, 27), md(4, 18), md(4, 19), md(4, 20), md(4, 21),
md(4, 25), md(6, 9), md(8, 4), md(10, 6), md(12, 25), md(12, 26))},
{2015, mds(2015, md(1, 1), md(1, 26), md(4, 3), md(4, 4), md(4, 5), md(4, 6), md(4, 25),
md(6, 8), md(8, 3), md(10, 5), md(12, 25), md(12, 26), md(12, 27), md(12, 28))},
{2016, mds(2016, md(1, 1), md(1, 26), md(3, 25), md(3, 26), md(3, 27), md(3, 28),
md(4, 25), md(6, 13), md(8, 1), md(10, 3), md(12, 25), md(12, 26), md(12, 27))},
{2017, mds(2017, md(1, 1), md(1, 2), md(1, 26), md(4, 14), md(4, 15), md(4, 16), md(4, 17),
md(4, 25), md(6, 12), md(8, 7), md(10, 2), md(12, 25), md(12, 26))},
};
}
@Test(dataProvider = "ausy")
public void test_ausy(int year, List<LocalDate> holidays) {
LocalDate date = LocalDate.of(year, 1, 1);
int len = date.lengthOfYear();
for (int i = 0; i < len; i++) {
boolean isHoliday = holidays.contains(date) || date.getDayOfWeek() == SATURDAY || date.getDayOfWeek() == SUNDAY;
assertEquals(AUSY.isHoliday(date), isHoliday, date.toString());
date = date.plusDays(1);
}
}
//-------------------------------------------------------------------------
private static final HolidayCalendar BRBD = GlobalHolidayCalendars.generateBrazil();
@DataProvider(name = "brbd")
Object[][] data_brbd() {
// http://www.planalto.gov.br/ccivil_03/leis/2002/L10607.htm
// fixing data
return new Object[][] {
{2013, mds(2013, md(1, 1), md(2, 11), md(2, 12), md(3, 29), md(4, 21), md(5, 1),
md(5, 30), md(9, 7), md(10, 12), md(11, 2), md(11, 15), md(12, 25))},
{2014, mds(2014, md(1, 1), md(3, 3), md(3, 4), md(4, 18), md(4, 21), md(5, 1),
md(6, 19), md(9, 7), md(10, 12), md(11, 2), md(11, 15), md(12, 25))},
{2015, mds(2015, md(1, 1), md(2, 16), md(2, 17), md(4, 3), md(4, 21), md(5, 1),
md(6, 4), md(9, 7), md(10, 12), md(11, 2), md(11, 15), md(12, 25))},
{2016, mds(2016, md(1, 1), md(2, 8), md(2, 9), md(3, 25), md(4, 21), md(5, 1),
md(5, 26), md(9, 7), md(10, 12), md(11, 2), md(11, 15), md(12, 25))},
};
}
@Test(dataProvider = "brbd")
public void test_brbd(int year, List<LocalDate> holidays) {
LocalDate date = LocalDate.of(year, 1, 1);
int len = date.lengthOfYear();
for (int i = 0; i < len; i++) {
boolean isHoliday = holidays.contains(date) || date.getDayOfWeek() == SATURDAY || date.getDayOfWeek() == SUNDAY;
assertEquals(BRBD.isHoliday(date), isHoliday, date.toString());
date = date.plusDays(1);
}
}
//-------------------------------------------------------------------------
private static final HolidayCalendar CATO = GlobalHolidayCalendars.generateToronto();
@DataProvider(name = "cato")
Object[][] data_cato() {
return new Object[][] {
{2009, mds(2009, md(1, 1), md(2, 16), md(4, 10),
md(5, 18), md(7, 1), md(8, 3), md(9, 7), md(10, 12), md(11, 11), md(12, 25), md(12, 28))},
{2010, mds(2010, md(1, 1), md(2, 15), md(4, 2),
md(5, 24), md(7, 1), md(8, 2), md(9, 6), md(10, 11), md(11, 11), md(12, 27), md(12, 28))},
{2011, mds(2011, md(1, 3), md(2, 21), md(4, 22),
md(5, 23), md(7, 1), md(8, 1), md(9, 5), md(10, 10), md(11, 11), md(12, 26), md(12, 27))},
{2012, mds(2012, md(1, 2), md(2, 20), md(4, 6),
md(5, 21), md(7, 2), md(8, 6), md(9, 3), md(10, 8), md(11, 12), md(12, 25), md(12, 26))},
{2013, mds(2013, md(1, 1), md(2, 18), md(3, 29),
md(5, 20), md(7, 1), md(8, 5), md(9, 2), md(10, 14), md(11, 11), md(12, 25), md(12, 26))},
{2014, mds(2014, md(1, 1), md(2, 17), md(4, 18),
md(5, 19), md(7, 1), md(8, 4), md(9, 1), md(10, 13), md(11, 11), md(12, 25), md(12, 26))},
{2015, mds(2015, md(1, 1), md(2, 16), md(4, 3),
md(5, 18), md(7, 1), md(8, 3), md(9, 7), md(10, 12), md(11, 11), md(12, 25), md(12, 28))},
{2016, mds(2016, md(1, 1), md(2, 15), md(3, 25),
md(5, 23), md(7, 1), md(8, 1), md(9, 5), md(10, 10), md(11, 11), md(12, 26), md(12, 27))},
};
}
@Test(dataProvider = "cato")
public void test_cato(int year, List<LocalDate> holidays) {
LocalDate date = LocalDate.of(year, 1, 1);
int len = date.lengthOfYear();
for (int i = 0; i < len; i++) {
boolean isHoliday = holidays.contains(date) || date.getDayOfWeek() == SATURDAY || date.getDayOfWeek() == SUNDAY;
assertEquals(CATO.isHoliday(date), isHoliday, date.toString());
date = date.plusDays(1);
}
}
//-------------------------------------------------------------------------
private static final HolidayCalendar CZPR = GlobalHolidayCalendars.generatePrague();
@DataProvider(name = "czpr")
Object[][] data_czpr() {
// official data from Czech National Bank
// https://www.cnb.cz/en/public/media_service/schedules/media_svatky.html
return new Object[][] {
{2008, mds(2008, md(1, 1), md(3, 24), md(5, 1), md(5, 8),
md(7, 5), md(7, 6), md(9, 28), md(10, 28), md(11, 17), md(12, 24), md(12, 25), md(12, 26))},
{2009, mds(2009, md(1, 1), md(4, 13), md(5, 1), md(5, 8),
md(7, 5), md(7, 6), md(9, 28), md(10, 28), md(11, 17), md(12, 24), md(12, 25), md(12, 26))},
{2010, mds(2010, md(1, 1), md(4, 5), md(5, 1), md(5, 8),
md(7, 5), md(7, 6), md(9, 28), md(10, 28), md(11, 17), md(12, 24), md(12, 25), md(12, 26))},
{2011, mds(2011, md(1, 1), md(4, 25), md(5, 1), md(5, 8),
md(7, 5), md(7, 6), md(9, 28), md(10, 28), md(11, 17), md(12, 24), md(12, 25), md(12, 26))},
{2012, mds(2012, md(1, 1), md(4, 9), md(5, 1), md(5, 8),
md(7, 5), md(7, 6), md(9, 28), md(10, 28), md(11, 17), md(12, 24), md(12, 25), md(12, 26))},
{2013, mds(2013, md(1, 1), md(4, 1), md(5, 1), md(5, 8),
md(7, 5), md(7, 6), md(9, 28), md(10, 28), md(11, 17), md(12, 24), md(12, 25), md(12, 26))},
{2014, mds(2014, md(1, 1), md(4, 21), md(5, 1), md(5, 8),
md(7, 5), md(7, 6), md(9, 28), md(10, 28), md(11, 17), md(12, 24), md(12, 25), md(12, 26))},
{2015, mds(2015, md(1, 1), md(4, 6), md(5, 1), md(5, 8),
md(7, 5), md(7, 6), md(9, 28), md(10, 28), md(11, 17), md(12, 24), md(12, 25), md(12, 26))},
{2016, mds(2016, md(1, 1), md(3, 25), md(3, 28), md(5, 1), md(5, 8),
md(7, 5), md(7, 6), md(9, 28), md(10, 28), md(11, 17), md(12, 24), md(12, 25), md(12, 26))},
{2017, mds(2017, md(1, 1), md(4, 14), md(4, 17), md(5, 1), md(5, 8),
md(7, 5), md(7, 6), md(9, 28), md(10, 28), md(11, 17), md(12, 24), md(12, 25), md(12, 26))},
};
}
@Test(dataProvider = "czpr")
public void test_czpr(int year, List<LocalDate> holidays) {
LocalDate date = LocalDate.of(year, 1, 1);
int len = date.lengthOfYear();
for (int i = 0; i < len; i++) {
boolean isHoliday = holidays.contains(date) || date.getDayOfWeek() == SATURDAY || date.getDayOfWeek() == SUNDAY;
assertEquals(CZPR.isHoliday(date), isHoliday, date.toString());
date = date.plusDays(1);
}
}
//-------------------------------------------------------------------------
private static final HolidayCalendar DKCO = GlobalHolidayCalendars.generateCopenhagen();
@DataProvider(name = "dkco")
Object[][] data_dkco() {
// official data from Danish Bankers association via web archive
return new Object[][] {
{2013, mds(2013, md(1, 1), md(3, 28), md(3, 29), md(4, 1),
md(4, 26), md(5, 9), md(5, 10), md(5, 20), md(6, 5), md(12, 24), md(12, 25), md(12, 26), md(12, 31))},
{2014, mds(2014, md(1, 1), md(4, 17), md(4, 18), md(4, 21),
md(5, 16), md(5, 29), md(5, 30), md(6, 5), md(6, 9), md(12, 24), md(12, 25), md(12, 26), md(12, 31))},
{2015, mds(2015, md(1, 1), md(4, 2), md(4, 3), md(4, 6),
md(5, 1), md(5, 14), md(5, 15), md(5, 25), md(6, 5), md(12, 24), md(12, 25), md(12, 26), md(12, 31))},
{2016, mds(2016, md(1, 1), md(3, 24), md(3, 25), md(3, 28),
md(4, 22), md(5, 5), md(5, 6), md(5, 16), md(6, 5), md(12, 24), md(12, 25), md(12, 26), md(12, 31))},
};
}
@Test(dataProvider = "dkco")
public void test_dkco(int year, List<LocalDate> holidays) {
LocalDate date = LocalDate.of(year, 1, 1);
int len = date.lengthOfYear();
for (int i = 0; i < len; i++) {
boolean isHoliday = holidays.contains(date) || date.getDayOfWeek() == SATURDAY || date.getDayOfWeek() == SUNDAY;
assertEquals(DKCO.isHoliday(date), isHoliday, date.toString());
date = date.plusDays(1);
}
}
//-------------------------------------------------------------------------
private static final HolidayCalendar HUBU = GlobalHolidayCalendars.generateBudapest();
@DataProvider(name = "hubu")
Object[][] data_hubu() {
// http://www.mnb.hu/letoltes/bubor2.xls
// http://holidays.kayaposoft.com/public_holidays.php?year=2013&country=hun®ion=#
return new Object[][] {
{2012, mds(2012, md(3, 15), md(3, 16), md(4, 9), md(4, 30), md(5, 1), md(5, 28),
md(8, 20), md(10, 22), md(10, 23), md(11, 1), md(11, 2), md(12, 24), md(12, 25), md(12, 26), md(12, 31)),
ImmutableList.of(date(2012, 3, 24), date(2012, 5, 5), date(2012, 10, 27),
date(2012, 11, 10), date(2012, 12, 15), date(2012, 12, 29))},
{2013, mds(2013, md(1, 1), md(3, 15), md(4, 1), md(5, 1), md(5, 20),
md(8, 19), md(8, 20), md(10, 23), md(11, 1), md(12, 24), md(12, 25), md(12, 26), md(12, 27)),
ImmutableList.of(date(2013, 8, 24), date(2013, 12, 7), date(2013, 12, 21))},
{2014, mds(2014, md(1, 1), md(3, 15), md(4, 21), md(5, 1), md(5, 2),
md(6, 9), md(8, 20), md(10, 23), md(10, 24), md(12, 24), md(12, 25), md(12, 26)),
ImmutableList.of(date(2014, 5, 10), date(2014, 10, 18))},
{2015, mds(2015, md(1, 1), md(1, 2), md(3, 15), md(4, 6), md(5, 1), md(5, 25),
md(8, 20), md(8, 21), md(10, 23), md(12, 24), md(12, 25), md(12, 26)),
ImmutableList.of(date(2015, 1, 10), date(2015, 8, 8), date(2015, 12, 12))},
{2016, mds(2016, md(1, 1), md(3, 14), md(3, 15), md(3, 28), md(5, 1), md(5, 16),
md(10, 31), md(11, 1), md(12, 24), md(12, 25), md(12, 26)),
ImmutableList.of(date(2016, 3, 5), date(2016, 10, 15))},
};
}
@Test(dataProvider = "hubu")
public void test_hubu(int year, List<LocalDate> holidays, List<LocalDate> workDays) {
LocalDate date = LocalDate.of(year, 1, 1);
int len = date.lengthOfYear();
for (int i = 0; i < len; i++) {
boolean isHoliday = (holidays.contains(date) || date.getDayOfWeek() == SATURDAY || date.getDayOfWeek() == SUNDAY) &&
!workDays.contains(date);
assertEquals(HUBU.isHoliday(date), isHoliday, date.toString());
date = date.plusDays(1);
}
}
//-------------------------------------------------------------------------
private static final HolidayCalendar MXMC = GlobalHolidayCalendars.generateMexicoCity();
@DataProvider(name = "mxmc")
Object[][] data_mxmc() {
// http://www.banxico.org.mx/SieInternet/consultarDirectorioInternetAction.do?accion=consultarCuadro&idCuadro=CF111&locale=en
return new Object[][] {
{2012, mds(2012, md(1, 1), md(2, 6), md(3, 19), md(4, 5), md(4, 6),
md(5, 1), md(9, 16), md(11, 2), md(11, 19), md(12, 12), md(12, 25))},
{2013, mds(2013, md(1, 1), md(2, 4), md(3, 18), md(3, 28), md(3, 29),
md(5, 1), md(9, 16), md(11, 2), md(11, 18), md(12, 12), md(12, 25))},
{2014, mds(2014, md(1, 1), md(2, 3), md(3, 17), md(4, 17), md(4, 18),
md(5, 1), md(9, 16), md(11, 2), md(11, 17), md(12, 12), md(12, 25))},
{2015, mds(2015, md(1, 1), md(2, 2), md(3, 16), md(4, 2), md(4, 3),
md(5, 1), md(9, 16), md(11, 2), md(11, 16), md(12, 12), md(12, 25))},
{2016, mds(2016, md(1, 1), md(2, 1), md(3, 21), md(3, 24), md(3, 25),
md(5, 1), md(9, 16), md(11, 2), md(11, 21), md(12, 12), md(12, 25))},
};
}
@Test(dataProvider = "mxmc")
public void test_mxmc(int year, List<LocalDate> holidays) {
LocalDate date = LocalDate.of(year, 1, 1);
int len = date.lengthOfYear();
for (int i = 0; i < len; i++) {
boolean isHoliday = holidays.contains(date) || date.getDayOfWeek() == SATURDAY || date.getDayOfWeek() == SUNDAY;
assertEquals(MXMC.isHoliday(date), isHoliday, date.toString());
date = date.plusDays(1);
}
}
//-------------------------------------------------------------------------
private static final HolidayCalendar NOOS = GlobalHolidayCalendars.generateOslo();
@DataProvider(name = "noos")
Object[][] data_noos() {
// official data from Oslo Bors via web archive
return new Object[][] {
{2009, mds(2009, md(1, 1), md(4, 9), md(4, 10), md(4, 13),
md(5, 1), md(5, 21), md(6, 1), md(12, 24), md(12, 25), md(12, 31))},
{2011, mds(2011, md(4, 21), md(4, 22), md(4, 25),
md(5, 17), md(6, 2), md(6, 13), md(12, 26))},
{2012, mds(2012, md(4, 5), md(4, 6), md(4, 9),
md(5, 1), md(5, 17), md(5, 28), md(12, 24), md(12, 25), md(12, 26), md(12, 31))},
{2013, mds(2013, md(1, 1), md(3, 28), md(3, 29), md(4, 1),
md(5, 1), md(5, 9), md(5, 17), md(5, 20), md(12, 24), md(12, 25), md(12, 26), md(12, 31))},
{2014, mds(2014, md(1, 1), md(4, 17), md(4, 18), md(4, 21),
md(5, 1), md(5, 17), md(5, 29), md(6, 9), md(12, 24), md(12, 25), md(12, 26), md(12, 31))},
{2015, mds(2015, md(1, 1), md(4, 2), md(4, 3), md(4, 6),
md(5, 1), md(5, 14), md(5, 25), md(12, 24), md(12, 25), md(12, 31))},
{2016, mds(2016, md(1, 1), md(3, 24), md(3, 25), md(3, 28),
md(5, 5), md(5, 16), md(5, 17), md(12, 26))},
{2017, mds(2017, md(4, 13), md(4, 14), md(4, 17),
md(5, 1), md(5, 17), md(5, 25), md(6, 5), md(12, 25), md(12, 26))},
};
}
@Test(dataProvider = "noos")
public void test_noos(int year, List<LocalDate> holidays) {
LocalDate date = LocalDate.of(year, 1, 1);
int len = date.lengthOfYear();
for (int i = 0; i < len; i++) {
boolean isHoliday = holidays.contains(date) || date.getDayOfWeek() == SATURDAY || date.getDayOfWeek() == SUNDAY;
assertEquals(NOOS.isHoliday(date), isHoliday, date.toString());
date = date.plusDays(1);
}
}
//-------------------------------------------------------------------------
private static final HolidayCalendar PLWA = GlobalHolidayCalendars.generateWarsaw();
@DataProvider(name = "plwa")
Object[][] data_plwa() {
// based on government law data and stock exchange holidays
return new Object[][] {
{2013, mds(2013, md(1, 1), md(3, 29), md(4, 1),
md(5, 1), md(5, 3), md(5, 30), md(8, 15), md(11, 1), md(11, 11), md(12, 24), md(12, 25), md(12, 26))},
{2014, mds(2014, md(1, 1), md(1, 6), md(4, 18), md(4, 21),
md(5, 1), md(6, 19), md(8, 15), md(11, 11), md(12, 24), md(12, 25), md(12, 26))},
{2015, mds(2015, md(1, 1), md(1, 6), md(4, 3), md(4, 6),
md(5, 1), md(6, 4), md(11, 11), md(12, 24), md(12, 25), md(12, 31))},
{2016, mds(2016, md(1, 1), md(1, 6), md(3, 25), md(3, 28),
md(5, 3), md(5, 26), md(8, 15), md(11, 1), md(11, 11), md(12, 26))},
{2017, mds(2017, md(1, 6), md(4, 14), md(4, 17),
md(5, 1), md(5, 3), md(6, 15), md(8, 15), md(11, 1), md(12, 25), md(12, 26))},
};
}
@Test(dataProvider = "plwa")
public void test_plwa(int year, List<LocalDate> holidays) {
LocalDate date = LocalDate.of(year, 1, 1);
int len = date.lengthOfYear();
for (int i = 0; i < len; i++) {
boolean isHoliday = holidays.contains(date) || date.getDayOfWeek() == SATURDAY || date.getDayOfWeek() == SUNDAY;
assertEquals(PLWA.isHoliday(date), isHoliday, date.toString());
date = date.plusDays(1);
}
}
//-------------------------------------------------------------------------
private static final HolidayCalendar SEST = GlobalHolidayCalendars.generateStockholm();
@DataProvider(name = "sest")
Object[][] data_sest() {
// official data from published fixing dates
return new Object[][] {
{2014, mds(2014, md(1, 1), md(1, 6), md(4, 18), md(4, 21),
md(5, 1), md(5, 29), md(6, 6), md(6, 20), md(12, 24), md(12, 25), md(12, 26), md(12, 31))},
{2015, mds(2015, md(1, 1), md(1, 6), md(4, 3), md(4, 6),
md(5, 1), md(5, 14), md(6, 19), md(12, 24), md(12, 25), md(12, 31))},
{2016, mds(2016, md(1, 1), md(1, 6), md(3, 25), md(3, 28),
md(5, 5), md(6, 6), md(6, 24), md(12, 26))},
};
}
@Test(dataProvider = "sest")
public void test_sest(int year, List<LocalDate> holidays) {
LocalDate date = LocalDate.of(year, 1, 1);
int len = date.lengthOfYear();
for (int i = 0; i < len; i++) {
boolean isHoliday = holidays.contains(date) || date.getDayOfWeek() == SATURDAY || date.getDayOfWeek() == SUNDAY;
assertEquals(SEST.isHoliday(date), isHoliday, date.toString());
date = date.plusDays(1);
}
}
//-------------------------------------------------------------------------
private static final HolidayCalendar ZAJO = GlobalHolidayCalendars.generateJohannesburg();
@DataProvider(name = "zajo")
Object[][] data_zajo() {
// http://www.gov.za/about-sa/public-holidays
// https://web.archive.org/web/20151230214958/http://www.gov.za/about-sa/public-holidays
return new Object[][] {
{2015, mds(2015, md(1, 1), md(3, 21), md(4, 3), md(4, 6), md(4, 27), md(5, 1),
md(6, 16), md(8, 10), md(9, 24), md(12, 16), md(12, 25), md(12, 26))},
{2016, mds(2016, md(1, 1), md(3, 21), md(3, 25), md(3, 28), md(4, 27), md(5, 2),
md(6, 16), md(8, 3), md(8, 9), md(9, 24), md(12, 16), md(12, 26), md(12, 27))},
{2017, mds(2017, md(1, 1), md(1, 2), md(3, 21), md(4, 14), md(4, 17), md(4, 27), md(5, 1),
md(6, 16), md(8, 9), md(9, 25), md(12, 16), md(12, 16), md(12, 25), md(12, 26))},
};
}
@Test(dataProvider = "zajo")
public void test_zajo(int year, List<LocalDate> holidays) {
LocalDate date = LocalDate.of(year, 1, 1);
int len = date.lengthOfYear();
for (int i = 0; i < len; i++) {
boolean isHoliday = holidays.contains(date) || date.getDayOfWeek() == SATURDAY || date.getDayOfWeek() == SUNDAY;
assertEquals(ZAJO.isHoliday(date), isHoliday, date.toString());
date = date.plusDays(1);
}
}
//-------------------------------------------------------------------------
private static List<LocalDate> mds(int year, MonthDay... monthDays) {
List<LocalDate> holidays = new ArrayList<>();
for (MonthDay md : monthDays) {
holidays.add(md.atYear(year));
}
return holidays;
}
private static MonthDay md(int month, int day) {
return MonthDay.of(month, day);
}
//-------------------------------------------------------------------------
public static void coverage() {
coverPrivateConstructor(GlobalHolidayCalendars.class);
}
}