packages feed

tuples-0.1.0.0: test/Main.hs

{-# language DerivingStrategies #-}
{-# language DerivingVia #-}
{-# language GeneralizedNewtypeDeriving #-}
{-# language LambdaCase #-}
{-# language ScopedTypeVariables #-}
{-# language TypeApplications #-}

{-# OPTIONS_GHC -fno-warn-orphans #-}

import Data.Tuple.Types (IntPair(..),WordPair(..))
import Data.Tuple.Types (IntTriple(..),WordTriple(..))
import Data.Tuple.Types (DoubleTriple(..),DoublePair(..))

import Control.Applicative (liftA2,liftA3)
import Data.Proxy (Proxy(..))
import Data.Typeable (Typeable,typeRep)
import Test.QuickCheck (Arbitrary,arbitrary)
import Test.QuickCheck.Classes (primLaws)
import Test.Tasty (TestTree,defaultMain,testGroup)

import qualified Test.QuickCheck.Classes as QCC
import qualified Test.Tasty.QuickCheck as TQC

main :: IO ()
main = defaultMain tests

tests :: TestTree
tests = testGroup "tuples"
  [ laws @IntTriple [primLaws]
  , laws @WordTriple [primLaws]
  , laws @DoubleTriple [primLaws]
  , laws @IntPair [primLaws]
  , laws @WordPair [primLaws]
  , laws @DoublePair [primLaws]
  ]

laws :: forall a. Typeable a => [Proxy a -> QCC.Laws] -> TestTree
laws = testGroup (show (typeRep (Proxy :: Proxy a))) . map
  ( \f -> let QCC.Laws name pairs = f (Proxy :: Proxy a) in
    testGroup name (map (uncurry TQC.testProperty) pairs)
  )

instance Arbitrary IntTriple where
  arbitrary = liftA3 IntTriple arbitrary arbitrary arbitrary
instance Arbitrary WordTriple where
  arbitrary = liftA3 WordTriple arbitrary arbitrary arbitrary
instance Arbitrary DoubleTriple where
  arbitrary = liftA3 DoubleTriple arbitrary arbitrary arbitrary
instance Arbitrary DoublePair where
  arbitrary = liftA2 DoublePair arbitrary arbitrary
instance Arbitrary IntPair where
  arbitrary = liftA2 IntPair arbitrary arbitrary
instance Arbitrary WordPair where
  arbitrary = liftA2 WordPair arbitrary arbitrary