Skip to content

non-IO test driver (for multiple tests) #7

jwaldmann opened this Issue Mar 27, 2012 · 3 comments

2 participants


I want to write code like this:

append :: [a] -> [a] -> [a]
append a b = case a of
  [] -> b
  x : y -> x : append y b

assoc op = \ a b c ->
    op a (op b c) == op (op a b) c

comm op = \ a b -> op a b == op b a

left_neutral op a = \ b -> op a b == b 
right_neutral op b = \ a -> op a b == a 

tests :: Either String String
tests = do
    testE "assoc" 1000 
        $ assoc ( append ::[Bool] ->[Bool]->[Bool])
    testE "right_neutral" 1000 
        $ right_neutral ( append ::[Bool] ->[Bool]->[Bool]) []
    testE "left_neutral" 1000 
        $ left_neutral ( append ::[Bool] ->[Bool]->[Bool]) []

it should have

  • a pure test driver (no IO) so I can process the result in a pure program and without re-parsing
  • run several tests, give OK only if all pass
  • give human-readable output

I can achieve this with

import Test.SmallCheck.Property
import Control.Monad.Error

testE :: Testable a 
      => String -> Int -> a
      -> Either String String
testE name num prop 
  = case 
        filter ( \ r -> not (resultIsOk $ result r))
      $ take num
      $ do depth <- [0..] ; test prop depth
    of [] -> Right $ unwords 
          [ "property", name, "passed", show num , "tests" ]
       r : _ -> Left $ unwords $
         [ "property", name, "fails for inputs"
         ] ++ arguments r

so I guess I'd like to have that (or something similar to the same effect) in the library somewhere.


I like the idea. Will add something like this.


Here is some background on why I want such a feature:


Sorry for the delay.

This is added in cd42a8d. It's a bit different from what you proposed:

  • no pretty-printing is done, instead the raw data is returned
  • it doesn't accept an additional bound parameter ('num' in your code)

If you are happy with this, I'll upload an updated version to hackage.

@feuerbach feuerbach closed this Sep 11, 2012
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.