{-# language TemplateHaskell #-}
{-# language DeriveDataTypeable #-}
{-# language DeriveGeneric #-}
module Main where
import Data.Constructors.TH
import Data.Function (on)
import Data.Data (Data,toConstr)
import Test.QuickCheck (Arbitrary(..),sample,quickCheck)
import Test.QuickCheck.Gen (Gen,oneof)
data PhpValue = VoidValue | IntValue Integer | BoolValue Bool deriving (Data,Show)
$(deriveEqC ''PhpValue)
instance Arbitrary PhpValue where
arbitrary = oneof [pure VoidValue, IntValue <$> arbitrary, BoolValue <$> arbitrary]
eqConstrDefault :: Data a => a -> a -> Bool
eqConstrDefault = (==) `on` toConstr
prop_EqC :: PhpValue -> PhpValue -> Bool
prop_EqC x y = eqConstrDefault x y == eqConstr x y
main = quickCheck prop_EqC