holidays 0.1.0.0 → 0.2.0.0
raw patch · 20 files changed
+402/−257 lines, 20 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Holidays: Holiday :: Text -> Day -> Holiday
+ Holidays: [holidayKey] :: Holiday -> Text
+ Holidays: [holidayValue] :: Holiday -> Day
+ Holidays: data Holiday
+ Holidays: hday :: Text -> Day -> Holiday
- Holidays: holidays :: ISO_3166_1_Alpha_3 -> [Region] -> Year -> Set Day
+ Holidays: holidays :: ISO_3166_1_Alpha_3 -> [Region] -> Year -> Set Holiday
Files
- CHANGELOG.md +5/−0
- holidays.cabal +3/−1
- src/Holidays.hs +12/−9
- src/Holidays/Base.hs +26/−2
- src/Holidays/DateFinder.hs +11/−18
- src/Holidays/DateTransform.hs +10/−7
- src/Holidays/Germany.hs +79/−59
- src/Holidays/Mozambique.hs +28/−0
- src/Holidays/Namibia.hs +19/−16
- src/Holidays/SouthAfrica.hs +19/−14
- src/Holidays/UnitedKingdom.hs +13/−9
- src/Holidays/UnitedStates.hs +16/−12
- tst/Main.hs +3/−2
- tst/Test/Holidays.hs +1/−1
- tst/Test/Holidays/Germany.hs +24/−23
- tst/Test/Holidays/Mozambique.hs +45/−0
- tst/Test/Holidays/Namibia.hs +28/−27
- tst/Test/Holidays/SouthAfrica.hs +28/−27
- tst/Test/Holidays/UnitedKingdom.hs +19/−18
- tst/Test/Holidays/UnitedStates.hs +13/−12
CHANGELOG.md view
@@ -5,3 +5,8 @@ - ZAF, NAM, USA, GBR, DEU - support for country regions - unit + property based tests++## **0.2.0.0** - 2025-02-17+- new Holiday data type+- use "holidayKey" for a textual description+- new countries supported: MOZ
holidays.cabal view
@@ -1,7 +1,7 @@ cabal-version: 3.8 name: holidays-version: 0.1.0.0+version: 0.2.0.0 synopsis: Library for country public holidays description: Library for country public holidays. Provides a small EDSL to describe holidays for a country.@@ -37,6 +37,7 @@ Holidays.DateFinder Holidays.DateTransform Holidays.Germany+ Holidays.Mozambique Holidays.Namibia Holidays.SouthAfrica Holidays.UnitedKingdom@@ -57,6 +58,7 @@ other-modules: Test.Holidays Test.Holidays.Germany+ Test.Holidays.Mozambique Test.Holidays.Namibia Test.Holidays.SouthAfrica Test.Holidays.UnitedKingdom
src/Holidays.hs view
@@ -7,15 +7,17 @@ ISO_3166_1_Alpha_3, Region, holidays,+ hday,+ Holiday (..), ) where import Data.Set qualified as S import Data.Time import Holidays.Base-import Holidays.DateFinder import Holidays.DateTransform import Holidays.Germany qualified as DEU+import Holidays.Mozambique qualified as MOZ import Holidays.Namibia qualified as NAM import Holidays.SouthAfrica qualified as ZAF import Holidays.UnitedKingdom qualified as GBR@@ -24,27 +26,28 @@ {- | Returns a set of public holidays based on the country code (ISO_3166_1_Alpha_3) and a specific year. If a country is not supported an empty set is returned.-Allowed to specify regions in a country to further determine holidays.+Country regions are also supported. Examples: @-holidays "DEU" ["BW","BY","BE"] 2025 -- Germany and various states-holidays "USA" [] 2025+holidays \"DEU\" [\"BW\",\"BY\",\"BE\"] 2025 -- Germany and various regions+holidays \"USA\" [] 2025 @ -}-holidays :: ISO_3166_1_Alpha_3 -> [Region] -> Year -> S.Set Day+holidays :: ISO_3166_1_Alpha_3 -> [Region] -> Year -> S.Set Holiday holidays countryCode regions year = case countryCode of "DEU" -> DEU.holidays regions `apply` year "GBR" -> GBR.holidays `apply` year+ "MOZ" -> MOZ.holidays `apply` year "NAM" -> NAM.holidays `apply` year "USA" -> USA.holidays `apply` year "ZAF" -> ZAF.holidays `apply` year _ -> S.empty --- Applies year and transformations to holidays-apply :: (DateFinders, DateTransforms) -> Year -> S.Set Day-apply (finders, transforms) year =- let validDays = filter valid $ map (\d -> d year) finders -- apply year and filter out invalid days+-- | Applies year and date transformations to holidays+apply :: ([Year -> Holiday], [DateTransform]) -> Year -> S.Set Holiday+apply (hs, transforms) year =+ let validDays = filter (validDay . holidayValue) $ map (\d -> d year) hs -- apply year and filter out invalid days in foldr (\d ds -> S.insert (foldr (\t d' -> t ds d') d transforms) ds) S.empty validDays -- apply transforms to valid days
src/Holidays/Base.hs view
@@ -1,17 +1,41 @@ module Holidays.Base (+ Holiday (..), ISO_3166_1_Alpha_3, Region, day,+ hday,+ nullDay,+ validDay, ) where import Data.Text qualified as T import Data.Time --- | 3-letter country codes+-- | 3-letter country codes. type ISO_3166_1_Alpha_3 = T.Text --- | Custom regions for a country+-- | Custom regions for a country. type Region = T.Text +data Holiday+ = Holiday+ { holidayKey :: T.Text,+ holidayValue :: Day+ }+ deriving (Ord, Eq, Show)++-- | Constructor for a Day. Equivalent to the fromGregorian function. day :: Year -> MonthOfYear -> DayOfMonth -> Day day = fromGregorian++-- | Constructor for a Holiday.+hday :: T.Text -> Day -> Holiday+hday k d = Holiday {holidayKey = k, holidayValue = d}++-- | Convention for filtering out invalid dates.+nullDay :: Day+nullDay = day 0 0 0++-- | Day is valid if its not a nullDate+validDay :: Day -> Bool+validDay = not . (nullDay ==)
src/Holidays/DateFinder.hs view
@@ -1,7 +1,7 @@ module Holidays.DateFinder ( after, before,- valid,+ nextOpenDay, days, years, sun,@@ -31,8 +31,6 @@ newYearsDay, ascensionDay, workersDay,- nextOpenDay,- DateFinders, ) where import Data.Maybe@@ -44,8 +42,6 @@ data Direction = Past | Future -type DateFinders = [Year -> Day]- -- common dates newYearsDay :: Year -> Day newYearsDay = jan 1@@ -71,18 +67,11 @@ workersDay :: Year -> Day workersDay = may 1 --- utils-nullDate :: Day-nullDate = day 0 0 0--valid :: Day -> Bool-valid = not . (nullDate ==)- days :: Integer -> (Integer -> Maybe DayOfWeek -> Day) -> Day days n f = f n Nothing years :: (Year -> Bool) -> Day -> Day-years f d = if f (fromIntegral y) then d else nullDate+years f d = if f (fromIntegral y) then d else nullDay where (y, _, _) = toGregorian d @@ -125,14 +114,15 @@ -- time travel --- exclusive of before day+-- | Time-travel to the past in number of days. Excludes the specified Day. before :: Day -> Integer -> Maybe DayOfWeek -> Day before = timeTravel Past --- inclusive of after day+-- | Time-travel to the past in number of days. Includes the specified Day. after :: Day -> Integer -> Maybe DayOfWeek -> Day after = timeTravel Future +-- | Time-travels to the past or future by adding a number of days. timeTravel :: Direction -> Day -> Integer -> Maybe DayOfWeek -> Day timeTravel Past d n w | isNothing w = addDays (negate n) d@@ -167,8 +157,11 @@ sat :: Integer -> (Integer -> Maybe DayOfWeek -> Day) -> Day sat n f = f n (Just Saturday) -nextOpenDay :: [DayOfWeek] -> S.Set Day -> Day -> Day+-- | Get the next open day by skipping days which are already holidays or specified days of the week.+nextOpenDay :: [DayOfWeek] -> S.Set Holiday -> Holiday -> Holiday nextOpenDay ds s d- | dayOfWeek d `elem` ds = nextOpenDay ds s (addDays 1 d)- | S.member d s = nextOpenDay ds s (addDays 1 d)+ | dayOfWeek d' `elem` ds = nextOpenDay ds s (d {holidayValue = addDays 1 d'})+ | S.member d s = nextOpenDay ds s (d {holidayValue = addDays 1 d'}) | otherwise = d+ where+ d' = holidayValue d
src/Holidays/DateTransform.hs view
@@ -1,19 +1,22 @@ module Holidays.DateTransform ( substituteRule, sundayRule,- DateTransforms+ DateTransform, ) where import Data.Set qualified as S import Data.Time+import Holidays.Base import Holidays.DateFinder --type DateTransforms = [S.Set Day -> Day -> Day]+type DateTransform = S.Set Holiday -> Holiday -> Holiday --- general transformations-sundayRule :: S.Set Day -> Day -> Day-sundayRule _ d = if dayOfWeek d == Sunday then addDays 1 d else d -- mon after sunday+-- | If day is on a sunday, it moves to monday+sundayRule :: DateTransform+sundayRule _ d = if dayOfWeek h == Sunday then d {holidayValue = addDays 1 h} else d -- mon after sunday+ where+ h = holidayValue d -substituteRule :: S.Set Day -> Day -> Day+-- | Looks for next open day (day which is not a holiday), also skipping saturday and sunday+substituteRule :: DateTransform substituteRule = nextOpenDay [Saturday, Sunday]
src/Holidays/Germany.hs view
@@ -9,11 +9,13 @@ holidays, ) where +import Data.Time+ import Holidays.Base import Holidays.DateFinder import Holidays.DateTransform -holidays :: [Region] -> (DateFinders, DateTransforms)+holidays :: [Region] -> ([Year -> Holiday], [DateTransform]) holidays regions = ( concat [ federalHolidays,@@ -22,20 +24,20 @@ [] ) -federalHolidays :: DateFinders+federalHolidays :: [Year -> Holiday] federalHolidays =- [ newYearsDay,- goodFriday,- easterMonday,- workersDay, -- labour day- ascensionDay,- (50 `days`) . after . easterSunday, -- whit monday- oct 3, -- germany unity day- christmasDay,- boxingDay -- second day of christmas+ [ hday "new_years_day" . newYearsDay,+ hday "good_friday" . goodFriday,+ hday "easter_monday" . easterMonday,+ hday "labour_day" . workersDay,+ hday "ascension_day" . ascensionDay,+ hday "whit_monday" . (50 `days`) . after . easterSunday,+ hday "germany_unity_day" . oct 3,+ hday "christmas_day" . christmasDay,+ hday "second_day_of_christmas" . boxingDay ] -regionalHolidays :: [Region] -> DateFinders+regionalHolidays :: [Region] -> [Year -> Holiday] regionalHolidays = concatMap ( \r -> case r of@@ -58,96 +60,114 @@ _ -> [] ) -badenWurttembergHolidays :: DateFinders+-- common holidays+epiphany :: Year -> Holiday+epiphany = hday "epiphany" . jan 6++corpusChristi :: Year -> Holiday+corpusChristi = hday "corpus_christi" . (60 `days`) . after . easterSunday++allSaintsDay :: Year -> Holiday+allSaintsDay = hday "all_saints_day" . nov 1++assumptionDay :: Year -> Holiday+assumptionDay = hday "assumption_day" . aug 15++internationalWomensDay :: Year -> Holiday+internationalWomensDay = hday "international_womens_day" . mar 8++reformationDay :: Year -> Holiday+reformationDay = hday "reformation_day" . oct 31++badenWurttembergHolidays :: [Year -> Holiday] badenWurttembergHolidays =- [ jan 6, -- epiphany- (60 `days`) . after . easterSunday, -- corpus christi- nov 1 -- all saints day+ [ epiphany,+ corpusChristi,+ allSaintsDay ] -bavariaHolidays :: DateFinders+bavariaHolidays :: [Year -> Holiday] bavariaHolidays =- [ jan 6, -- epiphany- (60 `days`) . after . easterSunday, -- corpus christi- aug 15, -- assumption day- nov 1 -- all saints day+ [ epiphany,+ corpusChristi,+ assumptionDay,+ allSaintsDay ] -berlinHolidays :: DateFinders+berlinHolidays :: [Year -> Holiday] berlinHolidays =- [ mar 8, -- international womens day- nov 1, -- all saints day- years (== 2025) . may 8 -- 80th anniversary of the end of world war 2+ [ internationalWomensDay,+ allSaintsDay,+ hday "80th_anniversary_of_end_of_world_war_2" . years (== 2025) . may 8 ] -brandenburgHolidays :: DateFinders+brandenburgHolidays :: [Year -> Holiday] brandenburgHolidays =- [ easterSunday,- (49 `days`) . after . easterSunday, -- whit sunday- oct 31 -- reformation day+ [ hday "easter_sunday" . easterSunday,+ hday "whit_sunday" . (49 `days`) . after . easterSunday,+ reformationDay ] -bremenHolidays :: DateFinders+bremenHolidays :: [Year -> Holiday] bremenHolidays =- [ oct 31 -- reformation day+ [ reformationDay ] -hamburgHolidays :: DateFinders+hamburgHolidays :: [Year -> Holiday] hamburgHolidays =- [ oct 31 -- reformation day+ [ reformationDay ] -hesseHolidays :: DateFinders+hesseHolidays :: [Year -> Holiday] hesseHolidays =- [ (60 `days`) . after . easterSunday -- corpus christi- ]+ [corpusChristi] -mecklenburgVorpommernHolidays :: DateFinders+mecklenburgVorpommernHolidays :: [Year -> Holiday] mecklenburgVorpommernHolidays =- [ mar 8, -- international womens day- oct 31 -- reformation day+ [ internationalWomensDay,+ reformationDay ] -lowerSaxonyHolidays :: DateFinders+lowerSaxonyHolidays :: [Year -> Holiday] lowerSaxonyHolidays =- [ oct 31 -- reformation day+ [ reformationDay ] -northRhineWestphaliaHolidays :: DateFinders+northRhineWestphaliaHolidays :: [Year -> Holiday] northRhineWestphaliaHolidays =- [ (60 `days`) . after . easterSunday, -- corpus christi- nov 1 -- all saints day+ [ corpusChristi,+ allSaintsDay ] -rhinelandPalatinateHolidays :: DateFinders+rhinelandPalatinateHolidays :: [Year -> Holiday] rhinelandPalatinateHolidays =- [ (60 `days`) . after . easterSunday, -- corpus christi- nov 1 -- all saints day+ [ corpusChristi,+ allSaintsDay ] -saarlandHolidays :: DateFinders+saarlandHolidays :: [Year -> Holiday] saarlandHolidays =- [ (60 `days`) . after . easterSunday, -- corpus christi- aug 15, -- assumption day- nov 1 -- all saints day+ [ corpusChristi,+ assumptionDay,+ allSaintsDay ] -saxonyHolidays :: DateFinders+saxonyHolidays :: [Year -> Holiday] saxonyHolidays =- [ (2 `wed`) . before . (4 `sun`) . before . christmasDay -- repentance and prayer day+ [ hday "repentance_and_prayer_day" . (2 `wed`) . before . (4 `sun`) . before . christmasDay ] -saxonyAnhaltHolidays :: DateFinders+saxonyAnhaltHolidays :: [Year -> Holiday] saxonyAnhaltHolidays =- [ jan 6, -- epiphany- oct 31 -- reformation day+ [ epiphany,+ reformationDay ] -schleswigHolsteinHolidays :: DateFinders+schleswigHolsteinHolidays :: [Year -> Holiday] schleswigHolsteinHolidays = [] -thuringiaHolidays :: DateFinders+thuringiaHolidays :: [Year -> Holiday] thuringiaHolidays =- [ sep 20 -- world childrens day+ [ hday "worlds_children_day" . sep 20 ]
+ src/Holidays/Mozambique.hs view
@@ -0,0 +1,28 @@+-- references:+-- https://en.wikipedia.org/wiki/Public_holidays_in_Mozambique+{-# LANGUAGE OverloadedStrings #-}++module Holidays.Mozambique (+ holidays,+) where++import Data.Time++import Holidays.Base+import Holidays.DateFinder+import Holidays.DateTransform++holidays :: ([Year -> Holiday], [DateTransform])+holidays =+ ( [ hday "new_years_day" . newYearsDay,+ hday "heroes_day" . feb 3,+ hday "womens_day" . apr 7,+ hday "workers_day" . workersDay,+ hday "independence_day" . jun 25,+ hday "victory_day" . sep 7,+ hday "armed_forces_day" . sep 25,+ hday "day_of_peace_and_reconciliation" . oct 4,+ hday "family_day" . christmasDay+ ],+ []+ )
src/Holidays/Namibia.hs view
@@ -1,29 +1,32 @@ -- references: -- https://en.wikipedia.org/wiki/Public_holidays_in_Namibia+{-# LANGUAGE OverloadedStrings #-} module Holidays.Namibia ( holidays, ) where +import Data.Time++import Holidays.Base import Holidays.DateFinder-import Holidays.DateTransform+import Holidays.DateTransform (DateTransform, sundayRule) --- Namibia public holidays-holidays :: (DateFinders, DateTransforms)+holidays :: ([Year -> Holiday], [DateTransform]) holidays =- ( [ newYearsDay,- mar 21, -- independence day- goodFriday,- easterSunday,- ascensionDay,- workersDay,- may 4, -- cassinga day- may 25, -- africa day- aug 26, -- heroes day- dec 10, -- human rights day- christmasDay,- boxingDay, -- family day- years (>= 2025) . may 28 -- genocide remembrance day+ ( [ hday "new_years_day" . newYearsDay,+ hday "independence_day" . mar 21,+ hday "good_friday" . goodFriday,+ hday "easter_sunday" . easterSunday,+ hday "ascension_day" . ascensionDay,+ hday "workers_day" . workersDay,+ hday "cassinga_day" . may 4,+ hday "africa_day" . may 25,+ hday "heroes_day" . aug 26,+ hday "human_rights_day" . dec 10,+ hday "christmas_day" . christmasDay,+ hday "family_day" . boxingDay,+ hday "genocide_remembrance_day" . years (>= 2025) . may 28 ], [sundayRule] )
src/Holidays/SouthAfrica.hs view
@@ -1,28 +1,33 @@ -- references: -- https://en.wikipedia.org/wiki/Public_holidays_in_South_Africa+{-# LANGUAGE OverloadedStrings #-} module Holidays.SouthAfrica ( holidays, ) where +import Data.Time++import Holidays.Base import Holidays.DateFinder import Holidays.DateTransform -holidays :: (DateFinders, DateTransforms)+holidays :: ([Year -> Holiday], [DateTransform]) holidays =- ( [ newYearsDay,- goodFriday,- easterSunday, -- family day- mar 21, -- human right day- apr 27, -- freedom day- workersDay,- jun 16, -- youth day- aug 9, -- womens day- sep 24, -- heritage day- dec 16, -- day of reconciliation- christmasDay,- boxingDay, -- day of goodwill- years (== 2024) . may 29 -- general elections 2024+ ( [ hday "new_years_day" . newYearsDay,+ hday "good_friday" . goodFriday,+ hday "family_day" . easterSunday,+ hday "human_rights_day" . mar 21,+ hday "freedom_day" . apr 27,+ hday "workers_day" . workersDay,+ hday "youth_day" . jun 16,+ hday "womens_day" . aug 9,+ hday "heritage_day" . sep 24,+ hday "day_of_reconciliation" . dec 16,+ hday "christmas_day" . christmasDay,+ hday "day_of_goodwill" . boxingDay,+ -- special days+ hday "general_elections_2024" . years (== 2024) . may 29 ], [sundayRule] )
src/Holidays/UnitedKingdom.hs view
@@ -1,23 +1,27 @@ -- references: -- https://en.wikipedia.org/wiki/Public_holidays_in_the_United_Kingdom+{-# LANGUAGE OverloadedStrings #-} module Holidays.UnitedKingdom ( holidays, ) where +import Data.Time++import Holidays.Base import Holidays.DateFinder import Holidays.DateTransform -holidays :: (DateFinders, DateTransforms)+holidays :: ([Year -> Holiday], [DateTransform]) holidays =- ( [ newYearsDay,- goodFriday,- easterSunday,- (1 `mon`) . after . may 1, -- early may bank holiday- (1 `mon`) . before . jun 1, -- spring bank holiday- (1 `mon`) . before . sep 1, -- summer bank holiday- christmasDay,- boxingDay+ ( [ hday "new_years_day" . newYearsDay,+ hday "good_friday" . goodFriday,+ hday "easter_sunday" . easterSunday,+ hday "early_may_bank_holiday" . (1 `mon`) . after . may 1,+ hday "spring_bank_holiday" . (1 `mon`) . before . jun 1,+ hday "summer_bank_holiday" . (1 `mon`) . before . sep 1,+ hday "christmas_day" . christmasDay,+ hday "boxing_day" . boxingDay ], [substituteRule] )
src/Holidays/UnitedStates.hs view
@@ -1,26 +1,30 @@ -- references: -- https://en.wikipedia.org/wiki/Federal_holidays_in_the_United_States+{-# LANGUAGE OverloadedStrings #-} module Holidays.UnitedStates ( holidays, ) where +import Data.Time++import Holidays.Base import Holidays.DateFinder import Holidays.DateTransform -holidays :: (DateFinders, DateTransforms)+holidays :: ([Year -> Holiday], [DateTransform]) holidays =- ( [ newYearsDay,- (3 `mon`) . after . jan 1, -- Martin Luther King's birthday- (3 `mon`) . after . feb 1, -- Georges Washington's birthday- (1 `mon`) . before . jun 1, -- memorial day, last monday of may- jun 19, -- juneteenth independence day- jul 4, -- independence day- (1 `mon`) . after . sep 1, -- labor day- (2 `mon`) . after . oct 1, -- columbus day- nov 11, -- veterans day,- (4 `thurs`) . after . nov 1, -- thanksgiving day- christmasDay+ ( [ hday "new_years_day" . newYearsDay,+ hday "martin_luther_kings_birthday" . (3 `mon`) . after . jan 1,+ hday "george_washingtons_birthday" . (3 `mon`) . after . feb 1,+ hday "memorial_day" . (1 `mon`) . before . jun 1,+ hday "juneteenth_independence_day" . jun 19,+ hday "independence_day" . jul 4,+ hday "labor_day" . (1 `mon`) . after . sep 1,+ hday "columbus_day" . (2 `mon`) . after . oct 1,+ hday "veterans_day" . nov 11,+ hday "thanksgiving_day" . (4 `thurs`) . after . nov 1,+ hday "christmas_day" . christmasDay ], [] )
tst/Main.hs view
@@ -1,6 +1,7 @@ module Main where import Test.Holidays.Germany qualified as DEU+import Test.Holidays.Mozambique qualified as MOZ import Test.Holidays.Namibia qualified as NAM import Test.Holidays.SouthAfrica qualified as ZAF import Test.Holidays.UnitedKingdom qualified as GBR@@ -14,7 +15,7 @@ tests = testGroup "Holidays tests" [unitTests, propTests] unitTests :: TestTree-unitTests = testGroup "Unit tests" [DEU.unitTests, GBR.unitTests, NAM.unitTests, USA.unitTests, ZAF.unitTests]+unitTests = testGroup "Unit tests" [DEU.unitTests, GBR.unitTests, MOZ.unitTests, NAM.unitTests, USA.unitTests, ZAF.unitTests] propTests :: TestTree-propTests = testGroup "Holidays property based tests" [DEU.propTests, GBR.propTests, NAM.propTests, USA.propTests, ZAF.propTests]+propTests = testGroup "Holidays property based tests" [DEU.propTests, GBR.propTests, MOZ.propTests, NAM.propTests, USA.propTests, ZAF.propTests]
tst/Test/Holidays.hs view
@@ -18,7 +18,7 @@ S.map ( \h -> let- (year', _, _) = toGregorian h+ (year', _, _) = toGregorian (H.holidayValue h) in year' )
tst/Test/Holidays/Germany.hs view
@@ -5,6 +5,7 @@ propTests, ) where +import Data.List import Data.Set qualified as S import Holidays import Test.Holidays@@ -12,35 +13,35 @@ import Test.Tasty.HUnit -- german states-regions :: [Region] -regions = ["BW","BY","BE","BB","HB","HH","HE","MV","NI","NW","RP","SL","SN","ST","SH","TH"]+regions :: [Region]+regions = ["BW", "BY", "BE", "BB", "HB", "HH", "HE", "MV", "NI", "NW", "RP", "SL", "SN", "ST", "SH", "TH"] unitTests :: TestTree unitTests = testGroup "DEU unit tests" [ testCase "2025" $- S.toAscList (holidays "DEU" regions 2025)- @?= [ day 2025 1 1,- day 2025 1 6,- day 2025 3 8,- day 2025 4 18,- day 2025 4 20,- day 2025 4 21,- day 2025 5 1,- day 2025 5 8,- day 2025 5 29,- day 2025 6 8,- day 2025 6 9,- day 2025 6 19,- day 2025 8 15,- day 2025 9 20,- day 2025 10 3,- day 2025 10 31,- day 2025 11 1,- day 2025 11 19,- day 2025 12 25,- day 2025 12 26+ sortOn holidayValue (S.toAscList (holidays "DEU" regions 2025))+ @?= [ hday "new_years_day" (day 2025 1 1),+ hday "epiphany" (day 2025 1 6),+ hday "international_womens_day" (day 2025 3 8),+ hday "good_friday" (day 2025 4 18),+ hday "easter_sunday" (day 2025 4 20),+ hday "easter_monday" (day 2025 4 21),+ hday "labour_day" (day 2025 5 1),+ hday "80th_anniversary_of_end_of_world_war_2" (day 2025 5 8),+ hday "ascension_day" (day 2025 5 29),+ hday "whit_sunday" (day 2025 6 8),+ hday "whit_monday" (day 2025 6 9),+ hday "corpus_christi" (day 2025 6 19),+ hday "assumption_day" (day 2025 8 15),+ hday "worlds_children_day" (day 2025 9 20),+ hday "germany_unity_day" (day 2025 10 3),+ hday "reformation_day" (day 2025 10 31),+ hday "all_saints_day" (day 2025 11 1),+ hday "repentance_and_prayer_day" (day 2025 11 19),+ hday "christmas_day" (day 2025 12 25),+ hday "second_day_of_christmas" (day 2025 12 26) ] ]
+ tst/Test/Holidays/Mozambique.hs view
@@ -0,0 +1,45 @@+{-# LANGUAGE OverloadedStrings #-}++module Test.Holidays.Mozambique (+ unitTests,+ propTests,+) where++import Data.List+import Data.Set qualified as S+import Holidays+import Test.Holidays+import Test.Tasty+import Test.Tasty.HUnit++unitTests :: TestTree+unitTests =+ testGroup+ "MOZ unit tests"+ [ testCase "2025" $+ sortOn holidayValue (S.toList (holidays "MOZ" [] 2025))+ @?= [ hday "new_years_day" (day 2025 1 1),+ hday "heroes_day" (day 2025 2 3),+ hday "womens_day" (day 2025 4 7),+ hday "workers_day" (day 2025 5 1),+ hday "independence_day" (day 2025 6 25),+ hday "victory_day" (day 2025 9 7),+ hday "armed_forces_day" (day 2025 9 25),+ hday "day_of_peace_and_reconciliation" (day 2025 10 4),+ hday "family_day" (day 2025 12 25)+ ]+ ]++propTests :: TestTree+propTests = countryPropTests "MOZ" []++{-+ ( [ hday "new_years_day" . newYearsDay,+ hday "heroes_day" . feb 3,+ hday "womens_day" . apr 7,+ hday "workers_day" . workersDay,+ hday "independence_day" . jun 25,+ hday "victory_day" . sep 7,+ hday "armed_forces_day" . sep 25,+ hday "day_of_peace_and_reconciliation" . oct 4,+ hday "family_day" . christmasDay -}
tst/Test/Holidays/Namibia.hs view
@@ -5,6 +5,7 @@ propTests, ) where +import Data.List import Data.Set qualified as S import Holidays import Test.Holidays@@ -16,35 +17,35 @@ testGroup "NAM unit tests" [ testCase "2024" $- S.toAscList (holidays "NAM" [] 2024)- @?= [ day 2024 1 1,- day 2024 3 21,- day 2024 3 29,- day 2024 4 1,- day 2024 5 1,- day 2024 5 4,- day 2024 5 9,- day 2024 5 25,- day 2024 8 26,- day 2024 12 10,- day 2024 12 25,- day 2024 12 26+ sortOn holidayValue (S.toAscList (holidays "NAM" [] 2024))+ @?= [ hday "new_years_day" (day 2024 1 1),+ hday "independence_day" (day 2024 3 21),+ hday "good_friday" (day 2024 3 29),+ hday "easter_sunday" (day 2024 4 1),+ hday "workers_day" (day 2024 5 1),+ hday "cassinga_day" (day 2024 5 4),+ hday "ascension_day" (day 2024 5 9),+ hday "africa_day" (day 2024 5 25),+ hday "heroes_day" (day 2024 8 26),+ hday "human_rights_day" (day 2024 12 10),+ hday "christmas_day" (day 2024 12 25),+ hday "family_day" (day 2024 12 26) ], testCase "2025" $- S.toAscList (holidays "NAM" [] 2025)- @?= [ day 2025 1 1,- day 2025 3 21,- day 2025 4 18,- day 2025 4 21,- day 2025 5 1,- day 2025 5 5,- day 2025 5 26,- day 2025 5 28,- day 2025 5 29,- day 2025 8 26,- day 2025 12 10,- day 2025 12 25,- day 2025 12 26+ sortOn holidayValue (S.toAscList (holidays "NAM" [] 2025))+ @?= [ hday "new_years_day" (day 2025 1 1),+ hday "independence_day" (day 2025 3 21),+ hday "good_friday" (day 2025 4 18),+ hday "easter_sunday" (day 2025 4 21),+ hday "workers_day" (day 2025 5 1),+ hday "cassinga_day" (day 2025 5 5),+ hday "africa_day" (day 2025 5 26),+ hday "genocide_remembrance_day" (day 2025 5 28),+ hday "ascension_day" (day 2025 5 29),+ hday "heroes_day" (day 2025 8 26),+ hday "human_rights_day" (day 2025 12 10),+ hday "christmas_day" (day 2025 12 25),+ hday "family_day" (day 2025 12 26) ] ]
tst/Test/Holidays/SouthAfrica.hs view
@@ -5,6 +5,7 @@ propTests, ) where +import Data.List import Data.Set qualified as S import Holidays import Test.Holidays@@ -16,35 +17,35 @@ testGroup "ZAF unit tests" [ testCase "2024" $- S.toAscList (holidays "ZAF" [] 2024)- @?= [ day 2024 1 1,- day 2024 3 21,- day 2024 3 29,- day 2024 4 1,- day 2024 4 27,- day 2024 5 1,- day 2024 5 29,- day 2024 6 17,- day 2024 8 9,- day 2024 9 24,- day 2024 12 16,- day 2024 12 25,- day 2024 12 26+ sortOn holidayValue (S.toAscList (holidays "ZAF" [] 2024))+ @?= [ hday "new_years_day" (day 2024 1 1),+ hday "human_rights_day" (day 2024 3 21),+ hday "good_friday" (day 2024 3 29),+ hday "family_day" (day 2024 4 1),+ hday "freedom_day" (day 2024 4 27),+ hday "workers_day" (day 2024 5 1),+ hday "general_elections_2024" (day 2024 5 29),+ hday "youth_day" (day 2024 6 17),+ hday "womens_day" (day 2024 8 9),+ hday "heritage_day" (day 2024 9 24),+ hday "day_of_reconciliation" (day 2024 12 16),+ hday "christmas_day" (day 2024 12 25),+ hday "day_of_goodwill" (day 2024 12 26) ], testCase "2025" $- S.toAscList (holidays "ZAF" [] 2025)- @?= [ day 2025 1 1,- day 2025 3 21,- day 2025 4 18,- day 2025 4 21,- day 2025 4 28,- day 2025 5 1,- day 2025 6 16,- day 2025 8 9,- day 2025 9 24,- day 2025 12 16,- day 2025 12 25,- day 2025 12 26+ sortOn holidayValue (S.toList (holidays "ZAF" [] 2025))+ @?= [ hday "new_years_day" (day 2025 1 1),+ hday "human_rights_day" (day 2025 3 21),+ hday "good_friday" (day 2025 4 18),+ hday "family_day" (day 2025 4 21),+ hday "freedom_day" (day 2025 4 28),+ hday "workers_day" (day 2025 5 1),+ hday "youth_day" (day 2025 6 16),+ hday "womens_day" (day 2025 8 9),+ hday "heritage_day" (day 2025 9 24),+ hday "day_of_reconciliation" (day 2025 12 16),+ hday "christmas_day" (day 2025 12 25),+ hday "day_of_goodwill" (day 2025 12 26) ] ]
tst/Test/Holidays/UnitedKingdom.hs view
@@ -5,6 +5,7 @@ propTests, ) where +import Data.List import Data.Set qualified as S import Holidays import Test.Holidays@@ -16,26 +17,26 @@ testGroup "GBR unit tests" [ testCase "2025" $- S.toAscList (holidays "GBR" [] 2025)- @?= [ day 2025 1 1,- day 2025 4 18,- day 2025 4 21,- day 2025 5 5,- day 2025 5 26,- day 2025 8 25,- day 2025 12 25,- day 2025 12 26+ sortOn holidayValue (S.toList (holidays "GBR" [] 2025))+ @?= [ hday "new_years_day" (day 2025 1 1),+ hday "good_friday" (day 2025 4 18),+ hday "easter_sunday" (day 2025 4 21),+ hday "early_may_bank_holiday" (day 2025 5 5),+ hday "spring_bank_holiday" (day 2025 5 26),+ hday "summer_bank_holiday" (day 2025 8 25),+ hday "christmas_day" (day 2025 12 25),+ hday "boxing_day" (day 2025 12 26) ], testCase "2026" $- S.toAscList (holidays "GBR" [] 2026)- @?= [ day 2026 1 1,- day 2026 4 3,- day 2026 4 6,- day 2026 5 4,- day 2026 5 25,- day 2026 8 31,- day 2026 12 25,- day 2026 12 28+ sortOn holidayValue (S.toList (holidays "GBR" [] 2026))+ @?= [ hday "new_years_day" (day 2026 1 1),+ hday "good_friday" (day 2026 4 3),+ hday "easter_sunday" (day 2026 4 6),+ hday "early_may_bank_holiday" (day 2026 5 4),+ hday "spring_bank_holiday" (day 2026 5 25),+ hday "summer_bank_holiday" (day 2026 8 31),+ hday "christmas_day" (day 2026 12 25),+ hday "boxing_day" (day 2026 12 28) ] ]
tst/Test/Holidays/UnitedStates.hs view
@@ -5,6 +5,7 @@ propTests, ) where +import Data.List import Data.Set qualified as S import Holidays import Test.Holidays@@ -16,18 +17,18 @@ testGroup "USA unit tests" [ testCase "2025" $- S.toAscList (holidays "USA" [] 2025)- @?= [ day 2025 1 1,- day 2025 1 20,- day 2025 2 17,- day 2025 5 26,- day 2025 6 19,- day 2025 7 4,- day 2025 9 1,- day 2025 10 13,- day 2025 11 11,- day 2025 11 27,- day 2025 12 25+ sortOn holidayValue (S.toAscList (holidays "USA" [] 2025))+ @?= [ hday "new_years_day" (day 2025 1 1),+ hday "martin_luther_kings_birthday" (day 2025 1 20),+ hday "george_washingtons_birthday" (day 2025 2 17),+ hday "memorial_day" (day 2025 5 26),+ hday "juneteenth_independence_day" (day 2025 6 19),+ hday "independence_day" (day 2025 7 4),+ hday "labor_day" (day 2025 9 1),+ hday "columbus_day" (day 2025 10 13),+ hday "veterans_day" (day 2025 11 11),+ hday "thanksgiving_day" (day 2025 11 27),+ hday "christmas_day" (day 2025 12 25) ] ]