{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Test.Validity.GenValidity
( genValiditySpec
, genValidSpec
, genInvalidSpec
, genValidGeneratesValid
, genGeneratesValid
, genInvalidGeneratesInvalid
, genGeneratesInvalid
) where
import Data.Data
import Data.GenValidity
import Test.Hspec
import Test.QuickCheck
import Test.Validity.GenValidity.Property
import Test.Validity.Utils
genValiditySpec ::
forall a. (Typeable a, Show a, GenValid a, GenInvalid a)
=> Spec
genValiditySpec = do
genValidSpec @a
genInvalidSpec @a
genValidSpec ::
forall a. (Typeable a, Show a, GenValid a)
=> Spec
genValidSpec =
parallel $ do
let name = nameOf @a
describe ("GenValid " ++ name) $
describe ("genValid :: Gen " ++ name) $
it ("only generates valid \'" ++ name ++ "\'s") $
forAllShrink genValid shrinkValid $ shouldBeValid @a
genInvalidSpec ::
forall a. (Typeable a, Show a, GenInvalid a)
=> Spec
genInvalidSpec =
parallel $ do
let name = nameOf @a
describe ("GenInvalid " ++ name) $
describe ("genInvalid :: Gen " ++ name) $
it ("only generates invalid \'" ++ name ++ "\'s") $
forAllShrink genInvalid shrinkInvalid $ shouldBeInvalid @a
genValidGeneratesValid ::
forall a. (Show a, GenValid a)
=> Property
genValidGeneratesValid = genGeneratesValid @a genValid shrinkValid
genInvalidGeneratesInvalid ::
forall a. (Show a, GenInvalid a)
=> Property
genInvalidGeneratesInvalid = genGeneratesInvalid @a genInvalid shrinkInvalid