packages feed

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)