Testing group class instances with QuickCheck.
QuickCheck support for testing instances of type classes defined in the groups library.
quickcheck-groups
Overview
The quickcheck-groups library provides:
- QuickCheck support for testing instances of type classes defined in the
groupslibrary. - Compatibility with the
quickcheck-classeslibrary. - Reusable properties for type class laws, in the form of
Lawsdefinitions.
Usage
In general, usage is identical to that of the quickcheck-classes library. If you're already familiar with quickcheck-classes, then using this library should be straightforward.
Testing laws for a single type class
To test that the laws of a particular class hold for a particular type, use the lawsCheck function with the Laws definition for the class you wish to test.
:stars: Example
To test that the
Grouplaws hold for theSumIntegertype:import Data.Monoid (Sum) import Data.Proxy (Proxy (Proxy)) import Test.QuickCheck.Classes (lawsCheck) import Test.QuickCheck.Classes.Group (groupLaws) lawsCheck (groupLaws (Proxy :: Proxy (Sum Integer)))If all tests pass, you should see output similar to:
Group: groupLaw_invert_mempty +++ OK, passed 1 test. Group: groupLaw_invert_invert +++ OK, passed 100 tests. Group: groupLaw_invert_mappend_1 +++ OK, passed 100 tests. Group: groupLaw_invert_mappend_2 +++ OK, passed 100 tests. Group: groupLaw_subtract_mempty +++ OK, passed 100 tests. Group: groupLaw_subtract_self +++ OK, passed 100 tests. Group: groupLaw_subtract_other +++ OK, passed 100 tests. Group: groupLaw_pow_zero +++ OK, passed 100 tests. Group: groupLaw_pow_nonNegative +++ OK, passed 100 tests. Group: groupLaw_pow_nonPositive +++ OK, passed 100 tests.
Testing laws for multiple type classes
To test that the laws of multiple classes hold for a particular type, use the lawsCheckOne function with the Laws definitions for the classes you wish to test.
:stars: Example
To test that the
SumIntegertype satisfies the laws ofAbelianand all superclasses:import Data.Monoid (Sum) import Data.Proxy (Proxy (Proxy)) import Test.QuickCheck.Classes import Test.QuickCheck.Classes.Group lawsCheckOne (Proxy :: Proxy (Sum Integer)) [ semigroupLaws , monoidLaws , groupLaws , abelianLaws ]
Subclasses and superclasses
Each of the Laws definitions provided by this library corresponds to exactly one type class, and includes just the laws for that class. Laws for subclasses and superclasses are not automatically included. Therefore, you'll need to explicitly test the laws of every single class you wish to cover.
Coverage checks
This library includes coverage checks to ensure that important cases are covered, and to reduce the probability of test passes that are false positives. These coverage checks are performed automatically.