[Haskell-cafe] ANN: LeanCheck v0.8.0 -- enumerative property testing

Rudy Matela rudy at matela.com.br
Sun Nov 18 20:27:33 UTC 2018


Hello Haskell Café,

A new version of LeanCheck is out (v0.8.0).  LeanCheck is a property
testing library (like QuickCheck) that tests values enumeratively.

_Whats new?_  Among several changes, the most notable and significant are:

* improvements in [LeanCheck's Haddock documentation];  
* removal of a few experimental function enumeration modules;
* and improved reporting of functional counter-examples (see below).

[LeanCheck's changelog] provides more details.

Take for example the following higher-order property that takes a
functional argument and states an equivalence between `foldl` and `foldr`:

    prop_foldlr' :: (Int->Int->Int) -> Int -> [Int] -> Bool
    prop_foldlr' f z xs  =  foldl (flip f) z (reverse xs) == foldr f z xs

You can check that it is correct by:

    > import Test.LeanCheck
    > import Test.LeanCheck.Function
    > check prop_foldlr'
    +++ OK, passed 200 tests.

Now here is an incorrect version of the above property:

    prop_foldlr :: (A -> A -> A) -> A -> [A] -> Bool
    prop_foldlr f z xs  =  foldr f z xs == foldl f z xs

You can check that it is incorrect by:

    > check prop_foldlr
    *** Failed! Falsifiable (after 75 tests):
    \x _ -> case x of
            0 -> 1
            _ -> 0
    0
    [0,0]

LeanCheck reports the smallest counterexample it finds.  The functional
argument is now reported very concisely: a function that returns 1
whenever the first argument is 0 and returns 0 otherwise.

Here's one last incorrect example property with two functional arguments:

    prop_mapFilter :: (Int->Int) -> (Int->Bool) -> [Int] -> Bool
    prop_mapFilter f p xs  =  filter p (map f xs) == map f (filter p xs)

    > check prop_mapFilter
    *** Failed! Falsifiable (after 36 tests):
    \_ -> 0
    \x -> case x of
          0 -> True
          _ -> False
    [1]

The functions `map` and `filter` do not commute, the three values above
are a counterexample.

You can find LeanCheck on [Hackage] or [GitHub].  As usual, you can
install it with:

	$ cabal install leancheck


[Hackage]: https://hackage.haskell.org/package/leancheck
[GitHub]: https://github.com/rudymatela/leancheck
[LeanCheck's changelog]: https://hackage.haskell.org/package/leancheck/changelog
[LeanCheck's Haddock documentation]: https://hackage.haskell.org/package/leancheck/docs/Test-LeanCheck.html
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20181118/23f5c1ce/attachment-0001.html>


More information about the Haskell-Cafe mailing list