{-# LANGUAGE TemplateHaskell #-} module Main where import Control.Applicative import Data.MessagePack import Data.Serialize import Test.Framework.Providers.QuickCheck2 import Test.Framework.TH import Test.QuickCheck import qualified Data.ByteString as BS import qualified Data.Map as M import qualified Data.Text as T main :: IO () main = $(defaultMainGenerator) instance Arbitrary Object where arbitrary = sized $ \n -> oneof [ return ObjectNil , ObjectInt <$> arbitrary , ObjectBool <$> arbitrary , ObjectFloat <$> arbitrary , ObjectDouble <$> arbitrary , ObjectString <$> arbitrary , ObjectBinary <$> arbitrary , ObjectArray <$> resize (3 * n `quot` 4) arbitrary , ObjectMap <$> resize (3 * n `quot` 4) arbitrary ] shrink (ObjectString s) = map ObjectString $ shrink s shrink (ObjectBinary b) = map ObjectBinary $ shrink b shrink (ObjectArray a) = (map ObjectArray $ shrink a) ++ a shrink (ObjectMap m) = (map ObjectMap $ shrink m) ++ M.keys m ++ M.elems m shrink _ = [] instance (Ord k, Arbitrary k, Arbitrary v) => Arbitrary (M.Map k v) where arbitrary = M.fromList <$> arbitrary shrink = map M.fromList . shrink . M.toList instance Arbitrary BS.ByteString where arbitrary = BS.pack <$> arbitrary shrink = map BS.pack . shrink . BS.unpack instance Arbitrary T.Text where arbitrary = T.pack <$> arbitrary shrink = map T.pack . shrink . T.unpack prop_encodeDecodeIsIdentity :: Object -> Bool prop_encodeDecodeIsIdentity o = either error (== o) $ decode $ encode o