{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE DeriveFunctor #-}
import Data.Complex
import Data.Proxy (Proxy(..))
import Data.Ratio (Ratio(..))
import Data.Word (Word64)
import GHC.Fingerprint (Fingerprint)
import Test.QuickCheck hiding (Fixed)
import Test.QuickCheck.Gen (suchThat)
import Test.QuickCheck.Instances ()
import Test.Tasty (defaultMain, testGroup, TestTree)
import Data.Primitive.Instances
import Data.Primitive.Types (Prim(..))
import qualified GHC.Num as Num
import qualified Test.QuickCheck.Classes as QCC
type Laws = QCC.Laws
main :: IO ()
main = QCC.lawsCheckMany namedTests
where
namedTests :: [(String, [Laws])]
namedTests =
[ ("Complex Double", myLaws pComplex)
, ("Ratio Int", myLaws pRatio)
, ("Fingerprint", myLaws pRatio)
]
myLaws :: (Arbitrary a, Show a, Eq a, Prim a) => Proxy a -> [Laws]
myLaws p = [QCC.primLaws p]
p :: forall a. Proxy a; p = Proxy
pComplex = p @(Complex Double)
pRatio = p @(Ratio Int)
pFingerprint = p @Fingerprint