[Haskell-cafe] QuickCheck and State monad

George Boulougaris gboulougaris at gmail.com
Sat Feb 4 20:20:13 UTC 2017


Hello,

I have written a Haskell module that contains functions that operate on
some state. Let's say that the code looks like this (the actual functions
may return an actual result instead of `()`, but this is irrelevant to the
question):

    data StateContext = StateContext {
      -- some records
    }

    handleEventA :: EventA -> State StateContext ()
    handleEventB :: EventB -> State StateContext ()
    handleEventC :: EventC -> State StateContext ()

As you can imagine the behavior of each function depends on the current
state. For example `handleEventA >> handleEventB` will not produce the same
result as `handleEventB >> handleEventA`. So I have several HUnit tests
that verify the behavior of each function at several states.

But now I would like to write more tests, that exercise all functions at
all possible states (the number of states is finite). Writing them with
HUnit would be quite labor-itensive, so I thought that using QuickCheck
might be helpful in that case (I have only used it before for trivial
functions).

But I cannot see which properties should I test, or what kind of data
should the test generate. I suspect that the test should generate random
sequence of events (e.g. `handleEventB >> handleEventC >> handleEventA`
etc), but I cannot see what properties should be satisfied.

Thanks
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20170204/383f6074/attachment.html>


More information about the Haskell-Cafe mailing list