module Arbitrary.ConditionalRestriction.Parse.AST where import ConditionalRestriction.Parse.AST ( ComparisonOp (..), Condition (..), ConditionalRestriction (..), Expression (..), OpeningHours (OpeningHours), RuleSequence (RuleSequence), RuleType (..), SelectorSequence (..), TimeSpan (..), WeekdayRange (..), ) import Control.Applicative (Alternative (some)) import Data.Hourglass (TimeOfDay (TimeOfDay), WeekDay (Saturday, Sunday)) import Data.Maybe (maybeToList) import Test.QuickCheck ( Arbitrary (arbitrary), elements, listOf, oneof, ) instance Arbitrary ConditionalRestriction where arbitrary = fmap ConditionalRestriction $ (:) <$> arbitrary <*> (maybeToList <$> arbitrary) instance Arbitrary Expression where arbitrary = Expression <$> elements ["yes", "private", "55 mph", "destination"] <*> listOf arbitrary instance Arbitrary Condition where arbitrary = oneof [ OH . OpeningHours <$> listOf arbitrary, Comparison <$> elements ["wheight", "length", "width", "height", "wheels"] <*> arbitrary <*> arbitrary, Absolute <$> elements ["wet", "snow"] ] instance Arbitrary RuleSequence where arbitrary = RuleSequence <$> elements [Normal, Additional] <*> arbitrary <*> arbitrary instance Arbitrary SelectorSequence where arbitrary = oneof [ pure TwentyFourSeven, WeekdaySel <$> listOf arbitrary, TimeSel <$> listOf arbitrary, WeekdayTime <$> listOf arbitrary <*> listOf arbitrary ] instance Arbitrary ComparisonOp where arbitrary = elements [Gt, Lt, GtEq, LtEq, Eq] instance Arbitrary WeekdayRange where arbitrary = oneof [ SingleDay <$> arbitrary, WdayRange <$> arbitrary <*> arbitrary ] instance Arbitrary WeekDay where arbitrary = elements (enumFromTo Sunday Saturday) instance Arbitrary TimeSpan where arbitrary = oneof [ Moment <$> arbitrary, Span <$> arbitrary <*> arbitrary ] instance Arbitrary TimeOfDay where arbitrary = TimeOfDay <$> elements [01 .. 23] <*> elements [00 .. 60] <*> elements [00 .. 60] <*> pure 0