quickcheck-classes-0.6.0.0: src/Test/QuickCheck/Classes/Show.hs
{-# LANGUAGE CPP #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# OPTIONS_GHC -Wall #-}
{-| Module : Test.QuickCheck.Classes.Show
Description : Properties for testing the properties of the Show type class.
-}
module Test.QuickCheck.Classes.Show
( showLaws
) where
import Data.Proxy (Proxy)
import Test.QuickCheck (Arbitrary, Property, property)
import Test.QuickCheck.Classes.Common (Laws(..), ShowReadPrecedence(..))
-- | Tests the following properties:
--
-- [/Show/]
-- @'show' a ≡ 'showsPrec' 0 a ""@
-- [/Equivariance: 'showsPrec'/]
-- @'showsPrec' p a r '++' s ≡ 'showsPrec' p a (r '++' s)@
-- [/Equivariance: 'showList'/]
-- @'showList' as r '++' s ≡ 'showList' as (r '++' s)@
--
showLaws :: (Show a, Arbitrary a) => Proxy a -> Laws
showLaws p = Laws "Show"
[ ("Show", showShowsPrecZero p)
, ("Equivariance: showsPrec", equivarianceShowsPrec p)
, ("Equivariance: showList", equivarianceShowList p)
]
showShowsPrecZero :: forall a. (Show a, Arbitrary a) => Proxy a -> Property
showShowsPrecZero _ =
property $ \(a :: a) ->
show a == showsPrec 0 a ""
equivarianceShowsPrec :: forall a.
(Show a, Arbitrary a) => Proxy a -> Property
equivarianceShowsPrec _ =
property $ \(ShowReadPrecedence p) (a :: a) (r :: String) (s :: String) ->
showsPrec p a r ++ s == showsPrec p a (r ++ s)
equivarianceShowList :: forall a.
(Show a, Arbitrary a) => Proxy a -> Property
equivarianceShowList _ =
property $ \(as :: [a]) (r :: String) (s :: String) ->
showList as r ++ s == showList as (r ++ s)