module Test where
import Test.QuickCheck.Property
import Text.Parsec.Applicative
import Types
isLeft, isRight :: Either a b -> Bool
isLeft (Left _) = True
isLeft (Right _) = False
isRight = not . isLeft
prop_theEndIsTheEnd :: P -> Tokens -> Bool
prop_theEndIsTheEnd p ts =
case parse' p ts of
(Right _, (_ : _)) -> isLeft $ fst ret'
ret -> ret' == ret
where
ret' = parse' (p <* eof) ts
prop_repeatToken :: Int -> Sigma -> Bool
prop_repeatToken reps tok = many (token tok) `accept` zip (r tok) (r ())
where
r = replicate reps
prop_repeatTokens :: Int -> [Sigma] -> Property
prop_repeatTokens reps toks = not (null toks) ==> p `accept` ts
where
p = many . sequenceA . map token $ toks
ts = zip (concat $ replicate reps toks) (repeat ())