Skip to content

Commit 8b4ef15

Browse files
authored
Merge pull request #143 from st3v3nmw/add-ke-holidays
feat: add kenyan holidays
2 parents 8a7a3c4 + f043eb7 commit 8b4ef15

File tree

2 files changed

+205
-0
lines changed

2 files changed

+205
-0
lines changed

v2/ke/ke_holidays.go

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
// (c) Rick Arnold. Licensed under the BSD license (see LICENSE).
2+
3+
// Package ke provides holiday definitions for Kenya.
4+
package ke
5+
6+
import (
7+
"time"
8+
9+
"github.com/rickar/cal/v2"
10+
"github.com/rickar/cal/v2/aa"
11+
)
12+
13+
var (
14+
// Standard KE weekend substitution rules:
15+
// Sundays move to Monday
16+
weekendAlt = []cal.AltDay{
17+
{Day: time.Sunday, Offset: 1},
18+
}
19+
20+
// NewYear represents New Year's Day on 1-Jan
21+
NewYear = aa.NewYear.Clone(&cal.Holiday{
22+
Name: "New Year's Day",
23+
Type: cal.ObservancePublic,
24+
Observed: weekendAlt,
25+
})
26+
27+
// GoodFriday represents Good Friday - two days before Easter
28+
GoodFriday = aa.GoodFriday.Clone(&cal.Holiday{Name: "Good Friday", Type: cal.ObservancePublic})
29+
30+
// EasterMonday represents Easter Monday - the day after Easter
31+
EasterMonday = aa.EasterMonday.Clone(&cal.Holiday{Name: "Easter Monday", Type: cal.ObservancePublic})
32+
33+
// LabourDay represents Labour Day on 1-May
34+
LabourDay = aa.WorkersDay.Clone(&cal.Holiday{
35+
Name: "Labour Day",
36+
Type: cal.ObservancePublic,
37+
Observed: weekendAlt,
38+
})
39+
40+
// MadarakaDay represents Madaraka/Self-Governance Day on 1-Jun
41+
MadarakaDay = &cal.Holiday{
42+
Name: "Madaraka Day",
43+
Type: cal.ObservancePublic,
44+
Month: time.June,
45+
Day: 1,
46+
Observed: weekendAlt,
47+
Func: cal.CalcDayOfMonth,
48+
}
49+
50+
// UtamaduniDay represents Utamaduni Day on 10-Oct
51+
UtamaduniDay = &cal.Holiday{
52+
Name: "Utamaduni Day",
53+
Type: cal.ObservancePublic,
54+
Month: time.October,
55+
Day: 10,
56+
Observed: weekendAlt,
57+
Func: cal.CalcDayOfMonth,
58+
StartYear: 2022,
59+
EndYear: 2023,
60+
}
61+
62+
// MazingiraDay represents Environment Conservation Day on 10-Oct
63+
MazingiraDay = &cal.Holiday{
64+
Name: "Mazingira Day",
65+
Type: cal.ObservancePublic,
66+
Month: time.October,
67+
Day: 10,
68+
Observed: weekendAlt,
69+
Func: cal.CalcDayOfMonth,
70+
StartYear: 2024,
71+
}
72+
73+
// MashujaaDay represents Mashujaa/Heroes' Day on 20-Oct
74+
MashujaaDay = &cal.Holiday{
75+
Name: "Mashujaa Day",
76+
Type: cal.ObservancePublic,
77+
Month: time.October,
78+
Day: 20,
79+
Observed: weekendAlt,
80+
Func: cal.CalcDayOfMonth,
81+
StartYear: 2010,
82+
}
83+
84+
// JamhuriDay represents Jamhuri/Independence Day on 12-Dec
85+
JamhuriDay = &cal.Holiday{
86+
Name: "Jamhuri Day",
87+
Type: cal.ObservancePublic,
88+
Month: time.December,
89+
Day: 12,
90+
Observed: weekendAlt,
91+
Func: cal.CalcDayOfMonth,
92+
}
93+
94+
// ChristmasDay represents Christmas Day on 25-Dec
95+
ChristmasDay = aa.ChristmasDay.Clone(&cal.Holiday{
96+
Name: "Christmas Day",
97+
Type: cal.ObservancePublic,
98+
Observed: weekendAlt,
99+
})
100+
101+
// BoxingDay represents Boxing Day on 26-Dec
102+
BoxingDay = aa.ChristmasDay2.Clone(&cal.Holiday{
103+
Name: "Boxing Day",
104+
Type: cal.ObservancePublic,
105+
Observed: weekendAlt,
106+
})
107+
108+
// Holidays provides a list of the standard national holidays
109+
Holidays = []*cal.Holiday{
110+
NewYear,
111+
GoodFriday,
112+
EasterMonday,
113+
LabourDay,
114+
MadarakaDay,
115+
MazingiraDay,
116+
MashujaaDay,
117+
JamhuriDay,
118+
ChristmasDay,
119+
BoxingDay,
120+
}
121+
)

v2/ke/ke_holidays_test.go

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
// (c) Rick Arnold. Licensed under the BSD license (see LICENSE).
2+
3+
package ke
4+
5+
import (
6+
"testing"
7+
"time"
8+
9+
"github.com/rickar/cal/v2"
10+
)
11+
12+
func d(y, m, d int) time.Time {
13+
return time.Date(y, time.Month(m), d, 0, 0, 0, 0, cal.DefaultLoc)
14+
}
15+
16+
func TestHolidays(t *testing.T) {
17+
tests := []struct {
18+
h *cal.Holiday
19+
y int
20+
wantAct time.Time
21+
wantObs time.Time
22+
}{
23+
{NewYear, 2022, d(2022, 1, 1), d(2022, 1, 1)},
24+
{NewYear, 2023, d(2023, 1, 1), d(2023, 1, 2)},
25+
{NewYear, 2024, d(2024, 1, 1), d(2024, 1, 1)},
26+
{NewYear, 2025, d(2025, 1, 1), d(2025, 1, 1)},
27+
28+
{GoodFriday, 2022, d(2022, 4, 15), d(2022, 4, 15)},
29+
{GoodFriday, 2023, d(2023, 4, 7), d(2023, 4, 7)},
30+
{GoodFriday, 2024, d(2024, 3, 29), d(2024, 3, 29)},
31+
{GoodFriday, 2025, d(2025, 4, 18), d(2025, 4, 18)},
32+
33+
{EasterMonday, 2022, d(2022, 4, 18), d(2022, 4, 18)},
34+
{EasterMonday, 2023, d(2023, 4, 10), d(2023, 4, 10)},
35+
{EasterMonday, 2024, d(2024, 4, 1), d(2024, 4, 1)},
36+
{EasterMonday, 2025, d(2025, 4, 21), d(2025, 4, 21)},
37+
38+
{LabourDay, 2022, d(2022, 5, 1), d(2022, 5, 2)},
39+
{LabourDay, 2023, d(2023, 5, 1), d(2023, 5, 1)},
40+
{LabourDay, 2024, d(2024, 5, 1), d(2024, 5, 1)},
41+
{LabourDay, 2025, d(2025, 5, 1), d(2025, 5, 1)},
42+
43+
{MadarakaDay, 2022, d(2022, 6, 1), d(2022, 6, 1)},
44+
{MadarakaDay, 2023, d(2023, 6, 1), d(2023, 6, 1)},
45+
{MadarakaDay, 2024, d(2024, 6, 1), d(2024, 6, 1)},
46+
{MadarakaDay, 2025, d(2025, 6, 1), d(2025, 6, 2)},
47+
48+
{UtamaduniDay, 2022, d(2022, 10, 10), d(2022, 10, 10)},
49+
{UtamaduniDay, 2023, d(2023, 10, 10), d(2023, 10, 10)},
50+
51+
{MazingiraDay, 2024, d(2024, 10, 10), d(2024, 10, 10)},
52+
{MazingiraDay, 2025, d(2025, 10, 10), d(2025, 10, 10)},
53+
54+
{MashujaaDay, 2022, d(2022, 10, 20), d(2022, 10, 20)},
55+
{MashujaaDay, 2023, d(2023, 10, 20), d(2023, 10, 20)},
56+
{MashujaaDay, 2024, d(2024, 10, 20), d(2024, 10, 21)},
57+
{MashujaaDay, 2025, d(2025, 10, 20), d(2025, 10, 20)},
58+
59+
{JamhuriDay, 2022, d(2022, 12, 12), d(2022, 12, 12)},
60+
{JamhuriDay, 2023, d(2023, 12, 12), d(2023, 12, 12)},
61+
{JamhuriDay, 2024, d(2024, 12, 12), d(2024, 12, 12)},
62+
{JamhuriDay, 2025, d(2025, 12, 12), d(2025, 12, 12)},
63+
64+
{ChristmasDay, 2022, d(2022, 12, 25), d(2022, 12, 26)},
65+
{ChristmasDay, 2023, d(2023, 12, 25), d(2023, 12, 25)},
66+
{ChristmasDay, 2024, d(2024, 12, 25), d(2024, 12, 25)},
67+
{ChristmasDay, 2025, d(2025, 12, 25), d(2025, 12, 25)},
68+
69+
{BoxingDay, 2022, d(2022, 12, 26), d(2022, 12, 26)},
70+
{BoxingDay, 2023, d(2023, 12, 26), d(2023, 12, 26)},
71+
{BoxingDay, 2024, d(2024, 12, 26), d(2024, 12, 26)},
72+
{BoxingDay, 2025, d(2025, 12, 26), d(2025, 12, 26)},
73+
}
74+
75+
for _, test := range tests {
76+
gotAct, gotObs := test.h.Calc(test.y)
77+
if !gotAct.Equal(test.wantAct) {
78+
t.Errorf("%s %d: got actual: %s, want: %s", test.h.Name, test.y, gotAct.String(), test.wantAct.String())
79+
}
80+
if !gotObs.Equal(test.wantObs) {
81+
t.Errorf("%s %d: got observed: %s, want: %s", test.h.Name, test.y, gotObs.String(), test.wantObs.String())
82+
}
83+
}
84+
}

0 commit comments

Comments
 (0)