module Test.Tests where import Prelude hiding (null) import Test.QuickCheck import Data.Bimap instance (Ord a, Arbitrary a, Ord b, Arbitrary b) => Arbitrary (Bimap a b) where arbitrary = fromList `fmap` arbitrary coarbitrary = coarbitrary . toList prop_size_empty = size empty == 0 prop_null_empty = null empty -- (heh, this is probably made redundant by polymorphism) prop_fromList_toList xs = let xs' = toList . fromList $ xs in all (flip elem xs) xs' where _ = xs :: [(Int, Integer)] -- when converting a list to a bimap, each list element either -- ends up in the bimap, or could conceivably have been clobbered prop_fromList_account xs = all (\x -> isMember x || notUnique x) xs where _ = xs :: [(Int, Integer)] bi = fromList xs isMember x = x `pairMember` bi notUnique (x, y) = ((>1) . length . filter (== x) . map fst $ xs) || ((>1) . length . filter (== y) . map snd $ xs) prop_fromList_size xs = (size $ fromList xs) <= length xs where _ = xs :: [(Int, Integer)] -- if we insert a pair with an existing value, the old value's twin -- is no longer in the bimap prop_clobberL bi b' = (not . null $ bi) && (b' `notMemberR` bi) ==> (a, b) `pairNotMember` insert a b' bi where (a, b) = head . toList $ bi :: (Int, Integer) prop_clobberR bi a' = (not . null $ bi) && (a' `notMember` bi) ==> (a, b) `pairNotMember` insert a' b bi where (a, b) = head . toList $ bi :: (Int, Integer) -- an arbitrary bimap is valid prop_valid bi = valid bi where _ = bi :: Bimap Int Integer prop_member_twin bi = flip all (toList bi) $ \(x, y) -> and [ (bi ! x) `memberR` bi , (bi !> y) `member` bi ] where _ = bi :: Bimap Int Integer prop_delete bi = flip all (toList bi) $ \(x, y) -> and [ x `notMember` delete x bi , y `notMemberR` deleteR y bi ] where _ = bi :: Bimap Int Integer prop_delete_twin bi = flip all (toList bi) $ \(x, y) -> and [ (bi ! x) `notMemberR` delete x bi , (bi !> y) `notMember` deleteR y bi ] where _ = bi :: Bimap Int Integer prop_singleton x y = let bi = singleton x y in and [ valid bi , (x, y) `pairMember` bi , (bi ! x) == y , (bi !> y) == x , size bi == 1 ] where _ = (x, y) :: (Int, Integer) prop_twist_twist bi = bi == (twist . twist $ bi) where _ = bi :: Bimap Int Integer