diff --git a/src/DateTimeExtensions/WorkingDays/CultureStrategies/EN_AUHolidayStrategy.cs b/src/DateTimeExtensions/WorkingDays/CultureStrategies/EN_AUHolidayStrategy.cs index 9f305126..3feeac4b 100644 --- a/src/DateTimeExtensions/WorkingDays/CultureStrategies/EN_AUHolidayStrategy.cs +++ b/src/DateTimeExtensions/WorkingDays/CultureStrategies/EN_AUHolidayStrategy.cs @@ -40,6 +40,7 @@ public EN_AUHolidayStrategy() this.InnerHolidays.Add(ChristianHolidays.EasterMonday); this.InnerHolidays.Add(AnzacDay); this.InnerHolidays.Add(QueensBirthday); + this.InnerHolidays.Add(KingsBirthday); this.InnerHolidays.Add(LabourDay); this.InnerHolidays.Add(ChristianHolidays.Christmas); this.InnerHolidays.Add(GlobalHolidays.BoxingDay); @@ -133,7 +134,7 @@ public static Holiday AnzacDay } } - //2nd Monday in June - Queen's Birthday + //2nd Monday in June (2022 and earlier) - Queen's Birthday private static Holiday queensBirthday; public static Holiday QueensBirthday @@ -144,11 +145,29 @@ public static Holiday QueensBirthday { queensBirthday = new NthDayOfWeekInMonthHoliday("Queen's Birthday", 2, DayOfWeek.Monday, 6, CountDirection.FromFirst); + queensBirthday = new YearDependantHoliday(year => (year <= 2022), queensBirthday); } return queensBirthday; } } + //2nd Monday in June (2023 and later) - Kings's Birthday + private static Holiday kingsBirthday; + + public static Holiday KingsBirthday + { + get + { + if (kingsBirthday == null) + { + kingsBirthday = new NthDayOfWeekInMonthHoliday("King's Birthday", 2, DayOfWeek.Monday, 6, + CountDirection.FromFirst); + kingsBirthday = new YearDependantHoliday(year => (year >= 2023), kingsBirthday); + } + return kingsBirthday; + } + } + //1nd Monday in October - Labour Day private static Holiday labourDay; diff --git a/src/DateTimeExtensions/WorkingDays/CultureStrategies/EN_NZHolidayStrategy.cs b/src/DateTimeExtensions/WorkingDays/CultureStrategies/EN_NZHolidayStrategy.cs index 17b0d524..6135c137 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(KingsBirthday); this.InnerHolidays.Add(Matariki); this.InnerHolidays.Add(LabourDay); this.InnerHolidays.Add(ChristianHolidays.Christmas); @@ -144,7 +145,7 @@ public static Holiday AnzacDay } } - // 1st Monday in June - Queen's Birthday + // 1st Monday in June (2022 and earlier) - Queen's Birthday private static Holiday queensBirthday; public static Holiday QueensBirthday @@ -155,11 +156,29 @@ public static Holiday QueensBirthday { queensBirthday = new NthDayOfWeekInMonthHoliday("Queen's Birthday", 1, DayOfWeek.Monday, 6, CountDirection.FromFirst); + queensBirthday = new YearDependantHoliday(year => (year <= 2022), queensBirthday); } return queensBirthday; } } + // 1st Monday in June (2023 and later) - King's Birthday + private static Holiday kingsBirthday; + + public static Holiday KingsBirthday + { + get + { + if (kingsBirthday == null) + { + kingsBirthday = new NthDayOfWeekInMonthHoliday("King's Birthday", 1, DayOfWeek.Monday, 6, + CountDirection.FromFirst); + kingsBirthday = new YearDependantHoliday(year => (year >= 2023), kingsBirthday); + } + return kingsBirthday; + } + } + // Some Friday on June or July - Matariki private static Holiday matariki; private static Holiday Matariki diff --git a/tests/DateTimeExtensions.Tests/en-AUCalendarTest.cs b/tests/DateTimeExtensions.Tests/en-AUCalendarTest.cs new file mode 100644 index 00000000..44396f73 --- /dev/null +++ b/tests/DateTimeExtensions.Tests/en-AUCalendarTest.cs @@ -0,0 +1,161 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using DateTimeExtensions.WorkingDays; +using DateTimeExtensions.WorkingDays.CultureStrategies; + + +namespace DateTimeExtensions.Tests +{ + [TestFixture] + public class en_AUCalendarTest + { + [Test] + public void NewYearsDay() + { + var workingDayCultureInfo = new WorkingDayCultureInfo("en-AU"); + + var dateOnGregorian = new DateTime(2011, 1, 1); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2012, 1, 1); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2013, 1, 1); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2014, 1, 1); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2015, 1, 1); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2016, 1, 1); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2017, 1, 1); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2018, 1, 1); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2019, 1, 1); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2020, 1, 1); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + } + + [Test] + public void AustraliaDay() + { + var workingDayCultureInfo = new WorkingDayCultureInfo("en-AU"); + + var dateOnGregorian = new DateTime(2013, 1, 26); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2014, 1, 26); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2015, 1, 26); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2016, 1, 26); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2017, 1, 26); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2018, 1, 26); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2019, 1, 26); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2020, 1, 26); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + } + + [Test] + public void MonarchsBirthday() + { + var workingDayCultureInfo = new WorkingDayCultureInfo("en-AU"); + + var dateOnGregorian = new DateTime(2011, 6, 13); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2015, 6, 8); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2016, 6, 13); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2019, 6, 10); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2022, 6, 13); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2023, 6, 12); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2024, 6, 10); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2025, 6, 9); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2026, 6, 8); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2027, 6, 14); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + + var holidays = workingDayCultureInfo.GetHolidaysOfYear(2021); + Assert.IsTrue(holidays.Any(h => h.Name == "Queen's Birthday")); + holidays = workingDayCultureInfo.GetHolidaysOfYear(2022); + Assert.IsTrue(holidays.Any(h => h.Name == "Queen's Birthday")); + holidays = workingDayCultureInfo.GetHolidaysOfYear(2023); + Assert.IsTrue(holidays.Any(h => h.Name == "King's Birthday")); + holidays = workingDayCultureInfo.GetHolidaysOfYear(2024); + Assert.IsTrue(holidays.Any(h => h.Name == "King's Birthday")); + holidays = workingDayCultureInfo.GetHolidaysOfYear(2025); + Assert.IsTrue(holidays.Any(h => h.Name == "King's Birthday")); + holidays = workingDayCultureInfo.GetHolidaysOfYear(2026); + Assert.IsTrue(holidays.Any(h => h.Name == "King's Birthday")); + } + + + [Test] + public void Christmas() + { + var workingDayCultureInfo = new WorkingDayCultureInfo("en-AU"); + + var dateOnGregorian = new DateTime(2013, 12, 25); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2014, 12, 25); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2015, 12, 25); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2016, 12, 26); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2017, 12, 25); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2018, 12, 25); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2019, 12, 25); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2020, 12, 25); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + } + + [Test] + public void BoxingDay() + { + var workingDayCultureInfo = new WorkingDayCultureInfo("en-AU"); + + var dateOnGregorian = new DateTime(2013, 12, 26); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2014, 12, 26); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2015, 12, 28); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2016, 12, 26); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2017, 12, 26); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2018, 12, 26); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2019, 12, 26); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2020, 12, 28); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + } + + + + + private void TestHoliday(IWorkingDayCultureInfo workingDayCultureInfo, DateTime dateOnGregorian) + { + var isHoliday = workingDayCultureInfo.IsHoliday(dateOnGregorian); + Assert.IsTrue(isHoliday); + } + } +} \ No newline at end of file diff --git a/tests/DateTimeExtensions.Tests/en-NZCalendarTest.cs b/tests/DateTimeExtensions.Tests/en-NZCalendarTest.cs index 61d7110a..72914dd6 100644 --- a/tests/DateTimeExtensions.Tests/en-NZCalendarTest.cs +++ b/tests/DateTimeExtensions.Tests/en-NZCalendarTest.cs @@ -88,6 +88,47 @@ public void EasterAnzacClash() Assert.IsTrue(holidays.Any(h => h.Name == "Easter Monday/Anzac Day")); } + [Test] + public void MonarchsBirthday() + { + var workingDayCultureInfo = new WorkingDayCultureInfo("en-NZ"); + + var dateOnGregorian = new DateTime(2011, 6, 6); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2015, 6, 1); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2016, 6, 6); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2019, 6, 3); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2022, 6, 6); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2023, 6, 5); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2024, 6, 3); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2025, 6, 2); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2026, 6, 1); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + dateOnGregorian = new DateTime(2027, 6, 7); + TestHoliday(workingDayCultureInfo, dateOnGregorian); + + var holidays = workingDayCultureInfo.GetHolidaysOfYear(2021); + Assert.IsTrue(holidays.Any(h => h.Name == "Queen's Birthday")); + holidays = workingDayCultureInfo.GetHolidaysOfYear(2022); + Assert.IsTrue(holidays.Any(h => h.Name == "Queen's Birthday")); + holidays = workingDayCultureInfo.GetHolidaysOfYear(2023); + Assert.IsTrue(holidays.Any(h => h.Name == "King's Birthday")); + holidays = workingDayCultureInfo.GetHolidaysOfYear(2024); + Assert.IsTrue(holidays.Any(h => h.Name == "King's Birthday")); + holidays = workingDayCultureInfo.GetHolidaysOfYear(2025); + Assert.IsTrue(holidays.Any(h => h.Name == "King's Birthday")); + holidays = workingDayCultureInfo.GetHolidaysOfYear(2026); + Assert.IsTrue(holidays.Any(h => h.Name == "King's Birthday")); + + } + [Test] public void Matariki() { @@ -110,6 +151,7 @@ public void Matariki() Assert.IsTrue(holidays.Any(h => h.Name == "Matariki")); } + [Test] public void Christmas() {