module ToolShed.Test.SelfValidate(
quickChecks
) where
import Control.Applicative((<$>))
import qualified Data.Foldable
import qualified Data.List
import qualified Data.Map
import qualified Data.Set
import qualified Test.QuickCheck
import Test.QuickCheck((==>))
import qualified ToolShed.SelfValidate as SelfValidate
import ToolShed.Test.QuickCheck.Arbitrary.Map()
import ToolShed.Test.QuickCheck.Arbitrary.Set()
newtype Primes = MkPrimes Int deriving (Eq, Ord, Show)
instance SelfValidate.SelfValidator Primes where
getErrors (MkPrimes i) = SelfValidate.extractErrors [
(any ((== 0) . (i `rem`)) [2,3,5], "Composite; " ++ show i),
(i < 0, "Negative; " ++ show i),
(i `elem` [0, 1], "Excluded; " ++ show i)
]
instance Test.QuickCheck.Arbitrary Primes where
arbitrary = MkPrimes <$> Test.QuickCheck.elements [negate limit .. limit] where limit = pred $ 7 * 7
quickChecks :: IO ()
quickChecks
= Test.QuickCheck.quickCheck `mapM_` [prop_list, prop_list']
>> Test.QuickCheck.quickCheck prop_set
>> Test.QuickCheck.quickCheck prop_map
where
prop_list :: [Primes] -> Test.QuickCheck.Property
prop_list l = not (null l) ==> Test.QuickCheck.label "prop_list" $ SelfValidate.getErrors (head l) `Data.List.isPrefixOf` SelfValidate.getErrors l
prop_list' l = Test.QuickCheck.label "prop_list'" $ all (
(`elem` map SelfValidate.getErrors l) . SelfValidate.getErrors
) l
prop_set :: Data.Set.Set Primes -> Test.QuickCheck.Property
prop_set s = Test.QuickCheck.label "prop_set" $ Data.Foldable.all (
(`Data.Set.isSubsetOf` Data.Set.fromList (SelfValidate.getErrors s)) . Data.Set.fromList . SelfValidate.getErrors
) s
prop_map :: Data.Map.Map Int Primes -> Test.QuickCheck.Property
prop_map m = Test.QuickCheck.label "prop_map" $ Data.Foldable.all (
(`Data.Set.isSubsetOf` Data.Set.fromList (SelfValidate.getErrors m)) . Data.Set.fromList . SelfValidate.getErrors
) m