{-# OPTIONS_GHC -fglasgow-exts #-} module Choose ( tests_Choose ) where import Control.Monad.ST import Data.Array.ST import Data.List( foldl' ) import qualified Data.List as List import Data.Maybe( fromJust ) import Data.Choose import Driver import Test.QuickCheck hiding (choose) import Test.Choose() import qualified Test.Choose as Test prop_possible_choose (Index n' k) = let n = n'-1 in possible (choose n k) == n prop_size_choose (Index n' k) = let n = n'-1 in size (choose n k) == k prop_elems_choose (Index n' k) = let n = n'-1 in elems (choose n k) == [0 .. k-1] prop_possible_listChoose (ListChoose n k is) = possible (listChoose n k is) == n prop_size_listChoose (ListChoose n k is) = size (listChoose n k is) == k prop_elems_listChoose (ListChoose n k is) = elems (listChoose n k is) == is prop_at = prop_at_help at prop_unsafeAt = prop_at_help unsafeAt prop_at_help a = forAll arbitrary $ \(Index k i) -> forAll arbitrary $ \(Nat nk) -> forAll (Test.choose (nk+k) k) $ \c -> a c i == (elems c) !! i prop_possible_complement (c :: Choose) = possible (complement c) == possible c prop_size_complement (c :: Choose) = size (complement c) == possible c - size c prop_elems_complement (c :: Choose) = all (not . (`elem` is)) is' where is = elems c is' = elems (complement c) prop_prev_choose (Index n1 k) = let n = n1-1 in prev (choose n k) == Nothing prop_next_last (Index n1 k) = let n = n1-1 in next (listChoose n k $ [(n-k)..(n-1)]) == Nothing prop_next_prev (c :: Choose) = case prev c of Just c' -> c == (fromJust $ next c') Nothing -> c == choose n k where n = possible c k = size c prop_prev_next (c :: Choose) = case next c of Just c' -> c == (fromJust $ prev c') Nothing -> c == (listChoose n k $ [(n-k)..(n-1)]) where n = possible c k = size c tests_Choose = [ ("possible . choose" , mytest prop_possible_choose) , ("size . choose" , mytest prop_size_choose) , ("elems . choose" , mytest prop_elems_choose) , ("possible . listChoose" , mytest prop_possible_listChoose) , ("size . listChoose" , mytest prop_size_listChoose) , ("elems . listChoose" , mytest prop_elems_listChoose) , ("at" , mytest prop_at) , ("unsafeAt" , mytest prop_unsafeAt) , ("possible . complement" , mytest prop_possible_complement) , ("size . complement" , mytest prop_size_complement) , ("elems . complement" , mytest prop_elems_complement) , ("prev . choose" , mytest prop_prev_choose) , ("next (last choose)" , mytest prop_next_last) , ("next . prev" , mytest prop_next_prev) , ("prev . next" , mytest prop_prev_next) ]