module Test.Validity.Arbitrary
(
arbitrarySpec
, arbitraryGeneratesOnlyValid
, shrinkProducesOnlyValids
) where
import Data.Data
import Data.Proxy
import Data.GenValidity
import Test.Hspec
import Test.QuickCheck
import Test.Validity.Utils
import Test.Validity.GenValidity
arbitrarySpec
:: (Typeable a, Show a, Validity a, Arbitrary a)
=> Proxy a
-> Spec
arbitrarySpec proxy = do
let name = nameOf proxy
describe ("Arbitrary " ++ name) $ do
it ("is instantiated such that 'arbitrary' only generates valid \'"
++ name
++ "\'s.") $
arbitraryGeneratesOnlyValid proxy
it ("is instantiated such that 'shrink' only produces valid \'"
++ name
++ "\'s.") $
forAll arbitrary $ \a ->
shrink (a `asProxyTypeOf` proxy) `shouldSatisfy` all isValid
arbitraryGeneratesOnlyValid
:: forall a. (Show a, Validity a, Arbitrary a)
=> Proxy a
-> Property
arbitraryGeneratesOnlyValid _ =
genGeneratesValid (arbitrary :: Gen a)
shrinkProducesOnlyValids
:: forall a. (Show a, Validity a, Arbitrary a)
=> Proxy a
-> Property
shrinkProducesOnlyValids _ =
genGeneratesValid (shrink <$> arbitrary :: Gen [a])