speculate-0.2.9: tests/test-eval.hs
-- Test library
import Test
-- Functions under test
import Test.Speculate.Expr.Ground
import Test.Speculate.Utils
import Test.Speculate.Expr
import Data.Maybe
-- TODO: rename test-eval to test-ground
main :: IO ()
main = mainTest tests 10000
tests :: Int -> [Bool]
tests n =
[ True
, holds n' $ \e -> if isEqE preludeInstances e
then e === e
else e =/= e
, xx -+- yy === yy -+- xx
, holds n' $ \(IntE e1) (IntE e2) -> e1 -+- e2 === e2 -+- e1
, xx -+- yy =/= xx -+- xx
, abs' xx === abs' (abs' xx)
, abs' (xx -+- abs' xx) === (xx -+- abs' xx) -- 2*x or 0
, holds n' $ \e1 e2 -> typ e1 /= typ e2 ==> e1 =/= e2
, holds n' $ zero //= one
, holds n' $ not $ xx //= yy
, holds n' $ \e1 e2 -> case equation preludeInstances e1 e2 of
Just e1e2 -> condEqual preludeInstances 500 e1e2 e1 e2
Nothing -> True
, holds n' $ \e1 e2 -> case equation preludeInstances e1 e2 of
Just e1e2 -> condEqualM preludeInstances 500 0 e1e2 e1 e2
Nothing -> True
, fails n' $ \e1 e2 -> case equation preludeInstances e1 e2 of
Just e1e2 -> condEqualM preludeInstances 500 500 e1e2 e1 e2
Nothing -> True
, trueBinds preludeInstances 500 (xx -==- zero) == [[("x",zero)]]
, trueBinds preludeInstances 500 (xx -==- one) == [[("x",one)]]
, trueBinds preludeInstances 500 ((xx -==- one) -&&- (yy -==- zero)) == [[("x",one),("y",zero)]]
, holds n $ ordOK -:> int
, holds n $ ordOK -:> ()
, holds n $ ordOK -:> bool
, holds n $ ordOK -:> [int]
]
where
n' = n `div` 50
x === y = equal preludeInstances 500 x y
infix 4 ===
x =/= y = not (x === y)
infix 4 =/=
x //= y = inequal preludeInstances 500 x y
(*==*), (*/=*), (*<=*), (*<*) :: (Show a, Typeable a) => a -> a -> Bool
x *==* y = eval undefined $ showConstant x -==- showConstant y
x */=* y = eval undefined $ showConstant x -/=- showConstant y
x *<=* y = eval undefined $ showConstant x -<=- showConstant y
x *<* y = eval undefined $ showConstant x -<- showConstant y
eqOK :: (Eq a, Show a, Typeable a) => a -> a -> Bool
eqOK x y = (x *==* y) == (x == y)
&& (x */=* y) == (x /= y)
ordOK :: (Eq a, Ord a, Show a, Typeable a) => a -> a -> Bool
ordOK x y = eqOK x y
&& (x *<=* y) == (x <= y)
&& (x *<* y) == (x < y)