-- | QuickCheck integration for 'Predicate'
module Test.Predicates.QuickCheck (satisfies) where

import Test.Predicates (Predicate (accept, explain))
import Test.QuickCheck (Property, counterexample)

-- $setup
-- >>> :set -XExtendedDefaultRules
-- >>> :set -Wno-type-defaults
-- >>> import Test.Predicates
-- >>> import Test.QuickCheck

-- | QuickCheck property that checks if a predicate is satisfied.
--
-- @
--   quickCheck $ \(Positive x) -> [0 .. x] 'satisfies' (containsAll [eq 1, eq 2])
-- @
--
-- @
--   *** Failed! Falsified (after 1 test):
--   Positive {getPositive = 1}
--   Missing: 2
-- @
satisfies :: a -> Predicate a -> Property
a
x satisfies :: a -> Predicate a -> Property
`satisfies` Predicate a
p = String -> Bool -> Property
forall prop. Testable prop => String -> prop -> Property
counterexample (Predicate a -> a -> String
forall a. Predicate a -> a -> String
explain Predicate a
p a
x) (Predicate a -> a -> Bool
forall a. Predicate a -> a -> Bool
accept Predicate a
p a
x)