1{-# OPTIONS_GHC -fno-warn-orphans #-}23module QuickCheck (quickTests) where45import Data.List.NonEmpty qualified as NE6import Data.Time.Calendar qualified as Cal7import Data.Time.Calendar.Month8import DatePicker.Util9import Test.Tasty10import Test.Tasty.QuickCheck11 ( Arbitrary,12 arbitrary,13 chooseEnum,14 chooseInteger,15 testProperty,16 )1718instance Arbitrary Month where19 arbitrary = do20 m <- chooseInteger (1, 12)21 y <- chooseInteger (0, 2030)22 pure $ MkMonth ((y * 12) + (m - 1))2324instance Arbitrary Cal.DayOfWeek where25 arbitrary = chooseEnum (Cal.Monday, Cal.Sunday)2627weekList :: Month -> NE.NonEmpty Cal.Day28weekList m =29 NE.fromList $ concatMap NE.toList (monthWeeks m Cal.Monday)3031------------------------------------------------------------------------3233monthWeeksAmount :: TestTree34monthWeeksAmount =35 testProperty36 "week amount >= 4"37 (\m -> NE.length (monthWeeks (m :: Month) Cal.Sunday) >= 4)3839monthWeeksOrdered :: TestTree40monthWeeksOrdered =41 testProperty "weeks of month are ordered properly" propOrdered42 where43 equalsDays :: Month -> [Integer] -> [Cal.Day] -> Bool44 equalsDays m nth days =45 let fstDay = Cal.periodFirstDay m46 in all (\(d, n) -> Cal.addDays n fstDay == d) (zip days nth)4748 propOrdered :: Month -> Bool49 propOrdered m = equalsDays m [0 ..] (NE.toList $ weekList m)5051monthWeeksBoundaries :: TestTree52monthWeeksBoundaries =53 testProperty "first/last day of month in weeks" propBoundary54 where55 propBoundary :: Month -> Bool56 propBoundary m =57 let w = weekList m58 in NE.head w == Cal.periodFirstDay m59 && NE.last w == Cal.periodLastDay m6061monthWeekStartOfWeek :: TestTree62monthWeekStartOfWeek = testProperty "start of week" propWeekStart63 where64 propWeekStart :: Month -> Cal.DayOfWeek -> Bool65 propWeekStart m dw =66 all (\week -> Cal.dayOfWeek (NE.head week) == dw) $67 NE.tail (monthWeeks m dw) -- Doesn't hold for first week6869quickTests :: TestTree70quickTests =71 testGroup72 "QuickCheck Tests"73 [ monthWeeksAmount,74 monthWeeksOrdered,75 monthWeeksBoundaries,76 monthWeekStartOfWeek77 ]