debian-workalendar/workalendar/tests/test_asia.py

659 lines
31 KiB
Python

from unittest.mock import patch
from datetime import date
import time
from . import GenericCalendarTest
from ..asia import (
HongKong, HongKongBank,
Japan, JapanBank, Qatar, Singapore,
SouthKorea, Taiwan, Malaysia, China, Israel
)
from ..asia.china import holidays as china_holidays
from ..exceptions import CalendarError
class ChinaTest(GenericCalendarTest):
cal_class = China
def test_year_2018(self):
holidays = self.cal.holidays_set(2018)
self.assertIn(date(2018, 1, 1), holidays) # New year
self.assertIn(date(2018, 2, 15), holidays) # Spring Festival
self.assertIn(date(2018, 2, 21), holidays) # Spring Festival
self.assertIn(date(2018, 10, 1), holidays) # National Day
self.assertIn(date(2018, 10, 7), holidays) # National Day
# Variable days
self.assertIn(date(2018, 4, 5), holidays) # Ching Ming Festival
self.assertIn(date(2018, 4, 7), holidays) # Ching Ming Festival
self.assertIn(date(2018, 4, 29), holidays) # Labour Day Holiday
self.assertIn(date(2018, 5, 1), holidays) # Labour Day Holiday
self.assertIn(date(2018, 6, 18), holidays) # Dragon Boat Festival
self.assertIn(date(2018, 9, 24), holidays) # Mid-Autumn Festival
self.assertIn(date(2018, 12, 30), holidays) # New year
self.assertIn(date(2018, 12, 31), holidays) # New year
def test_year_2019(self):
holidays = self.cal.holidays_set(2019)
self.assertNotIn(date(2019, 4, 28), holidays) # Labour Day Shift
self.assertIn(date(2019, 5, 1), holidays) # Labour Day Holiday
self.assertIn(date(2019, 5, 2), holidays) # Labour Day Holiday
self.assertIn(date(2019, 5, 3), holidays) # Labour Day Holiday
self.assertNotIn(date(2019, 5, 5), holidays) # Labour Day Shift
def test_year_2020(self):
holidays = self.cal.holidays_set(2020)
self.assertIn(date(2020, 1, 1), holidays) # New Year
self.assertIn(date(2020, 1, 25), holidays) # Spring Festival
self.assertIn(date(2020, 4, 4), holidays) # Ching Ming Festival
self.assertIn(date(2020, 4, 6), holidays) # Ching Ming Festival
self.assertIn(date(2020, 5, 1), holidays) # Labour Day Holiday
self.assertIn(date(2020, 5, 5), holidays) # Labour Day Holiday
self.assertIn(date(2020, 6, 25), holidays) # Dragon Boat Festival
self.assertIn(date(2020, 6, 27), holidays) # Dragon Boat Festival
self.assertIn(date(2020, 10, 1), holidays) # National Day
self.assertIn(date(2020, 10, 8), holidays) # National Day
self.assertNotIn(date(2020, 1, 19), holidays) # Spring Festival Shift
self.assertNotIn(date(2020, 2, 1), holidays) # Spring Festival Shift
self.assertNotIn(date(2020, 4, 26), holidays) # Labour Day Shift
self.assertNotIn(date(2020, 5, 9), holidays) # Labour Day Shift
self.assertNotIn(date(2020, 6, 28), holidays) # Dragon Boat Shift
self.assertNotIn(date(2020, 9, 27), holidays) # National Day Shift
self.assertNotIn(date(2020, 10, 10), holidays) # National Day Shift
def test_missing_holiday_year(self):
save_2018 = china_holidays[2018]
del china_holidays[2018]
with self.assertRaises(CalendarError):
self.cal.holidays_set(2018)
china_holidays[2018] = save_2018
def test_warning(self):
year = date.today().year
with patch('warnings.warn') as patched:
self.cal.get_calendar_holidays(year)
patched.assert_called_with(
'Support years 2018-2020 currently, need update every year.'
)
def test_is_working_day(self):
# It's a SAT, but it's a working day this year
self.assertTrue(self.cal.is_working_day(date(2019, 2, 2)))
# It's a SUN, but it's a working day this year
self.assertTrue(self.cal.is_working_day(date(2019, 2, 3)))
def test_add_working_days(self):
# Normally, February 1st + 1 working day would be on February 4th
# Because 2nd and 3rd are on SAT and SUN.
self.assertEqual(
self.cal.add_working_days(date(2019, 2, 1), 1),
date(2019, 2, 2)
)
def test_sub_working_days(self):
# Normally, February 4th - 1 working day would be on February 1st
# Because 2nd and 3rd are on SAT and SUN.
self.assertEqual(
self.cal.sub_working_days(date(2019, 2, 4), 1),
date(2019, 2, 3)
)
class HongKongTest(GenericCalendarTest):
cal_class = HongKong
def test_year_2010(self):
# Interesting because Christmas fell on a Saturday and CNY fell
# on a Sunday, so didn't roll, and Ching Ming was on the same day
# as Easter Monday
# https://www.gov.hk/en/about/abouthk/holiday/2010.htm
holidays = self.cal.holidays_set(2010)
self.assertIn(date(2010, 1, 1), holidays) # New Year
self.assertIn(date(2010, 2, 13), holidays) # Chinese new year (shift)
self.assertIn(date(2010, 2, 15), holidays) # Chinese new year
self.assertIn(date(2010, 2, 16), holidays) # Chinese new year
self.assertNotIn(date(2010, 2, 17), holidays) # Not Chinese new year
self.assertIn(date(2010, 4, 2), holidays) # Good Friday
self.assertIn(date(2010, 4, 3), holidays) # Day after Good Friday
self.assertIn(date(2010, 4, 5), holidays) # Easter Monday
self.assertIn(date(2010, 4, 6), holidays) # Ching Ming (shifted)
self.assertIn(date(2010, 5, 1), holidays) # Labour Day
self.assertIn(date(2010, 5, 21), holidays) # Buddha's Birthday
self.assertIn(date(2010, 6, 16), holidays) # Tuen Ng Festival
self.assertIn(date(2010, 7, 1), holidays) # HK SAR Establishment Day
self.assertIn(date(2010, 9, 23), holidays) # Day after Mid-Autumn
self.assertIn(date(2010, 10, 1), holidays) # National Day
self.assertIn(date(2010, 10, 16), holidays) # Chung Yeung Festival
self.assertIn(date(2010, 12, 25), holidays) # Christmas Day
self.assertIn(date(2010, 12, 27), holidays) # Boxing Day (shifted)
def test_year_2013(self):
# https://www.gov.hk/en/about/abouthk/holiday/2013.htm
holidays = self.cal.holidays_set(2013)
self.assertIn(date(2013, 1, 1), holidays) # New Year
self.assertIn(date(2013, 2, 11), holidays) # Chinese new year
self.assertIn(date(2013, 2, 12), holidays) # Chinese new year
self.assertIn(date(2013, 2, 13), holidays) # Chinese new year
self.assertIn(date(2013, 3, 29), holidays) # Good Friday
self.assertIn(date(2013, 3, 30), holidays) # Day after Good Friday
self.assertIn(date(2013, 4, 1), holidays) # Easter Monday
self.assertIn(date(2013, 4, 4), holidays) # Ching Ming
self.assertIn(date(2013, 5, 1), holidays) # Labour Day
self.assertIn(date(2013, 5, 17), holidays) # Buddha's Birthday
self.assertIn(date(2013, 6, 12), holidays) # Tuen Ng Festival
self.assertIn(date(2013, 7, 1), holidays) # HK SAR Establishment Day
self.assertIn(date(2013, 9, 20), holidays) # Day after Mid-Autumn
self.assertIn(date(2013, 10, 1), holidays) # National Day
self.assertIn(date(2013, 10, 14), holidays) # Chung Yeung Festival
self.assertIn(date(2013, 12, 25), holidays) # Christmas Day
self.assertIn(date(2013, 12, 26), holidays) # Boxing Day
def test_year_2016(self):
# https://www.gov.hk/en/about/abouthk/holiday/2016.htm
holidays = self.cal.holidays_set(2016)
self.assertIn(date(2016, 1, 1), holidays) # New Year
self.assertIn(date(2016, 2, 8), holidays) # Chinese new year
self.assertIn(date(2016, 2, 9), holidays) # Chinese new year
self.assertIn(date(2016, 2, 10), holidays) # Chinese new year
self.assertIn(date(2016, 3, 25), holidays) # Good Friday
self.assertIn(date(2016, 3, 26), holidays) # Day after Good Friday
self.assertIn(date(2016, 3, 28), holidays) # Easter Monday
self.assertIn(date(2016, 4, 4), holidays) # Ching Ming
self.assertIn(date(2016, 5, 1), holidays) # Labour Day (SUN)
self.assertIn(date(2016, 5, 2), holidays) # Labour Day (shifted)
self.assertIn(date(2016, 5, 14), holidays) # Buddha's Birthday
self.assertIn(date(2016, 6, 9), holidays) # Tuen Ng Festival
self.assertIn(date(2016, 7, 1), holidays) # HK SAR Establishment Day
self.assertIn(date(2016, 9, 16), holidays) # Day after Mid-Autumn
self.assertIn(date(2016, 10, 1), holidays) # National Day
self.assertIn(date(2016, 10, 10), holidays) # Chung Yeung Festival
self.assertIn(date(2016, 12, 25), holidays) # Christmas Day
self.assertIn(date(2016, 12, 26), holidays) # Christmas + Boxing Day
self.assertIn(date(2016, 12, 27), holidays) # Second weekday
def test_year_2017(self):
# https://www.gov.hk/en/about/abouthk/holiday/2017.htm
holidays = self.cal.holidays_set(2017)
self.assertIn(date(2017, 1, 2), holidays) # New Year (shifted)
self.assertIn(date(2017, 1, 28), holidays) # Chinese new year
self.assertIn(date(2017, 1, 30), holidays) # Chinese new year
self.assertIn(date(2017, 1, 31), holidays) # Chinese new year
self.assertIn(date(2017, 4, 4), holidays) # Ching Ming
self.assertIn(date(2017, 4, 14), holidays) # Good Friday
self.assertIn(date(2017, 4, 15), holidays) # Day after Good Friday
self.assertIn(date(2017, 4, 17), holidays) # Easter Monday
self.assertIn(date(2017, 5, 1), holidays) # Labour Day
self.assertIn(date(2017, 5, 3), holidays) # Buddha's Birthday
self.assertIn(date(2017, 5, 30), holidays) # Tuen Ng Festival
self.assertIn(date(2017, 7, 1), holidays) # HK SAR Establishment Day
self.assertIn(date(2017, 10, 2), holidays) # National Day (shifted)
self.assertIn(date(2017, 10, 5), holidays) # Day after Mid-Autumn
self.assertIn(date(2017, 10, 28), holidays) # Chung Yeung Festival
self.assertIn(date(2017, 12, 25), holidays) # Christmas Day
self.assertIn(date(2017, 12, 26), holidays) # Boxing Day
def test_chingming_festival(self):
# This is the same as the Taiwan test, just different spelling
# Could move this into a Core test
self.assertIn(date(2005, 4, 5), self.cal.holidays_set(2005))
self.assertIn(date(2006, 4, 5), self.cal.holidays_set(2006))
self.assertIn(date(2007, 4, 5), self.cal.holidays_set(2007))
self.assertIn(date(2008, 4, 4), self.cal.holidays_set(2008))
self.assertIn(date(2010, 4, 5), self.cal.holidays_set(2010))
self.assertIn(date(2011, 4, 5), self.cal.holidays_set(2011))
self.assertIn(date(2012, 4, 4), self.cal.holidays_set(2012))
self.assertIn(date(2013, 4, 4), self.cal.holidays_set(2013))
self.assertIn(date(2014, 4, 5), self.cal.holidays_set(2014))
self.assertIn(date(2015, 4, 4), self.cal.holidays_set(2015))
self.assertIn(date(2016, 4, 4), self.cal.holidays_set(2016))
self.assertIn(date(2017, 4, 4), self.cal.holidays_set(2017))
self.assertIn(date(2018, 4, 5), self.cal.holidays_set(2018))
def test_holidays_2020(self):
# https://www.gov.hk/en/about/abouthk/holiday/2020.htm
holidays = self.cal.holidays_set(2020)
self.assertIn(date(2020, 1, 1), holidays) # New Year (shifted)
self.assertIn(date(2020, 1, 25), holidays) # Chinese new year
self.assertIn(date(2020, 1, 27), holidays) # Chinese new year
self.assertIn(date(2020, 1, 28), holidays) # Chinese new year
self.assertIn(date(2020, 4, 4), holidays) # Ching Ming
self.assertIn(date(2020, 4, 10), holidays) # Good Friday
self.assertIn(date(2020, 4, 11), holidays) # Day after Good Friday
self.assertIn(date(2020, 4, 13), holidays) # Easter Monday
self.assertIn(date(2020, 4, 30), holidays) # Buddha's Birthday
self.assertIn(date(2020, 5, 1), holidays) # Labour Day
self.assertIn(date(2020, 6, 25), holidays) # Tuen Ng Festival
self.assertIn(date(2020, 7, 1), holidays) # HK SAR Establishment Day
self.assertIn(date(2020, 10, 1), holidays) # National Day
self.assertIn(date(2020, 10, 2), holidays) # Day after Mid-Autumn
self.assertIn(date(2020, 10, 26), holidays) # Chung Yeung Festival
self.assertIn(date(2020, 12, 25), holidays) # Christmas Day
self.assertIn(date(2020, 12, 26), holidays) # Boxing Day
# Special: Boxing day is not shifted, because it's not a SUN
self.assertNotIn(date(2020, 12, 28), holidays)
def test_are_saturdays_working_days(self):
# Let's start with february 6th.
start = date(2020, 2, 6)
# If SAT was a non-working day, it would have been the 13th.
self.assertEqual(
self.cal.add_working_days(start, 5),
date(2020, 2, 12)
)
class HongKongBankTest(HongKongTest):
cal_class = HongKongBank
def test_are_saturdays_working_days(self):
# Let's start with february 6th.
start = date(2020, 2, 6)
# If SAT and SUN are non-working days
self.assertEqual(
self.cal.add_working_days(start, 5),
date(2020, 2, 13)
)
class JapanTest(GenericCalendarTest):
cal_class = Japan
def test_year_2013(self):
holidays = self.cal.holidays_set(2013)
self.assertIn(date(2013, 1, 1), holidays) # new year
self.assertIn(date(2013, 2, 11), holidays) # Foundation Day
self.assertIn(date(2013, 3, 20), holidays) # Vernal Equinox Day
self.assertIn(date(2013, 4, 29), holidays) # Showa Day
self.assertIn(date(2013, 5, 3), holidays) # Constitution Memorial Day
self.assertIn(date(2013, 5, 4), holidays) # Greenery Day
self.assertIn(date(2013, 5, 5), holidays) # Children's Day
self.assertIn(date(2013, 9, 23), holidays) # Autumnal Equinox Day
self.assertIn(date(2013, 11, 3), holidays) # Culture Day
self.assertIn(date(2013, 11, 23), holidays) # Labour Thanksgiving Day
self.assertIn(date(2013, 12, 23), holidays) # The Emperor's Birthday
# Variable days
self.assertIn(date(2013, 1, 14), holidays) # Coming of Age Day
self.assertIn(date(2013, 7, 15), holidays) # Marine Day
self.assertIn(date(2013, 9, 16), holidays) # Respect-for-the-Aged Day
self.assertIn(date(2013, 10, 14), holidays) # Health and Sports Day
def test_year_2016(self):
# Before 2016, no Mountain Day
holidays = self.cal.holidays_set(2014)
self.assertNotIn(date(2014, 8, 11), holidays) # Mountain Day
holidays = self.cal.holidays_set(2015)
self.assertNotIn(date(2015, 8, 11), holidays) # Mountain Day
# After 2016, yes
holidays = self.cal.holidays_set(2016)
self.assertIn(date(2016, 8, 11), holidays) # Mountain Day
holidays = self.cal.holidays_set(2017)
self.assertIn(date(2017, 8, 11), holidays) # Mountain Day
def test_year_2019(self):
holidays = self.cal.holidays_set(2019)
self.assertIn(date(2019, 1, 14), holidays) # Coming of Age Day
self.assertIn(date(2019, 5, 1), holidays) # Coronation Day
self.assertIn(date(2019, 5, 6), holidays) # Children's Day
self.assertIn(date(2019, 8, 12), holidays) # Mountain Day Observed
self.assertIn(date(2019, 11, 4), holidays) # Culture Day Observed
def test_year_2020(self):
holidays = self.cal.holidays_set(2020)
self.assertIn(date(2020, 7, 23), holidays) # Marine Day
self.assertIn(date(2020, 7, 24), holidays) # Sports Day
self.assertIn(date(2020, 8, 10), holidays) # Mountain Day adjustment
self.assertNotIn(date(2020, 8, 11), holidays) # Mountain Day
self.assertNotIn(date(2020, 12, 31), holidays) # New Year's Bank Day
class JapanBankTest(GenericCalendarTest):
cal_class = JapanBank
def test_year_2019(self):
holidays = self.cal.holidays_set(2019)
self.assertIn(date(2019, 1, 2), holidays) # New Year's Bank Day
self.assertIn(date(2019, 1, 3), holidays) # New Year's Bank Day
self.assertIn(date(2019, 1, 14), holidays) # Coming of Age Day
self.assertIn(date(2019, 5, 3), holidays) # Constitution Memorial Day
self.assertIn(date(2019, 11, 4), holidays) # Culture Day Observed
self.assertIn(date(2019, 12, 31), holidays) # New Year's Bank Day
def test_year_2020(self):
holidays = self.cal.holidays_set(2020)
self.assertIn(date(2020, 1, 2), holidays) # New Year's Bank Day
self.assertIn(date(2020, 1, 3), holidays) # New Year's Bank Day
self.assertIn(date(2020, 12, 31), holidays) # New Year's Bank Day
self.assertIn(date(2020, 8, 10), holidays) # Mountain Day adjustment
self.assertNotIn(date(2020, 8, 11), holidays) # Mountain Day
self.assertIn(date(2020, 7, 23), holidays) # Marine Day
self.assertIn(date(2020, 7, 24), holidays) # Sports Day
class MalaysiaTest(GenericCalendarTest):
cal_class = Malaysia
def test_year_2013(self):
holidays = self.cal.holidays_set(2013)
self.assertIn(date(2013, 1, 1), holidays) # New Year's Day
self.assertIn(date(2013, 1, 28), holidays) # Thaipusam
self.assertIn(date(2013, 2, 1), holidays) # Federal Territory Day
self.assertIn(date(2013, 2, 11), holidays) # 2nd day of Lunar NY
self.assertIn(date(2013, 2, 12), holidays) # 1st day (Sun lieu)
self.assertIn(date(2013, 5, 1), holidays) # Workers' Day
self.assertIn(date(2013, 5, 24), holidays) # Vesak Day
self.assertIn(date(2013, 8, 8), holidays) # 1st day eid-al-fitr
self.assertIn(date(2013, 8, 9), holidays) # 2nd day eid-al-fitr
self.assertIn(date(2013, 8, 31), holidays) # National Day
self.assertIn(date(2013, 9, 16), holidays) # Malaysia Day
self.assertIn(date(2013, 10, 15), holidays) # Hari Raya Haji
self.assertIn(date(2013, 11, 2), holidays) # Deepavali
self.assertIn(date(2013, 11, 5), holidays) # Islamic New Year
self.assertIn(date(2013, 12, 25), holidays) # Xmas
def test_year_2012(self):
holidays = self.cal.holidays_set(2012)
self.assertIn(date(2012, 1, 1), holidays) # New Year's Day
self.assertIn(date(2012, 1, 24), holidays) # Federal Territory Day
self.assertIn(date(2012, 2, 1), holidays) # 2nd day of Lunar NY
self.assertIn(date(2012, 5, 1), holidays) # 1st day (Sun lieu)
self.assertIn(date(2012, 5, 5), holidays) # Workers' Day
self.assertIn(date(2012, 8, 19), holidays) # 1st day eid-al-fitr
self.assertIn(date(2012, 8, 20), holidays) # 2nd day eid-al-fitr
self.assertIn(date(2012, 8, 31), holidays) # National Day
self.assertIn(date(2012, 9, 16), holidays) # Malaysia Day
self.assertIn(date(2012, 10, 26), holidays) # Hari Raya Haji
self.assertIn(date(2012, 11, 13), holidays) # Islamic New Year
self.assertIn(date(2012, 11, 15), holidays) # Deepavali
self.assertIn(date(2012, 12, 25), holidays) # Xmas
def test_nuzul_al_quran(self):
holidays = self.cal.holidays_set(2017)
self.assertIn(date(2017, 6, 12), holidays)
holidays = self.cal.holidays_set(2018)
self.assertIn(date(2018, 6, 1), holidays)
def test_fix_deepavali_2018(self):
holidays = self.cal.holidays(2018)
holidays = dict(holidays)
deepavali = date(2018, 11, 6)
self.assertIn(deepavali, holidays)
self.assertEqual(holidays[deepavali], "Deepavali")
def test_msia_thaipusam(self):
years = self.cal.MSIA_THAIPUSAM.keys()
# we only have them for years 2010-2021
self.assertEqual(
set(years),
set(range(2010, 2022))
)
def test_missing_deepavali(self):
save_2020 = self.cal.MSIA_DEEPAVALI[2020]
del self.cal.MSIA_DEEPAVALI[2020]
with self.assertRaises(KeyError):
self.cal.holidays(2020)
# Back to normal, to avoid breaking further tests
self.cal.MSIA_DEEPAVALI[2020] = save_2020
def test_missing_thaipusam(self):
save_2020 = self.cal.MSIA_THAIPUSAM[2020]
del self.cal.MSIA_THAIPUSAM[2020]
with self.assertRaises(KeyError):
self.cal.holidays(2020)
# Back to normal, to avoid breaking further tests
self.cal.MSIA_THAIPUSAM[2020] = save_2020
class QatarTest(GenericCalendarTest):
cal_class = Qatar
def test_year_2013(self):
holidays = self.cal.holidays_set(2013)
self.assertIn(date(2013, 7, 9), holidays) # start ramadan
# warning, the official date was (2013, 8, 10)
self.assertIn(date(2013, 8, 8), holidays) # eid al fitr
# The official date was (2013, 10, 14)
self.assertIn(date(2013, 10, 15), holidays) # eid al adha
self.assertIn(date(2013, 10, 16), holidays) # eid al adha
self.assertIn(date(2013, 10, 17), holidays) # eid al adha
self.assertIn(date(2013, 10, 18), holidays) # eid al adha
self.assertIn(date(2013, 12, 18), holidays) # National Day
def test_weekend(self):
# In Qatar, Week-end days are Friday / Sunday.
weekend_day = date(2017, 5, 12) # This is a Friday
non_weekend_day = date(2017, 5, 14) # This is a Sunday
self.assertFalse(self.cal.is_working_day(weekend_day))
self.assertTrue(self.cal.is_working_day(non_weekend_day))
class SingaporeTest(GenericCalendarTest):
cal_class = Singapore
def test_CNY_2010(self):
holidays = self.cal.holidays_set(2010)
self.assertIn(date(2010, 2, 14), holidays) # CNY1
self.assertIn(date(2010, 2, 15), holidays) # CNY2
self.assertIn(date(2010, 2, 16), holidays) # Rolled day for CNY
def test_year_2013(self):
holidays = self.cal.holidays_set(2013)
self.assertIn(date(2013, 1, 1), holidays) # New Year
self.assertIn(date(2013, 2, 10), holidays) # CNY1
self.assertIn(date(2013, 2, 11), holidays) # CNY2
self.assertIn(date(2013, 2, 12), holidays) # Rolled day for CNY
self.assertIn(date(2013, 3, 29), holidays) # Good Friday
self.assertIn(date(2013, 5, 1), holidays) # Labour Day
self.assertIn(date(2013, 5, 24), holidays) # Vesak Day
self.assertIn(date(2013, 8, 8), holidays) # Hari Raya Puasa
self.assertIn(date(2013, 8, 9), holidays) # National Day
self.assertIn(date(2013, 10, 15), holidays) # Hari Raya Haji
self.assertIn(date(2013, 11, 3), holidays) # Deepavali
self.assertIn(date(2013, 11, 4), holidays) # Deepavali shift
self.assertIn(date(2013, 12, 25), holidays) # Christmas Day
def test_year_2018(self):
holidays = self.cal.holidays_set(2018)
self.assertIn(date(2018, 1, 1), holidays) # New Year
self.assertIn(date(2018, 2, 16), holidays) # CNY
self.assertIn(date(2018, 2, 17), holidays) # CNY
self.assertIn(date(2018, 3, 30), holidays) # Good Friday
self.assertIn(date(2018, 5, 1), holidays) # Labour Day
self.assertIn(date(2018, 5, 29), holidays) # Vesak Day
self.assertIn(date(2018, 6, 15), holidays) # Hari Raya Puasa
self.assertIn(date(2018, 8, 9), holidays) # National Day
self.assertIn(date(2018, 8, 22), holidays) # Hari Raya Haji
self.assertIn(date(2018, 11, 6), holidays) # Deepavali
self.assertIn(date(2018, 12, 25), holidays) # Christmas Day
def test_fixed_holiday_shift(self):
# Labour Day was on a Sunday in 2016
holidays = self.cal.holidays_set(2016)
# Labour Day (sunday)
self.assertIn(date(2016, 5, 1), holidays)
# Shifted day (Monday)
self.assertIn(date(2016, 5, 2), holidays)
def test_deepavali(self):
# At the moment, we have values for deepavali only until year 2021
for year in range(2000, 2022):
self.assertIn(year, self.cal.DEEPAVALI)
def test_deepavali_current_year(self):
# This is a regression test. We should be able to have the deepavali
# value until this year and probably a few years in the future
current_year = date.today().year
self.assertIn(current_year, self.cal.DEEPAVALI)
class SouthKoreaTest(GenericCalendarTest):
cal_class = SouthKorea
def test_year_2013(self):
holidays = self.cal.holidays_set(2013)
self.assertIn(date(2013, 1, 1), holidays) # new year
self.assertIn(date(2013, 3, 1), holidays) # Independence day
self.assertIn(date(2013, 5, 5), holidays) # children's day
self.assertIn(date(2013, 6, 6), holidays) # Memorial day
self.assertIn(date(2013, 8, 15), holidays) # Liberation day
self.assertIn(date(2013, 10, 3), holidays) # National Foundation Day
self.assertIn(date(2013, 10, 9), holidays) # Hangul Day
self.assertIn(date(2013, 12, 25), holidays) # Christmas
# Variable days
self.assertIn(date(2013, 2, 9), holidays)
self.assertIn(date(2013, 2, 10), holidays)
self.assertIn(date(2013, 2, 11), holidays)
self.assertIn(date(2013, 5, 17), holidays)
self.assertIn(date(2013, 9, 18), holidays)
self.assertIn(date(2013, 9, 19), holidays)
self.assertIn(date(2013, 9, 20), holidays)
class TaiwanTest(GenericCalendarTest):
cal_class = Taiwan
def test_year_2013(self):
holidays = self.cal.holidays_set(2013)
self.assertIn(date(2013, 1, 1), holidays) # New Year
self.assertIn(date(2013, 2, 9), holidays) # Chinese new year's eve
self.assertIn(date(2013, 2, 10), holidays) # Chinese new year
self.assertIn(date(2013, 2, 11), holidays) # Spring Festival
self.assertIn(date(2013, 2, 12), holidays) # Spring Festival
self.assertIn(date(2013, 2, 28), holidays) # 228 Peace Memorial Day
self.assertIn(date(2013, 4, 4), holidays) # Children's Day
self.assertIn(date(2013, 6, 12), holidays) # Dragon Boat Festival
self.assertIn(date(2013, 9, 19), holidays) # Mid-Autumn Festival
self.assertIn(date(2013, 10, 10), holidays) # National Day
def test_qingming_festival(self):
self.assertIn(date(2001, 4, 5), self.cal.holidays_set(2001))
self.assertIn(date(2002, 4, 5), self.cal.holidays_set(2002))
self.assertIn(date(2005, 4, 5), self.cal.holidays_set(2005))
self.assertIn(date(2006, 4, 5), self.cal.holidays_set(2006))
self.assertIn(date(2007, 4, 5), self.cal.holidays_set(2007))
self.assertIn(date(2008, 4, 4), self.cal.holidays_set(2008))
self.assertIn(date(2010, 4, 5), self.cal.holidays_set(2010))
self.assertIn(date(2011, 4, 5), self.cal.holidays_set(2011))
self.assertIn(date(2012, 4, 4), self.cal.holidays_set(2012))
self.assertIn(date(2013, 4, 4), self.cal.holidays_set(2013))
self.assertIn(date(2014, 4, 4), self.cal.holidays_set(2014))
class IsraelTest(GenericCalendarTest):
cal_class = Israel
def test_holidays_2017(self):
calculated_holidays = self.cal.holidays_set(2017)
known_holidays = {
date(2017, 4, 10), # Passover (Pesach)
date(2017, 4, 11),
date(2017, 4, 16),
date(2017, 4, 17),
date(2017, 5, 1), # Independence Day (Yom Ha-Atzmaut)
date(2017, 5, 2),
date(2017, 9, 20), # Jewish New Year (Rosh Ha-Shana)
date(2017, 9, 21),
date(2017, 9, 22),
date(2017, 9, 29), # Yom Kippur
date(2017, 9, 30),
date(2017, 10, 4), # Sukkot
date(2017, 10, 5),
date(2017, 10, 11),
date(2017, 10, 12),
date(2017, 5, 30), # Shavuot
date(2017, 5, 31),
}
self.assertEqual(calculated_holidays, known_holidays)
def test_holidays_2018(self):
calculated_holidays = self.cal.holidays_set(2018)
known_holidays = {
date(2018, 3, 30), # Passover (Pesach)
date(2018, 3, 31),
date(2018, 4, 5),
date(2018, 4, 6),
date(2018, 4, 18), # Independence Day (Yom Ha-Atzmaut)
date(2018, 4, 19),
date(2018, 9, 9), # Rosh Hashana
date(2018, 9, 10),
date(2018, 9, 11),
date(2018, 9, 18), # Yom Kippur
date(2018, 9, 19),
date(2018, 9, 23), # Sukkot
date(2018, 9, 24),
date(2018, 9, 30),
date(2018, 10, 1),
date(2018, 5, 19), # Shavuot
date(2018, 5, 20),
}
self.assertEqual(calculated_holidays, known_holidays)
def test_holidays_2019(self):
calculated_holidays = self.cal.holidays_set(2019)
known_holidays = {
date(2019, 4, 19), # Passover (Pesach)
date(2019, 4, 20), # Passover (Pesach)
date(2019, 4, 25), # Passover (Pesach)
date(2019, 4, 26), # Passover (Pesach)
date(2019, 5, 8), # Independence Day (Yom Ha-Atzmaut)
date(2019, 5, 9), # Independence Day (Yom Ha-Atzmaut)
date(2019, 6, 8), # Shavuot
date(2019, 6, 9), # Shavuot
date(2019, 9, 29), # Rosh Hashana
date(2019, 9, 30), # Rosh Hashana
date(2019, 10, 1), # Rosh Hashana
date(2019, 10, 8), # Yom Kippur
date(2019, 10, 9), # Yom Kippur
date(2019, 10, 13), # Sukkot
date(2019, 10, 14), # Sukkot
date(2019, 10, 20), # Sukkot
date(2019, 10, 21), # Sukkot
}
self.assertEqual(calculated_holidays, known_holidays)
def test_holidays_2020(self):
calculated_holidays = self.cal.holidays_set(2020)
known_holidays = {
date(2020, 9, 18), # Rosh Hashana Eve
date(2020, 9, 19), # Rosh Hashana A
date(2020, 9, 20), # Rosh Hashana B
date(2020, 9, 27), # Kippur Eve
date(2020, 9, 28), # Kippur
date(2020, 10, 2), # Sukot A Eve
date(2020, 10, 3), # Sukot A
date(2020, 10, 9), # Sukot B Eve
date(2020, 10, 10), # Sukot B
date(2020, 4, 8), # Pesach A Eve
date(2020, 4, 9), # Pesach A
date(2020, 4, 14), # Pesach B Eve
date(2020, 4, 15), # Pesach B
date(2020, 4, 28), # Independence Day Eve
date(2020, 4, 29), # Independence Day
date(2020, 5, 28), # Shavuot Eve
date(2020, 5, 29), # Shavuot
}
self.assertEqual(calculated_holidays, known_holidays)
def test_is_holiday_performance(self):
random_date = date(2019, 10, 9)
japan_cal = Japan()
timer = time.time()
for i in range(30):
japan_cal.is_holiday(random_date)
japan_time = time.time() - timer
timer = time.time()
for i in range(30):
self.cal.is_holiday(random_date)
israel_time = time.time() - timer
self.assertGreater(japan_time * 3, israel_time)