HaskellForMaths-0.4.4: Math/Test/TCore/TUtils.hs
-- Copyright (c) 2012, David Amos. All rights reserved.
module Math.Test.TCore.TUtils where
import Data.List as L
import Test.QuickCheck
import Math.Core.Utils
quickCheckUtils = do
putStrLn "Testing Math.Core.Utils"
quickCheck prop_setUnionAsc
quickCheck prop_multisetSumAsc
quickCheck prop_multisetSumDesc
quickCheck prop_diffAsc
quickCheck prop_diffDesc
prop_setUnionAsc xs ys = setUnionAsc xs' ys' == zs'
where xs' = toSet xs :: [Int]
ys' = toSet ys
zs' = toSet (xs++ys)
prop_multisetSumAsc xs ys = multisetSumAsc xs' ys' == zs'
where xs' = L.sort xs :: [Int]
ys' = L.sort ys
zs' = L.sort (xs ++ ys)
prop_multisetSumDesc xs ys = multisetSumDesc xs' ys' == zs'
where xs' = reverse (L.sort xs) :: [Int]
ys' = reverse (L.sort ys)
zs' = reverse (L.sort (xs ++ ys))
prop_diffAsc xs ys = diffAsc xs' ys' == xs' \\ ys'
where xs' = L.sort xs :: [Int]
ys' = L.sort ys
prop_diffDesc xs ys = diffDesc xs' ys' == xs' \\ ys'
where xs' = reverse (L.sort xs) :: [Int]
ys' = reverse (L.sort ys)
-- !! Feels like we need a better negative test
-- xs is never submultiset of symmetric difference xs ys, unless null ys
prop_isSubMultisetAsc xs ys = isSubMultisetAsc xs' zs'
&& (isSubMultisetAsc zs' xs' `implies` null ys)
&& (isSubMultisetAsc xs' ys' `implies` (length xs <= length ys))
where xs' = L.sort xs :: [Int]
ys' = L.sort ys
zs' = multisetSumAsc xs' ys'
implies p q = not p || q