servant-routes-0.1.1.0: test/Servant/API/Routes/Util.hs
module Servant.API.Routes.Util where
import Data.Typeable
import qualified Test.Hspec as H
import qualified Test.Hspec.QuickCheck as H
import qualified Test.QuickCheck as Q
intTypeRep :: TypeRep
intTypeRep = typeRep $ Proxy @Int
strTypeRep :: TypeRep
strTypeRep = typeRep $ Proxy @String
unitTypeRep :: TypeRep
unitTypeRep = typeRep $ Proxy @()
{- HLINT ignore "Use /= -}
testEqInstances :: forall a. (Q.Arbitrary a, Show a, Eq a) => H.Spec
testEqInstances =
H.describe "Eq instance should satisfy laws" $ do
H.prop "Reflexivity" $ \(p1 :: a) ->
p1 Q.=== p1
H.prop "Symmetry" $ \(p1 :: a) p2 ->
(p1 == p2) Q.=== (p2 == p1)
H.prop "Negation" $ \(p1 :: a) p2 ->
(p1 /= p2) Q.=== not (p1 == p2)
testOrdInstances :: forall a. (Q.Arbitrary a, Show a, Ord a) => H.Spec
testOrdInstances =
H.describe "Ord instance should satisfy laws" $ do
H.prop "Comparability" $ \(p1 :: a) p2 ->
(p1 <= p2) Q..||. (p2 <= p1)
H.prop "Transitivity" $ \(p1 :: a) p2 p3 ->
(p1 <= p2 && p2 <= p3) Q.==> (p1 <= p3)
H.prop "Reflexivity" $ \(p1 :: a) ->
p1 <= p1
H.prop "Antisymmetry" $ \(p1 :: a) p2 ->
(p1 <= p2 && p2 <= p1) Q.==> (p1 Q.=== p2)