/tests/tests.hs

http://github.com/exclipy/pdata · Haskell · 105 lines · 91 code · 14 blank · 0 comment · 27 complexity · f8efec8c395f3210365eda4e8bcd4e5d MD5 · raw file

  1. import Test.QuickCheck
  2. import Test.QuickCheck.Batch
  3. import Data.Hashable
  4. import Data.HamtMap as HM
  5. import Data.Int
  6. import Data.List (foldl', sort)
  7. import Data.Maybe (isNothing)
  8. import Prelude as P
  9. newtype Inty = Inty Int deriving (Eq, Show, Ord)
  10. instance Hashable Inty where
  11. hash (Inty i) = fromIntegral (hash i `mod` 2)
  12. instance Arbitrary Inty where
  13. arbitrary = do
  14. x <- arbitrary
  15. return $ Inty x
  16. ldelete :: (Eq k) => k -> [(k, v)] -> [(k, v)]
  17. ldelete _ [] = []
  18. ldelete k ((k', v'):xs) | k' == k = ldelete k xs
  19. | otherwise = (k', v') : ldelete k xs
  20. lset :: (Eq k) => k -> v -> [(k, v)] -> [(k, v)]
  21. lset k v [] = []
  22. lset k v ((k', v'):xs) | k' == k = (k, v) : lset k v xs
  23. | otherwise = (k', v') : lset k v xs
  24. prop_insert :: (Eq k, Hashable k, Eq v) => k -> v -> [(k, v)] -> Bool
  25. prop_insert k v lm =
  26. let hm = fromList lm
  27. hm' = insert k v hm
  28. in member k hm'
  29. && not (notMember k hm')
  30. && HM.lookup k hm' == Just v
  31. && hm' ! k == v
  32. && (if member k hm
  33. then toList hm == lset k (hm ! k) (toList hm')
  34. else toList hm == ldelete k (toList hm')
  35. )
  36. prop_delete :: (Eq k, Hashable k, Eq v) => k -> [(k, v)] -> Bool
  37. prop_delete k lm =
  38. let hm = fromList lm
  39. hm' = delete k hm
  40. in not (member k hm')
  41. && notMember k hm'
  42. && isNothing (HM.lookup k hm')
  43. && (if member k hm
  44. then toList hm' == ldelete k (toList hm)
  45. else toList hm' == toList hm
  46. )
  47. prop_fromList :: (Eq k, Hashable k, Ord k, Eq v, Ord v) => [(k, v)] -> Bool
  48. prop_fromList lm =
  49. let hm = fromList lm
  50. hm' = foldl' (\hm (k,v) -> insert k v hm) empty lm
  51. in sort (toList hm) == sort (toList hm')
  52. prop_toList :: (Eq k, Hashable k, Eq v) => [(k, v)] -> Bool
  53. prop_toList lm =
  54. let hm = fromList lm
  55. lm' = toList hm
  56. ks = keys hm
  57. ks' = P.map fst lm'
  58. els = elems hm
  59. els' = P.map snd lm'
  60. els'' = P.map (\k -> hm ! k) ks
  61. in ks == ks'
  62. && els == els'
  63. && els == els''
  64. prop_map :: (Eq k, Hashable k, Integral v) => [(k, v)] -> Bool
  65. prop_map lm =
  66. let hm = fromList lm
  67. lm' = toList hm
  68. in toList (HM.map (*2) hm) == P.map (\(x,y) -> (x, y*2)) lm'
  69. prop_filter :: (Eq k, Hashable k, Integral v) => [(k, v)] -> Bool
  70. prop_filter lm =
  71. let hm = fromList lm
  72. lm' = toList hm
  73. in toList (HM.filter even hm) == P.filter (\(x,y) -> even y) lm'
  74. options = TestOptions
  75. { no_of_tests = 200
  76. , length_of_tests = 2 -- seconds
  77. , debug_tests = False }
  78. main = runTests "tests" options
  79. [ run (prop_insert :: Int -> Int -> [(Int,Int)] -> Bool)
  80. , run (prop_insert :: Inty -> Int -> [(Inty,Int)] -> Bool)
  81. , run (prop_delete :: Int -> [(Int, Int)] -> Bool)
  82. , run (prop_delete :: Inty -> [(Inty, Int)] -> Bool)
  83. , run (prop_fromList :: [(Int, Int)] -> Bool)
  84. , run (prop_fromList :: [(Inty, Int)] -> Bool)
  85. , run (prop_toList :: [(Int, Int)] -> Bool)
  86. , run (prop_toList :: [(Inty, Int)] -> Bool)
  87. , run (prop_map :: [(Int, Int)] -> Bool)
  88. , run (prop_map :: [(Inty, Int)] -> Bool)
  89. , run (prop_filter :: [(Int, Int)] -> Bool)
  90. , run (prop_filter :: [(Inty, Int)] -> Bool)
  91. ]