{-# LANGUAGE ScopedTypeVariables #-} module Ord ( ord ) where import Test.QuickCheck (Arbitrary) import Test.QuickCheck.Checkers (EqProp) import Test.QuickCheck.Classes.Extra (complement, strictTotalOrd) import Test.Tasty.Extra (testGroup, TestTree) import Test.Tasty.QuickCheck (Gen, arbitrary, testProperty, property) ord :: forall a. (Arbitrary a, Show a, EqProp a, Ord a) => a -> TestTree ord _ = testGroup "Test Ord instance" ts where gen :: a -> Gen a gen = const arbitrary ts = [ -- It's a bit of a pain, but basically the arbitrary instance could -- generate for precision p: -- -- 2, 1, 3. Where 2 <= 1 and 2<=3 (because they compare equal at the low -- precision p) and hence 1 <= 3 (which is detected and fails the test). -- -- testTreeFromNamedBatch "<= is a total ordering" (ordRel (<=) gen) -- testTreeFromNamedBatch ">= is a total ordering" (ordRel (>=) gen) strictTotalOrd "< is a strict total ordering" gen (<) , strictTotalOrd "< is a strict total ordering" gen (>) , complement "< is the complement of >=" gen (<) (>=) , complement "> is the complement of <=" gen (>) (<=) , testProperty "max x y >= x and y" (property $ \x y -> let m = max x y :: a in m >= x && m >= y) , testProperty "max x y == x or y" (property $ \x y -> let m = max x y :: a in m == x || m == y) , testProperty "min x y >= x and y" (property $ \x y -> let m = min x y :: a in m <= x && m <= y) , testProperty "min x y == x or y" (property $ \x y -> let m = min x y :: a in m == x || m == y) ]