{-# 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