|
Packit |
1d8052 |
{-|
|
|
Packit |
1d8052 |
The <http://www.cse.chalmers.se/~rjmh/QuickCheck/manual.html QuickCheck manual>
|
|
Packit |
1d8052 |
gives detailed information about using QuickCheck effectively.
|
|
Packit |
1d8052 |
|
|
Packit |
1d8052 |
To start using QuickCheck, write down your property as a function returning @Bool@.
|
|
Packit |
1d8052 |
For example, to check that reversing a list twice gives back the same list you can write:
|
|
Packit |
1d8052 |
|
|
Packit |
1d8052 |
@
|
|
Packit |
1d8052 |
import Test.QuickCheck
|
|
Packit |
1d8052 |
|
|
Packit |
1d8052 |
prop_reverse :: [Int] -> Bool
|
|
Packit |
1d8052 |
prop_reverse xs = reverse (reverse xs) == xs
|
|
Packit |
1d8052 |
@
|
|
Packit |
1d8052 |
|
|
Packit |
1d8052 |
You can then use QuickCheck to test @prop_reverse@ on 100 random lists:
|
|
Packit |
1d8052 |
|
|
Packit |
1d8052 |
>>> quickCheck prop_reverse
|
|
Packit |
1d8052 |
+++ OK, passed 100 tests.
|
|
Packit |
1d8052 |
|
|
Packit |
1d8052 |
To run more tests you can use the 'withMaxSuccess' combinator:
|
|
Packit |
1d8052 |
|
|
Packit |
1d8052 |
>>> quickCheck (withMaxSuccess 10000 prop_reverse)
|
|
Packit |
1d8052 |
+++ OK, passed 10000 tests.
|
|
Packit |
1d8052 |
|
|
Packit |
1d8052 |
To use QuickCheck on your own data types you will need to write 'Arbitrary'
|
|
Packit |
1d8052 |
instances for those types. See the
|
|
Packit |
1d8052 |
<http://www.cse.chalmers.se/~rjmh/QuickCheck/manual.html QuickCheck manual> for
|
|
Packit |
1d8052 |
details about how to do that.
|
|
Packit |
1d8052 |
|
|
Packit |
1d8052 |
This module exports most of QuickCheck's functionality, but see also
|
|
Packit |
1d8052 |
"Test.QuickCheck.Monadic" which helps with testing impure or monadic code.
|
|
Packit |
1d8052 |
-}
|
|
Packit |
1d8052 |
{-# LANGUAGE CPP #-}
|
|
Packit |
1d8052 |
#ifndef NO_SAFE_HASKELL
|
|
Packit |
1d8052 |
{-# LANGUAGE Safe #-}
|
|
Packit |
1d8052 |
#endif
|
|
Packit |
1d8052 |
#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 708
|
|
Packit |
1d8052 |
{-# LANGUAGE PatternSynonyms #-}
|
|
Packit |
1d8052 |
#endif
|
|
Packit |
1d8052 |
module Test.QuickCheck
|
|
Packit |
1d8052 |
(
|
|
Packit |
1d8052 |
-- * Running tests
|
|
Packit |
1d8052 |
quickCheck
|
|
Packit |
1d8052 |
, Args(..), Result(..)
|
|
Packit |
1d8052 |
, stdArgs
|
|
Packit |
1d8052 |
, quickCheckWith
|
|
Packit |
1d8052 |
, quickCheckWithResult
|
|
Packit |
1d8052 |
, quickCheckResult
|
|
Packit |
1d8052 |
-- ** Running tests verbosely
|
|
Packit |
1d8052 |
, verboseCheck
|
|
Packit |
1d8052 |
, verboseCheckWith
|
|
Packit |
1d8052 |
, verboseCheckWithResult
|
|
Packit |
1d8052 |
, verboseCheckResult
|
|
Packit |
1d8052 |
#ifndef NO_TEMPLATE_HASKELL
|
|
Packit |
1d8052 |
-- ** Testing all properties in a module
|
|
Packit |
1d8052 |
, quickCheckAll
|
|
Packit |
1d8052 |
, verboseCheckAll
|
|
Packit |
1d8052 |
, forAllProperties
|
|
Packit |
1d8052 |
-- ** Testing polymorphic properties
|
|
Packit |
1d8052 |
, polyQuickCheck
|
|
Packit |
1d8052 |
, polyVerboseCheck
|
|
Packit |
1d8052 |
, monomorphic
|
|
Packit |
1d8052 |
#endif
|
|
Packit |
1d8052 |
|
|
Packit |
1d8052 |
-- * Random generation
|
|
Packit |
1d8052 |
, Gen
|
|
Packit |
1d8052 |
-- ** Generator combinators
|
|
Packit |
1d8052 |
, choose
|
|
Packit |
1d8052 |
, oneof
|
|
Packit |
1d8052 |
, frequency
|
|
Packit |
1d8052 |
, elements
|
|
Packit |
1d8052 |
, growingElements
|
|
Packit |
1d8052 |
, sized
|
|
Packit |
1d8052 |
, getSize
|
|
Packit |
1d8052 |
, resize
|
|
Packit |
1d8052 |
, scale
|
|
Packit |
1d8052 |
, suchThat
|
|
Packit |
1d8052 |
, suchThatMap
|
|
Packit |
1d8052 |
, suchThatMaybe
|
|
Packit |
1d8052 |
, listOf
|
|
Packit |
1d8052 |
, listOf1
|
|
Packit |
1d8052 |
, vectorOf
|
|
Packit |
1d8052 |
, infiniteListOf
|
|
Packit |
1d8052 |
, shuffle
|
|
Packit |
1d8052 |
, sublistOf
|
|
Packit |
1d8052 |
-- ** Generators which use Arbitrary
|
|
Packit |
1d8052 |
, vector
|
|
Packit |
1d8052 |
, orderedList
|
|
Packit |
1d8052 |
, infiniteList
|
|
Packit |
1d8052 |
-- ** Running a generator
|
|
Packit |
1d8052 |
, generate
|
|
Packit |
1d8052 |
-- ** Generator debugging
|
|
Packit |
1d8052 |
, sample
|
|
Packit |
1d8052 |
, sample'
|
|
Packit |
1d8052 |
|
|
Packit |
1d8052 |
-- * Arbitrary and CoArbitrary classes
|
|
Packit |
1d8052 |
, Arbitrary(..)
|
|
Packit |
1d8052 |
, CoArbitrary(..)
|
|
Packit |
1d8052 |
|
|
Packit |
1d8052 |
-- ** Unary and Binary classes
|
|
Packit |
1d8052 |
, Arbitrary1(..)
|
|
Packit |
1d8052 |
, arbitrary1
|
|
Packit |
1d8052 |
, shrink1
|
|
Packit |
1d8052 |
, Arbitrary2(..)
|
|
Packit |
1d8052 |
, arbitrary2
|
|
Packit |
1d8052 |
, shrink2
|
|
Packit |
1d8052 |
|
|
Packit |
1d8052 |
-- ** Helper functions for implementing arbitrary
|
|
Packit |
1d8052 |
, arbitrarySizedIntegral
|
|
Packit |
1d8052 |
, arbitrarySizedNatural
|
|
Packit |
1d8052 |
, arbitrarySizedFractional
|
|
Packit |
1d8052 |
, arbitrarySizedBoundedIntegral
|
|
Packit |
1d8052 |
, arbitraryBoundedIntegral
|
|
Packit |
1d8052 |
, arbitraryBoundedRandom
|
|
Packit |
1d8052 |
, arbitraryBoundedEnum
|
|
Packit |
1d8052 |
, arbitraryUnicodeChar
|
|
Packit |
1d8052 |
, arbitraryASCIIChar
|
|
Packit |
1d8052 |
, arbitraryPrintableChar
|
|
Packit |
1d8052 |
-- ** Helper functions for implementing shrink
|
|
Packit |
1d8052 |
#ifndef NO_GENERICS
|
|
Packit |
1d8052 |
, genericCoarbitrary
|
|
Packit |
1d8052 |
, genericShrink
|
|
Packit |
1d8052 |
, subterms
|
|
Packit |
1d8052 |
, recursivelyShrink
|
|
Packit |
1d8052 |
#endif
|
|
Packit |
1d8052 |
, shrinkNothing
|
|
Packit |
1d8052 |
, shrinkList
|
|
Packit |
1d8052 |
, shrinkMap
|
|
Packit |
1d8052 |
, shrinkMapBy
|
|
Packit |
1d8052 |
, shrinkIntegral
|
|
Packit |
1d8052 |
, shrinkRealFrac
|
|
Packit |
1d8052 |
-- ** Helper functions for implementing coarbitrary
|
|
Packit |
1d8052 |
, variant
|
|
Packit |
1d8052 |
, coarbitraryIntegral
|
|
Packit |
1d8052 |
, coarbitraryReal
|
|
Packit |
1d8052 |
, coarbitraryShow
|
|
Packit |
1d8052 |
, coarbitraryEnum
|
|
Packit |
1d8052 |
, (><)
|
|
Packit |
1d8052 |
|
|
Packit |
1d8052 |
-- ** Type-level modifiers for changing generator behavior
|
|
Packit |
1d8052 |
, Blind(..)
|
|
Packit |
1d8052 |
, Fixed(..)
|
|
Packit |
1d8052 |
, OrderedList(..)
|
|
Packit |
1d8052 |
, NonEmptyList(..)
|
|
Packit |
1d8052 |
, Positive(..)
|
|
Packit |
1d8052 |
, NonZero(..)
|
|
Packit |
1d8052 |
, NonNegative(..)
|
|
Packit |
1d8052 |
, Large(..)
|
|
Packit |
1d8052 |
, Small(..)
|
|
Packit |
1d8052 |
, Smart(..)
|
|
Packit |
1d8052 |
, Shrink2(..)
|
|
Packit |
1d8052 |
#ifndef NO_MULTI_PARAM_TYPE_CLASSES
|
|
Packit |
1d8052 |
, Shrinking(..)
|
|
Packit |
1d8052 |
, ShrinkState(..)
|
|
Packit |
1d8052 |
#endif
|
|
Packit |
1d8052 |
, ASCIIString(..)
|
|
Packit |
1d8052 |
, UnicodeString(..)
|
|
Packit |
1d8052 |
, PrintableString(..)
|
|
Packit |
1d8052 |
|
|
Packit |
1d8052 |
-- ** Functions
|
|
Packit |
1d8052 |
, Fun
|
|
Packit |
1d8052 |
, applyFun
|
|
Packit |
1d8052 |
, applyFun2
|
|
Packit |
1d8052 |
, applyFun3
|
|
Packit |
1d8052 |
#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 708
|
|
Packit |
1d8052 |
, pattern Fn
|
|
Packit |
1d8052 |
, pattern Fn2
|
|
Packit |
1d8052 |
, pattern Fn3
|
|
Packit |
1d8052 |
#endif
|
|
Packit |
1d8052 |
, Function (..)
|
|
Packit |
1d8052 |
, functionMap
|
|
Packit |
1d8052 |
|
|
Packit |
1d8052 |
-- * Properties
|
|
Packit |
1d8052 |
, Property, Testable(..)
|
|
Packit |
1d8052 |
-- ** Property combinators
|
|
Packit |
1d8052 |
, forAll
|
|
Packit |
1d8052 |
, forAllShrink
|
|
Packit |
1d8052 |
, shrinking
|
|
Packit |
1d8052 |
, (==>)
|
|
Packit |
1d8052 |
, (===)
|
|
Packit |
1d8052 |
#ifndef NO_DEEPSEQ
|
|
Packit |
1d8052 |
, total
|
|
Packit |
1d8052 |
#endif
|
|
Packit |
1d8052 |
, ioProperty
|
|
Packit |
1d8052 |
-- *** Controlling property execution
|
|
Packit |
1d8052 |
, verbose
|
|
Packit |
1d8052 |
, once
|
|
Packit |
1d8052 |
, again
|
|
Packit |
1d8052 |
, withMaxSuccess
|
|
Packit |
1d8052 |
, within
|
|
Packit |
1d8052 |
, noShrinking
|
|
Packit |
1d8052 |
-- *** Conjunction and disjunction
|
|
Packit |
1d8052 |
, (.&.)
|
|
Packit |
1d8052 |
, (.&&.)
|
|
Packit |
1d8052 |
, conjoin
|
|
Packit |
1d8052 |
, (.||.)
|
|
Packit |
1d8052 |
, disjoin
|
|
Packit |
1d8052 |
-- *** What to do on failure
|
|
Packit |
1d8052 |
, counterexample
|
|
Packit |
1d8052 |
, printTestCase
|
|
Packit |
1d8052 |
, whenFail
|
|
Packit |
1d8052 |
, whenFail'
|
|
Packit |
1d8052 |
, expectFailure
|
|
Packit |
1d8052 |
-- *** Analysing test distribution
|
|
Packit |
1d8052 |
, label
|
|
Packit |
1d8052 |
, collect
|
|
Packit |
1d8052 |
, classify
|
|
Packit |
1d8052 |
, cover
|
|
Packit |
1d8052 |
-- *** Miscellaneous
|
|
Packit |
1d8052 |
, Discard(..)
|
|
Packit |
1d8052 |
, discard
|
|
Packit |
1d8052 |
, mapSize
|
|
Packit |
1d8052 |
)
|
|
Packit |
1d8052 |
where
|
|
Packit |
1d8052 |
|
|
Packit |
1d8052 |
--------------------------------------------------------------------------
|
|
Packit |
1d8052 |
-- imports
|
|
Packit |
1d8052 |
|
|
Packit |
1d8052 |
import Test.QuickCheck.Gen
|
|
Packit |
1d8052 |
import Test.QuickCheck.Arbitrary
|
|
Packit |
1d8052 |
import Test.QuickCheck.Modifiers
|
|
Packit |
1d8052 |
import Test.QuickCheck.Property hiding ( Result(..) )
|
|
Packit |
1d8052 |
import Test.QuickCheck.Test
|
|
Packit |
1d8052 |
import Test.QuickCheck.Exception
|
|
Packit |
1d8052 |
import Test.QuickCheck.Function
|
|
Packit |
1d8052 |
#ifndef NO_TEMPLATE_HASKELL
|
|
Packit |
1d8052 |
import Test.QuickCheck.All
|
|
Packit |
1d8052 |
#endif
|
|
Packit |
1d8052 |
|
|
Packit |
1d8052 |
--------------------------------------------------------------------------
|
|
Packit |
1d8052 |
-- the end.
|