quickcheck-classes-0.4.12: src/Test/QuickCheck/Classes/ShowRead.hs
{-# LANGUAGE CPP #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# OPTIONS_GHC -Wall #-}
module Test.QuickCheck.Classes.ShowRead
( showReadLaws
) where
import Data.Proxy (Proxy)
import Test.QuickCheck hiding ((.&.))
import Test.QuickCheck.Property (Property)
#if MIN_VERSION_base(4,6,0)
import Text.Read (readMaybe)
#endif
import Test.QuickCheck.Classes.Common (Laws(..))
-- | Tests the following properties:
--
-- [/Partial Isomorphism/]
-- @'readMaybe' ('show' a) == 'Just' a@
--
-- /Note:/ When using @base-4.5@ or older, this
-- instead test the following:
--
-- [/Partial Isomorphism/]
-- @'read' ('show' a) == a@
--
showReadLaws :: (Show a, Read a, Eq a, Arbitrary a) => Proxy a -> Laws
showReadLaws p = Laws "Show/Read"
[ ("Partial Isomorphism", showReadPartialIsomorphism p)
]
showReadPartialIsomorphism :: forall a. (Show a, Read a, Arbitrary a, Eq a) => Proxy a -> Property
showReadPartialIsomorphism _ = property $ \(a :: a) ->
#if MIN_VERSION_base(4,6,0)
readMaybe (show a) == Just a
#else
read (show a) == a
#endif