module Data.GenValidity.Hspec
( module Data.GenValidity
, module Data.GenValidity.Hspec
) where
import Data.GenValidity
import Test.Hspec
import Test.QuickCheck
import Data.Data
proxy :: a
proxy = undefined
genspec
:: (Show a, Eq a, Data a, GenValidity a, Arbitrary a)
=> a
-> Spec
genspec proxy = do
let name = show $ typeOf proxy
describe ("GenSpec for " ++ name) $ do
arbitrarySpec proxy
validitySpec proxy
arbitrarySpec
:: (Typeable a, Show a, Eq a, Data a, GenValidity a, Arbitrary a)
=> a
-> Spec
arbitrarySpec proxy = do
let name = show $ typeOf proxy
describe ("Arbitrary " ++ name) $ do
it ("is instantiated such that 'arbitrary' only generates valid \'"
++ name
++ "\'s") $ do
forAll arbitrary $ \a ->
(a `asTypeOf` proxy) `shouldSatisfy` isValid
it ("is instantiated such that 'shrink' only produces valid \'"
++ name
++ "\'s") $ do
forAll arbitrary $ \a ->
shrink (a `asTypeOf` proxy) `shouldSatisfy` all isValid
validitySpec
:: (Typeable a, Show a, Eq a, Data a, GenValidity a, Arbitrary a)
=> a
-> Spec
validitySpec proxy = do
let name = show $ typeOf proxy
describe "genValid" $ do
it ("only generates valid \'" ++ name ++ "\'s") $ do
forAll genValid $ \a ->
(a `asTypeOf` proxy) `shouldSatisfy` isValid
describe "genInvalid" $ do
it ("only generates invalid \'" ++ name ++ "\'s") $ do
forAll genInvalid $ \a ->
(a `asTypeOf` proxy) `shouldNotSatisfy` isValid