refinery-0.3.0.0: test/Checkers.hs
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module Checkers where
import Control.Monad.State.Class
import Test.QuickCheck hiding (Failure)
import Test.QuickCheck.Checkers
monadState
:: forall m s a b
. ( MonadState s m
, EqProp (m s)
, EqProp (m ())
, Show s
, Arbitrary s
)
=> m (a, b)
-> TestBatch
monadState _ =
( "MonadState laws"
, [ ("get >> get", (get >> get) =-= get @s @m)
, ("get >>= put", (get @s @m >>= put) =-= pure ())
, ("put >> put", property $ do
s1 <- arbitrary
s2 <- arbitrary
pure $
counterexample (show s1) $
counterexample (show s2) $
(put @_ @m s1 >> put s2) =-= put s2
)
, ("put >> get", property $ do
s <- arbitrary
pure $
counterexample (show s) $
(put s >> get) =-= (put s >> pure @m s)
)
]
)