Skip to content

Commit ae55700

Browse files
committed
Added Mexico National holidays. Only added Statutory holidays, still need to do Civic holidays and Festivities
1 parent d7b1f1d commit ae55700

File tree

2 files changed

+184
-0
lines changed

2 files changed

+184
-0
lines changed

v2/mx/mx_holidays.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
// (c) Rick Arnold. Licensed under the BSD license (see LICENSE).
2+
3+
// Package mx provides holiday definitions for Mexico.
4+
package mx
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 MX weekend substitution rules:
15+
// Sundays move to Monday
16+
// Saturdays move to Friday
17+
weekendAlt = []cal.AltDay{
18+
{Day: time.Sunday, Offset: 1},
19+
{Day: time.Saturday, Offset: -1},
20+
}
21+
22+
// NewYear represents New Year's Day on 1-Jan
23+
NewYear = aa.NewYear.Clone(&cal.Holiday{Name: "New Year's Day", Type: cal.ObservancePublic, Observed: weekendAlt})
24+
25+
// ConstitutionDay represents Constitution Day on 5-Feb
26+
ConstitutionDay = &cal.Holiday{
27+
Name: "Constitution Day",
28+
Type: cal.ObservancePublic,
29+
Month: time.February,
30+
Day: 5,
31+
Observed: weekendAlt,
32+
Func: cal.CalcDayOfMonth,
33+
}
34+
35+
// BenitoJuarezDay represents Benito Juárez's Birthday Day on 21-Mar
36+
BenitoJuarezDay = &cal.Holiday{
37+
Name: "Benito Juárez's Birthday",
38+
Type: cal.ObservancePublic,
39+
Month: time.March,
40+
Day: 21,
41+
Observed: weekendAlt,
42+
Func: cal.CalcDayOfMonth,
43+
}
44+
45+
// LabourDay represents Labour Day on 1-May
46+
LabourDay = &cal.Holiday{
47+
Name: "Labour Day",
48+
Type: cal.ObservancePublic,
49+
Month: time.May,
50+
Day: 1,
51+
Observed: weekendAlt,
52+
Func: cal.CalcDayOfMonth,
53+
}
54+
55+
// IndependenceDay represents Independence Day on 16-Sep
56+
IndependenceDay = &cal.Holiday{
57+
Name: "Independence Day",
58+
Type: cal.ObservancePublic,
59+
Month: time.September,
60+
Day: 16,
61+
Observed: weekendAlt,
62+
Func: cal.CalcDayOfMonth,
63+
}
64+
65+
// RevolutionDay represents Revolution Day on 20-Nov
66+
RevolutionDay = &cal.Holiday{
67+
Name: "Revolution Day",
68+
Type: cal.ObservancePublic,
69+
Month: time.November,
70+
Day: 20,
71+
Observed: weekendAlt,
72+
Func: cal.CalcDayOfMonth,
73+
}
74+
75+
// ChristmasDay represents Christmas Day on 25-Dec
76+
ChristmasDay = aa.ChristmasDay.Clone(&cal.Holiday{Name: "Christmas Day", Type: cal.ObservanceBank, Observed: weekendAlt})
77+
78+
// Holidays provides a list of the standard national holidays
79+
Holidays = []*cal.Holiday{
80+
NewYear,
81+
ConstitutionDay,
82+
BenitoJuarezDay,
83+
LabourDay,
84+
IndependenceDay,
85+
RevolutionDay,
86+
ChristmasDay,
87+
}
88+
)

v2/mx/mx_holidays_test.go

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
// (c) Rick Arnold. Licensed under the BSD license (see LICENSE).
2+
3+
package mx
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, 2015, d(2015, 1, 1), d(2015, 1, 1)},
24+
{NewYear, 2016, d(2016, 1, 1), d(2016, 1, 1)},
25+
{NewYear, 2017, d(2017, 1, 1), d(2017, 1, 2)},
26+
{NewYear, 2018, d(2018, 1, 1), d(2018, 1, 1)},
27+
{NewYear, 2019, d(2019, 1, 1), d(2019, 1, 1)},
28+
{NewYear, 2020, d(2020, 1, 1), d(2020, 1, 1)},
29+
{NewYear, 2021, d(2021, 1, 1), d(2021, 1, 1)},
30+
{NewYear, 2022, d(2022, 1, 1), d(2021, 12, 31)},
31+
32+
{ConstitutionDay, 2015, d(2015, 2, 5), d(2015, 2, 5)},
33+
{ConstitutionDay, 2016, d(2016, 2, 5), d(2016, 2, 5)},
34+
{ConstitutionDay, 2017, d(2017, 2, 5), d(2017, 2, 6)},
35+
{ConstitutionDay, 2018, d(2018, 2, 5), d(2018, 2, 5)},
36+
{ConstitutionDay, 2019, d(2019, 2, 5), d(2019, 2, 5)},
37+
{ConstitutionDay, 2020, d(2020, 2, 5), d(2020, 2, 5)},
38+
{ConstitutionDay, 2021, d(2021, 2, 5), d(2021, 2, 5)},
39+
{ConstitutionDay, 2022, d(2022, 2, 5), d(2022, 2, 4)},
40+
41+
{BenitoJuarezDay, 2015, d(2015, 3, 21), d(2015, 3, 20)},
42+
{BenitoJuarezDay, 2016, d(2016, 3, 21), d(2016, 3, 21)},
43+
{BenitoJuarezDay, 2017, d(2017, 3, 21), d(2017, 3, 21)},
44+
{BenitoJuarezDay, 2018, d(2018, 3, 21), d(2018, 3, 21)},
45+
{BenitoJuarezDay, 2019, d(2019, 3, 21), d(2019, 3, 21)},
46+
{BenitoJuarezDay, 2020, d(2020, 3, 21), d(2020, 3, 20)},
47+
{BenitoJuarezDay, 2021, d(2021, 3, 21), d(2021, 3, 22)},
48+
{BenitoJuarezDay, 2022, d(2022, 3, 21), d(2022, 3, 21)},
49+
50+
{LabourDay, 2015, d(2015, 5, 1), d(2015, 5, 1)},
51+
{LabourDay, 2016, d(2016, 5, 1), d(2016, 5, 2)},
52+
{LabourDay, 2017, d(2017, 5, 1), d(2017, 5, 1)},
53+
{LabourDay, 2018, d(2018, 5, 1), d(2018, 5, 1)},
54+
{LabourDay, 2019, d(2019, 5, 1), d(2019, 5, 1)},
55+
{LabourDay, 2020, d(2020, 5, 1), d(2020, 5, 1)},
56+
{LabourDay, 2021, d(2021, 5, 1), d(2021, 4, 30)},
57+
{LabourDay, 2022, d(2022, 5, 1), d(2022, 5, 2)},
58+
59+
{IndependenceDay, 2015, d(2015, 9, 16), d(2015, 9, 16)},
60+
{IndependenceDay, 2016, d(2016, 9, 16), d(2016, 9, 16)},
61+
{IndependenceDay, 2017, d(2017, 9, 16), d(2017, 9, 15)},
62+
{IndependenceDay, 2018, d(2018, 9, 16), d(2018, 9, 17)},
63+
{IndependenceDay, 2019, d(2019, 9, 16), d(2019, 9, 16)},
64+
{IndependenceDay, 2020, d(2020, 9, 16), d(2020, 9, 16)},
65+
{IndependenceDay, 2021, d(2021, 9, 16), d(2021, 9, 16)},
66+
{IndependenceDay, 2022, d(2022, 9, 16), d(2022, 9, 16)},
67+
68+
{RevolutionDay, 2015, d(2015, 11, 20), d(2015, 11, 20)},
69+
{RevolutionDay, 2016, d(2016, 11, 20), d(2016, 11, 21)},
70+
{RevolutionDay, 2017, d(2017, 11, 20), d(2017, 11, 20)},
71+
{RevolutionDay, 2018, d(2018, 11, 20), d(2018, 11, 20)},
72+
{RevolutionDay, 2019, d(2019, 11, 20), d(2019, 11, 20)},
73+
{RevolutionDay, 2020, d(2020, 11, 20), d(2020, 11, 20)},
74+
{RevolutionDay, 2021, d(2021, 11, 20), d(2021, 11, 19)},
75+
{RevolutionDay, 2022, d(2022, 11, 20), d(2022, 11, 21)},
76+
77+
{ChristmasDay, 2015, d(2015, 12, 25), d(2015, 12, 25)},
78+
{ChristmasDay, 2016, d(2016, 12, 25), d(2016, 12, 26)},
79+
{ChristmasDay, 2017, d(2017, 12, 25), d(2017, 12, 25)},
80+
{ChristmasDay, 2018, d(2018, 12, 25), d(2018, 12, 25)},
81+
{ChristmasDay, 2019, d(2019, 12, 25), d(2019, 12, 25)},
82+
{ChristmasDay, 2020, d(2020, 12, 25), d(2020, 12, 25)},
83+
{ChristmasDay, 2021, d(2021, 12, 25), d(2021, 12, 24)},
84+
{ChristmasDay, 2022, d(2022, 12, 25), d(2022, 12, 26)},
85+
}
86+
87+
for _, test := range tests {
88+
gotAct, gotObs := test.h.Calc(test.y)
89+
if !gotAct.Equal(test.wantAct) {
90+
t.Errorf("%s %d: got actual: %s, want: %s", test.h.Name, test.y, gotAct.String(), test.wantAct.String())
91+
}
92+
if !gotObs.Equal(test.wantObs) {
93+
t.Errorf("%s %d: got observed: %s, want: %s", test.h.Name, test.y, gotObs.String(), test.wantObs.String())
94+
}
95+
}
96+
}

0 commit comments

Comments
 (0)