module Main (main) where
import Data.HashMap.Internal.List
import Data.List (nub, sort, sortBy)
import Data.Ord (comparing)
import Test.Framework (Test, defaultMain, testGroup)
import Test.Framework.Providers.QuickCheck2 (testProperty)
import Test.QuickCheck ((==>), (===), property, Property)
tests :: Test
tests = testGroup "Data.HashMap.Internal.List"
[ testProperty "isPermutationBy" pIsPermutation
, testProperty "isPermutationBy of different length" pIsPermutationDiffLength
, testProperty "pUnorderedCompare" pUnorderedCompare
, testGroup "modelUnorderedCompare"
[ testProperty "reflexive" modelUnorderedCompareRefl
, testProperty "anti-symmetric" modelUnorderedCompareAntiSymm
, testProperty "transitive" modelUnorderedCompareTrans
]
]
pIsPermutation :: [Char] -> [Int] -> Bool
pIsPermutation xs is = isPermutationBy (==) xs xs'
where
is' = nub is ++ [maximum (0:is) + 1 ..]
xs' = map fst . sortBy (comparing snd) $ zip xs is'
pIsPermutationDiffLength :: [Int] -> [Int] -> Property
pIsPermutationDiffLength xs ys =
length xs /= length ys ==> isPermutationBy (==) xs ys === False
-- | Homogenous version of 'unorderedCompare'
--
-- *Compare smallest non-equal elements of the two lists*.
modelUnorderedCompare :: Ord a => [a] -> [a] -> Ordering
modelUnorderedCompare as bs = compare (sort as) (sort bs)
modelUnorderedCompareRefl :: [Int] -> Property
modelUnorderedCompareRefl xs = modelUnorderedCompare xs xs === EQ
modelUnorderedCompareAntiSymm :: [Int] -> [Int] -> Property
modelUnorderedCompareAntiSymm xs ys = case a of
EQ -> b === EQ
LT -> b === GT
GT -> b === LT
where
a = modelUnorderedCompare xs ys
b = modelUnorderedCompare ys xs
modelUnorderedCompareTrans :: [Int] -> [Int] -> [Int] -> Property
modelUnorderedCompareTrans xs ys zs =
case (modelUnorderedCompare xs ys, modelUnorderedCompare ys zs) of
(EQ, yz) -> xz === yz
(xy, EQ) -> xz === xy
(LT, LT) -> xz === LT
(GT, GT) -> xz === GT
(LT, GT) -> property True
(GT, LT) -> property True
where
xz = modelUnorderedCompare xs zs
pUnorderedCompare :: [Int] -> [Int] -> Property
pUnorderedCompare xs ys =
unorderedCompare compare xs ys === modelUnorderedCompare xs ys
main :: IO ()
main = defaultMain [tests]