{-# LANGUAGE ScopedTypeVariables #-}
{-# OPTIONS_GHC -Wall #-}
module Test.QuickCheck.Classes.Enum
( enumLaws
, boundedEnumLaws
) where
import Data.Proxy (Proxy)
import Test.QuickCheck hiding ((.&.))
import Test.QuickCheck.Property (Property)
import Test.QuickCheck.Classes.Internal (Laws(..), myForAllShrink)
enumLaws :: (Enum a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws
enumLaws :: Proxy a -> Laws
enumLaws p :: Proxy a
p = String -> [(String, Property)] -> Laws
Laws "Enum"
[ ("Succ Pred Identity", Proxy a -> Property
forall a.
(Enum a, Eq a, Arbitrary a, Show a) =>
Proxy a -> Property
succPredIdentity Proxy a
p)
, ("Pred Succ Identity", Proxy a -> Property
forall a.
(Enum a, Eq a, Arbitrary a, Show a) =>
Proxy a -> Property
predSuccIdentity Proxy a
p)
]
boundedEnumLaws :: (Enum a, Bounded a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws
boundedEnumLaws :: Proxy a -> Laws
boundedEnumLaws p :: Proxy a
p = String -> [(String, Property)] -> Laws
Laws "Enum"
[ ("Succ Pred Identity", Proxy a -> Property
forall a.
(Enum a, Bounded a, Eq a, Arbitrary a, Show a) =>
Proxy a -> Property
succPredBoundedIdentity Proxy a
p)
, ("Pred Succ Identity", Proxy a -> Property
forall a.
(Enum a, Bounded a, Eq a, Arbitrary a, Show a) =>
Proxy a -> Property
predSuccBoundedIdentity Proxy a
p)
]
succPredIdentity :: forall a. (Enum a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
succPredIdentity :: Proxy a -> Property
succPredIdentity _ = Bool
-> (a -> Bool)
-> (a -> [String])
-> String
-> (a -> a)
-> String
-> (a -> a)
-> Property
forall a b.
(Arbitrary a, Show b, Eq b) =>
Bool
-> (a -> Bool)
-> (a -> [String])
-> String
-> (a -> b)
-> String
-> (a -> b)
-> Property
myForAllShrink Bool
False (Bool -> a -> Bool
forall a b. a -> b -> a
const Bool
True)
(\(a
a :: a) -> ["a = " String -> String -> String
forall a. [a] -> [a] -> [a]
++ a -> String
forall a. Show a => a -> String
show a
a])
"succ (pred x)"
(\a :: a
a -> a -> a
forall a. Enum a => a -> a
succ (a -> a
forall a. Enum a => a -> a
pred a
a))
"x"
(\a :: a
a -> a
a)
predSuccIdentity :: forall a. (Enum a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
predSuccIdentity :: Proxy a -> Property
predSuccIdentity _ = Bool
-> (a -> Bool)
-> (a -> [String])
-> String
-> (a -> a)
-> String
-> (a -> a)
-> Property
forall a b.
(Arbitrary a, Show b, Eq b) =>
Bool
-> (a -> Bool)
-> (a -> [String])
-> String
-> (a -> b)
-> String
-> (a -> b)
-> Property
myForAllShrink Bool
False (Bool -> a -> Bool
forall a b. a -> b -> a
const Bool
True)
(\(a
a :: a) -> ["a = " String -> String -> String
forall a. [a] -> [a] -> [a]
++ a -> String
forall a. Show a => a -> String
show a
a])
"pred (succ x)"
(\a :: a
a -> a -> a
forall a. Enum a => a -> a
pred (a -> a
forall a. Enum a => a -> a
succ a
a))
"x"
(\a :: a
a -> a
a)
succPredBoundedIdentity :: forall a. (Enum a, Bounded a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
succPredBoundedIdentity :: Proxy a -> Property
succPredBoundedIdentity _ = Bool
-> (a -> Bool)
-> (a -> [String])
-> String
-> (a -> a)
-> String
-> (a -> a)
-> Property
forall a b.
(Arbitrary a, Show b, Eq b) =>
Bool
-> (a -> Bool)
-> (a -> [String])
-> String
-> (a -> b)
-> String
-> (a -> b)
-> Property
myForAllShrink Bool
False (\a :: a
a -> a
a a -> a -> Bool
forall a. Eq a => a -> a -> Bool
/= a
forall a. Bounded a => a
minBound)
(\(a
a :: a) -> ["a = " String -> String -> String
forall a. [a] -> [a] -> [a]
++ a -> String
forall a. Show a => a -> String
show a
a])
"succ (pred x)"
(\a :: a
a -> a -> a
forall a. Enum a => a -> a
succ (a -> a
forall a. Enum a => a -> a
pred a
a))
"x"
(\a :: a
a -> a
a)
predSuccBoundedIdentity :: forall a. (Enum a, Bounded a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
predSuccBoundedIdentity :: Proxy a -> Property
predSuccBoundedIdentity _ = Bool
-> (a -> Bool)
-> (a -> [String])
-> String
-> (a -> a)
-> String
-> (a -> a)
-> Property
forall a b.
(Arbitrary a, Show b, Eq b) =>
Bool
-> (a -> Bool)
-> (a -> [String])
-> String
-> (a -> b)
-> String
-> (a -> b)
-> Property
myForAllShrink Bool
False (\a :: a
a -> a
a a -> a -> Bool
forall a. Eq a => a -> a -> Bool
/= a
forall a. Bounded a => a
maxBound)
(\(a
a :: a) -> ["a = " String -> String -> String
forall a. [a] -> [a] -> [a]
++ a -> String
forall a. Show a => a -> String
show a
a])
"pred (succ x)"
(\a :: a
a -> a -> a
forall a. Enum a => a -> a
pred (a -> a
forall a. Enum a => a -> a
succ a
a))
"x"
(\a :: a
a -> a
a)