packages feed

applicative-parsec-0.1.0.0: tst/Test.hs

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 ())