diff --git a/src/DateTimeExtensions/WorkingDays/CultureStrategies/EN_NZHolidayStrategy.cs b/src/DateTimeExtensions/WorkingDays/CultureStrategies/EN_NZHolidayStrategy.cs index 78055ddb..850e2279 100644 --- a/src/DateTimeExtensions/WorkingDays/CultureStrategies/EN_NZHolidayStrategy.cs +++ b/src/DateTimeExtensions/WorkingDays/CultureStrategies/EN_NZHolidayStrategy.cs @@ -23,6 +23,7 @@ public EN_NZHolidayStrategy() this.InnerHolidays.Add(ChristianHolidays.EasterMonday); this.InnerHolidays.Add(AnzacDay); this.InnerHolidays.Add(QueensBirthday); + this.InnerHolidays.Add(Matariki); this.InnerHolidays.Add(LabourDay); this.InnerHolidays.Add(ChristianHolidays.Christmas); this.InnerHolidays.Add(GlobalHolidays.BoxingDay); @@ -159,6 +160,42 @@ public static Holiday QueensBirthday } } + // Some Friday on June or July - Matariki + private static Holiday matariki; + private static Holiday Matariki + { + get + { + if (matariki == null) + { + // Matariki doesn't have a readily-available algorithm and its dates have been calulated up to + // 2052 by the Matariki Advisory Committee. + // See https://www.mbie.govt.nz/assets/matariki-dates-2022-to-2052-matariki-advisory-group.pdf + + var knownMatarikiOccurences = new Dictionary + { + {2022, new DayInYear(6, 24)}, + {2023, new DayInYear(7, 14)}, + {2024, new DayInYear(6, 28)}, + {2025, new DayInYear(6, 20)}, + {2026, new DayInYear(7, 10)}, + {2027, new DayInYear(6, 25)}, + {2028, new DayInYear(7, 14)}, + {2029, new DayInYear(7, 6)}, + {2030, new DayInYear(6, 21)}, + {2031, new DayInYear(7, 11)}, + {2032, new DayInYear(7, 2)}, + {2033, new DayInYear(6, 24)}, + {2034, new DayInYear(7, 7)}, + {2035, new DayInYear(6, 29)} + }; + + matariki = new YearMapHoliday("Matariki", knownMatarikiOccurences); + } + return matariki; + } + } + // 4th Monday in October - Labour Day private static Holiday labourDay; diff --git a/tests/DateTimeExtensions.Tests/en-NZCalendarTest.cs b/tests/DateTimeExtensions.Tests/en-NZCalendarTest.cs index b88e8125..61d7110a 100644 --- a/tests/DateTimeExtensions.Tests/en-NZCalendarTest.cs +++ b/tests/DateTimeExtensions.Tests/en-NZCalendarTest.cs @@ -62,6 +62,54 @@ public void DayAfterNewYearsDay() TestHoliday(workingDayCultureInfo, dateOnGregorian); } + [Test] + public void EasterAnzacClash() + { + var workingDayCultureInfo = new WorkingDayCultureInfo("en-NZ"); + + var holidays = workingDayCultureInfo.GetHolidaysOfYear(2010); + Assert.IsTrue(holidays.Any(h => h.Name == "Easter Monday")); + Assert.IsTrue(holidays.Any(h => h.Name == "Anzac Day")); + Assert.IsFalse(holidays.Any(h => h.Name == "Easter Monday/Anzac Day")); + + holidays = workingDayCultureInfo.GetHolidaysOfYear(2011); + Assert.IsFalse(holidays.Any(h => h.Name == "Easter Monday")); + Assert.IsFalse(holidays.Any(h => h.Name == "Anzac Day")); + Assert.IsTrue(holidays.Any(h => h.Name == "Easter Monday/Anzac Day")); + + holidays = workingDayCultureInfo.GetHolidaysOfYear(2012); + Assert.IsTrue(holidays.Any(h => h.Name == "Easter Monday")); + Assert.IsTrue(holidays.Any(h => h.Name == "Anzac Day")); + Assert.IsFalse(holidays.Any(h => h.Name == "Easter Monday/Anzac Day")); + + holidays = workingDayCultureInfo.GetHolidaysOfYear(2095); + Assert.IsFalse(holidays.Any(h => h.Name == "Easter Monday")); + Assert.IsFalse(holidays.Any(h => h.Name == "Anzac Day")); + Assert.IsTrue(holidays.Any(h => h.Name == "Easter Monday/Anzac Day")); + } + + [Test] + public void Matariki() + { + var workingDayCultureInfo = new WorkingDayCultureInfo("en-NZ"); + + var dateOnGregorian = new DateTime(2022, 6, 24); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2023, 7, 14); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2024, 6, 28); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2025, 6, 20); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2026, 7, 10); + + + var holidays = workingDayCultureInfo.GetHolidaysOfYear(2021); + Assert.IsFalse(holidays.Any(h => h.Name == "Matariki")); + holidays = workingDayCultureInfo.GetHolidaysOfYear(2022); + Assert.IsTrue(holidays.Any(h => h.Name == "Matariki")); + } + [Test] public void Christmas() { @@ -108,31 +156,7 @@ public void BoxingDay() TestHoliday(workingDayCultureInfo, dateOnGregorian); } - [Test] - public void EasterAnzacClash() - { - var workingDayCultureInfo = new WorkingDayCultureInfo("en-NZ"); - - var holidays = workingDayCultureInfo.GetHolidaysOfYear(2010); - Assert.IsTrue(holidays.Any(h => h.Name == "Easter Monday")); - Assert.IsTrue(holidays.Any(h => h.Name == "Anzac Day")); - Assert.IsFalse(holidays.Any(h => h.Name == "Easter Monday/Anzac Day")); - holidays = workingDayCultureInfo.GetHolidaysOfYear(2011); - Assert.IsFalse(holidays.Any(h => h.Name == "Easter Monday")); - Assert.IsFalse(holidays.Any(h => h.Name == "Anzac Day")); - Assert.IsTrue(holidays.Any(h => h.Name == "Easter Monday/Anzac Day")); - - holidays = workingDayCultureInfo.GetHolidaysOfYear(2012); - Assert.IsTrue(holidays.Any(h => h.Name == "Easter Monday")); - Assert.IsTrue(holidays.Any(h => h.Name == "Anzac Day")); - Assert.IsFalse(holidays.Any(h => h.Name == "Easter Monday/Anzac Day")); - - holidays = workingDayCultureInfo.GetHolidaysOfYear(2095); - Assert.IsFalse(holidays.Any(h => h.Name == "Easter Monday")); - Assert.IsFalse(holidays.Any(h => h.Name == "Anzac Day")); - Assert.IsTrue(holidays.Any(h => h.Name == "Easter Monday/Anzac Day")); - } private void TestHoliday(IWorkingDayCultureInfo workingDayCultureInfo, DateTime dateOnGregorian)