{-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} import Control.Applicative ((<*>), (<$>)) import Control.Monad (unless) import Data.Map (fromList, toList) import Data.Text (Text, pack, unpack) import System.Exit import Test.QuickCheck import Test.QuickCheck.Test (isSuccess) import Text.Damn.Packet instance Arbitrary Text where arbitrary = pack <$> vectorOf 10 (elements ['a'..'z']) shrink m = pack <$> shrink (unpack m) instance Arbitrary Packet where arbitrary = do cmd <- arbitrary prm <- arbitrary args <- fromList <$> arbitrary b <- arbitrary return $ Packet cmd prm args b shrink (Packet a b c d) = Packet <$> shrink a <*> shrink b <*> (fromList <$> shrink (toList c)) <*> shrink d quickCheckExit :: Testable prop => prop -> IO () quickCheckExit prop = do res <- quickCheckResult prop unless (isSuccess res) exitFailure main :: IO () main = quickCheckExit (\pk -> parse' (render pk) == Just pk)