{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ViewPatterns #-}
module Evaluation.Builtins.Integer.OrderProperties (test_integer_order_properties)
where
import Prelude hiding (and, not, or)
import Evaluation.Builtins.Common
import Evaluation.Builtins.Integer.Common
import Test.Tasty (TestName, TestTree, testGroup)
import Test.Tasty.QuickCheck
numberOfTests :: Int
numberOfTests :: Int
numberOfTests = Int
200
testProp :: Testable prop => TestName -> prop -> TestTree
testProp :: forall prop. Testable prop => TestName -> prop -> TestTree
testProp TestName
s prop
p = TestName -> Property -> TestTree
forall prop. Testable prop => TestName -> prop -> TestTree
testProperty TestName
s (Property -> TestTree) -> Property -> TestTree
forall a b. (a -> b) -> a -> b
$ Int -> prop -> Property
forall prop. Testable prop => Int -> prop -> Property
withMaxSuccess Int
numberOfTests prop
p
lte_reflexive :: BigInteger -> Property
lte_reflexive :: BigInteger -> Property
lte_reflexive (BigInteger -> PlcTerm
biginteger -> PlcTerm
a) =
PlcTerm -> Property
evalOkTrue (PlcTerm -> Property) -> PlcTerm -> Property
forall a b. (a -> b) -> a -> b
$ PlcTerm -> PlcTerm -> PlcTerm
lessThanEqualsInteger PlcTerm
a PlcTerm
a
lte_antisymmetric :: BigInteger -> BigInteger -> Property
lte_antisymmetric :: BigInteger -> BigInteger -> Property
lte_antisymmetric (BigInteger -> PlcTerm
biginteger -> PlcTerm
a) (BigInteger -> PlcTerm
biginteger -> PlcTerm
b) =
PlcTerm -> Property
evalOkTrue (PlcTerm -> Property) -> PlcTerm -> Property
forall a b. (a -> b) -> a -> b
$
(PlcTerm -> PlcTerm -> PlcTerm
lessThanEqualsInteger PlcTerm
a PlcTerm
b PlcTerm -> PlcTerm -> PlcTerm
`and` PlcTerm -> PlcTerm -> PlcTerm
lessThanEqualsInteger PlcTerm
b PlcTerm
a)
PlcTerm -> PlcTerm -> PlcTerm
`implies` PlcTerm -> PlcTerm -> PlcTerm
equalsInteger PlcTerm
a PlcTerm
b
lte_transitive :: BigInteger -> BigInteger -> BigInteger -> Property
lte_transitive :: BigInteger -> BigInteger -> BigInteger -> Property
lte_transitive (BigInteger -> PlcTerm
biginteger -> PlcTerm
a) (BigInteger -> PlcTerm
biginteger -> PlcTerm
b) (BigInteger -> PlcTerm
biginteger -> PlcTerm
c) =
PlcTerm -> Property
evalOkTrue (PlcTerm -> Property) -> PlcTerm -> Property
forall a b. (a -> b) -> a -> b
$
(PlcTerm -> PlcTerm -> PlcTerm
lessThanEqualsInteger PlcTerm
a PlcTerm
b PlcTerm -> PlcTerm -> PlcTerm
`and` PlcTerm -> PlcTerm -> PlcTerm
lessThanEqualsInteger PlcTerm
b PlcTerm
c)
PlcTerm -> PlcTerm -> PlcTerm
`implies` PlcTerm -> PlcTerm -> PlcTerm
lessThanEqualsInteger PlcTerm
a PlcTerm
c
trichotomy :: BigInteger -> BigInteger -> Property
trichotomy :: BigInteger -> BigInteger -> Property
trichotomy (BigInteger -> PlcTerm
biginteger -> PlcTerm
a) (BigInteger -> PlcTerm
biginteger -> PlcTerm
b) =
PlcTerm -> Property
evalOkTrue (PlcTerm -> Property) -> PlcTerm -> Property
forall a b. (a -> b) -> a -> b
$
PlcTerm -> PlcTerm -> PlcTerm
lessThanInteger PlcTerm
a PlcTerm
b PlcTerm -> PlcTerm -> PlcTerm
`xor` PlcTerm -> PlcTerm -> PlcTerm
equalsInteger PlcTerm
a PlcTerm
b PlcTerm -> PlcTerm -> PlcTerm
`xor` PlcTerm -> PlcTerm -> PlcTerm
lessThanInteger PlcTerm
b PlcTerm
a
lt_versus_lte :: BigInteger -> BigInteger -> Property
lt_versus_lte :: BigInteger -> BigInteger -> Property
lt_versus_lte (BigInteger -> PlcTerm
biginteger -> PlcTerm
a) (BigInteger -> PlcTerm
biginteger -> PlcTerm
b) =
PlcTerm -> Property
evalOkTrue (PlcTerm -> Property) -> PlcTerm -> Property
forall a b. (a -> b) -> a -> b
$
PlcTerm -> PlcTerm -> PlcTerm
lessThanEqualsInteger PlcTerm
a PlcTerm
b PlcTerm -> PlcTerm -> PlcTerm
`iff` (PlcTerm -> PlcTerm -> PlcTerm
lessThanInteger PlcTerm
a PlcTerm
b PlcTerm -> PlcTerm -> PlcTerm
`xor` PlcTerm -> PlcTerm -> PlcTerm
equalsInteger PlcTerm
a PlcTerm
b)
add_pairs :: BigInteger -> BigInteger -> BigInteger -> BigInteger -> Property
add_pairs :: BigInteger -> BigInteger -> BigInteger -> BigInteger -> Property
add_pairs (BigInteger -> PlcTerm
biginteger -> PlcTerm
a) (BigInteger -> PlcTerm
biginteger -> PlcTerm
b) (BigInteger -> PlcTerm
biginteger -> PlcTerm
c) (BigInteger -> PlcTerm
biginteger -> PlcTerm
d) =
PlcTerm -> Property
evalOkTrue (PlcTerm -> Property) -> PlcTerm -> Property
forall a b. (a -> b) -> a -> b
$
(PlcTerm -> PlcTerm -> PlcTerm
lessThanEqualsInteger PlcTerm
a PlcTerm
b PlcTerm -> PlcTerm -> PlcTerm
`and` PlcTerm -> PlcTerm -> PlcTerm
lessThanEqualsInteger PlcTerm
c PlcTerm
d)
PlcTerm -> PlcTerm -> PlcTerm
`implies` PlcTerm -> PlcTerm -> PlcTerm
lessThanEqualsInteger (PlcTerm -> PlcTerm -> PlcTerm
addInteger PlcTerm
a PlcTerm
c) (PlcTerm -> PlcTerm -> PlcTerm
addInteger PlcTerm
b PlcTerm
d)
mul_pos_pos :: NonNegative BigInteger -> NonNegative BigInteger -> Property
mul_pos_pos :: NonNegative BigInteger -> NonNegative BigInteger -> Property
mul_pos_pos (NonNegative (BigInteger -> PlcTerm
biginteger -> PlcTerm
a)) (NonNegative (BigInteger -> PlcTerm
biginteger -> PlcTerm
b)) =
PlcTerm -> Property
evalOkTrue (PlcTerm -> Property) -> PlcTerm -> Property
forall a b. (a -> b) -> a -> b
$ PlcTerm -> PlcTerm -> PlcTerm
lessThanEqualsInteger PlcTerm
zero (PlcTerm -> PlcTerm -> PlcTerm
multiplyInteger PlcTerm
a PlcTerm
b)
mul_pos_neg :: NonNegative BigInteger -> NonPositive BigInteger -> Property
mul_pos_neg :: NonNegative BigInteger -> NonPositive BigInteger -> Property
mul_pos_neg (NonNegative (BigInteger -> PlcTerm
biginteger -> PlcTerm
a)) (NonPositive (BigInteger -> PlcTerm
biginteger -> PlcTerm
b)) =
PlcTerm -> Property
evalOkTrue (PlcTerm -> Property) -> PlcTerm -> Property
forall a b. (a -> b) -> a -> b
$ PlcTerm -> PlcTerm -> PlcTerm
lessThanEqualsInteger (PlcTerm -> PlcTerm -> PlcTerm
multiplyInteger PlcTerm
a PlcTerm
b) PlcTerm
zero
mul_neg_pos :: NonPositive BigInteger -> NonNegative BigInteger -> Property
mul_neg_pos :: NonPositive BigInteger -> NonNegative BigInteger -> Property
mul_neg_pos (NonPositive (BigInteger -> PlcTerm
biginteger -> PlcTerm
a)) (NonNegative (BigInteger -> PlcTerm
biginteger -> PlcTerm
b)) =
PlcTerm -> Property
evalOkTrue (PlcTerm -> Property) -> PlcTerm -> Property
forall a b. (a -> b) -> a -> b
$ PlcTerm -> PlcTerm -> PlcTerm
lessThanEqualsInteger (PlcTerm -> PlcTerm -> PlcTerm
multiplyInteger PlcTerm
a PlcTerm
b) PlcTerm
zero
mul_neg_neg :: NonPositive BigInteger -> NonPositive BigInteger -> Property
mul_neg_neg :: NonPositive BigInteger -> NonPositive BigInteger -> Property
mul_neg_neg (NonPositive (BigInteger -> PlcTerm
biginteger -> PlcTerm
a)) (NonPositive (BigInteger -> PlcTerm
biginteger -> PlcTerm
b)) =
PlcTerm -> Property
evalOkTrue (PlcTerm -> Property) -> PlcTerm -> Property
forall a b. (a -> b) -> a -> b
$ PlcTerm -> PlcTerm -> PlcTerm
lessThanEqualsInteger PlcTerm
zero (PlcTerm -> PlcTerm -> PlcTerm
multiplyInteger PlcTerm
a PlcTerm
b)
test_integer_order_properties :: TestTree
test_integer_order_properties :: TestTree
test_integer_order_properties =
TestName -> [TestTree] -> TestTree
testGroup TestName
"Property tests involving integer ordering"
[ TestName -> (BigInteger -> Property) -> TestTree
forall prop. Testable prop => TestName -> prop -> TestTree
testProp TestName
"lessThanEqualsInteger is reflexive" BigInteger -> Property
lte_reflexive
, TestName -> (BigInteger -> BigInteger -> Property) -> TestTree
forall prop. Testable prop => TestName -> prop -> TestTree
testProp TestName
"lessThanEqualsInteger is antisymmetric" BigInteger -> BigInteger -> Property
lte_antisymmetric
, TestName
-> (BigInteger -> BigInteger -> BigInteger -> Property) -> TestTree
forall prop. Testable prop => TestName -> prop -> TestTree
testProp TestName
"lessThanEqualsInteger is transitive" BigInteger -> BigInteger -> BigInteger -> Property
lte_transitive
, TestName -> (BigInteger -> BigInteger -> Property) -> TestTree
forall prop. Testable prop => TestName -> prop -> TestTree
testProp TestName
"a <= b <=> a < b or a = b" BigInteger -> BigInteger -> Property
lt_versus_lte
, TestName -> (BigInteger -> BigInteger -> Property) -> TestTree
forall prop. Testable prop => TestName -> prop -> TestTree
testProp TestName
"a < b or a = b or b < a" BigInteger -> BigInteger -> Property
trichotomy
, TestName
-> (BigInteger
-> BigInteger -> BigInteger -> BigInteger -> Property)
-> TestTree
forall prop. Testable prop => TestName -> prop -> TestTree
testProp TestName
"a <= b and c <= d => addInteger a c <= addInteger b d" BigInteger -> BigInteger -> BigInteger -> BigInteger -> Property
add_pairs
, TestName
-> (NonNegative BigInteger -> NonNegative BigInteger -> Property)
-> TestTree
forall prop. Testable prop => TestName -> prop -> TestTree
testProp TestName
"multiplyInteger (>= 0) (>= 0) >= 0" NonNegative BigInteger -> NonNegative BigInteger -> Property
mul_pos_pos
, TestName
-> (NonNegative BigInteger -> NonPositive BigInteger -> Property)
-> TestTree
forall prop. Testable prop => TestName -> prop -> TestTree
testProp TestName
"multiplyInteger (>= 0) (<= 0) <= 0" NonNegative BigInteger -> NonPositive BigInteger -> Property
mul_pos_neg
, TestName
-> (NonPositive BigInteger -> NonNegative BigInteger -> Property)
-> TestTree
forall prop. Testable prop => TestName -> prop -> TestTree
testProp TestName
"multiplyInteger (<= 0) (>= 0) <= 0" NonPositive BigInteger -> NonNegative BigInteger -> Property
mul_neg_pos
, TestName
-> (NonPositive BigInteger -> NonPositive BigInteger -> Property)
-> TestTree
forall prop. Testable prop => TestName -> prop -> TestTree
testProp TestName
"multiplyInteger (<= 0) (<= 0) >= 0" NonPositive BigInteger -> NonPositive BigInteger -> Property
mul_neg_neg
]