It seems that there's an undocumented interface into QuickCheck that
can be used to sort of integrate it with HUnit -- instead of spewing to
standard output for all tests, I got it to only toss exceptions when a
test failed or exhausted its argument space (see the attached module,
based on the QuickCheck code).  However, this is still not ideal; I'd
really rather be able to actually write HUnit tests within QuickCheck;
e.g.,

prop_Foo x = (0 * x) @?= 0

  Since QuickCheck requires you to use pure functions and the signature
of @?= is

  (Eq a, Show a) => a -> a -> IO ()

  this doesn't really work.  However, I think it would require a lot
more work to get this working with QuickCheck, and I suppose if your
properties are simple enough it should be easy to trace failures by hand.

  Daniel
-- | HUnit <-> QuickCheck binding.

module UnitCheck(
                 unitCheck
                )
    where

import Data.List
import System.Random
import Test.HUnit
import Test.QuickCheck

-- Execute checks until we have executed enough.  All output is suppressed
-- unless the test returns a "false" value.
runCheck               :: Config -> Gen Result -> StdGen -> Int -> Int -> [[String]] -> Assertion
runCheck config gen rnd0 ntest nfail stamps
    | ntest == configMaxTest config = return ()
    | nfail == configMaxFail config = assertFailure $ "Arguments exhausted after " ++ (show ntest) ++ " tests"
    | otherwise =
        case ok result of
          Nothing    ->
              runCheck config gen rnd1 ntest (nfail + 1) stamps
          Just True  ->
              runCheck config gen rnd1 (ntest + 1) nfail (stamp result : stamps)
          Just False ->
              assertFailure $ "Property failed after " ++ (show ntest) ++ " tests, with arguments [" ++ (concat $ intersperse "," $ arguments result) ++ "]"
    where
      result       = generate (configSize config ntest) rnd2 gen
      (rnd1, rnd2) = split rnd0

unitCheck :: Test.QuickCheck.Testable a => a -> Assertion
unitCheck a = do rnd <- newStdGen
                 runCheck defaultConfig (evaluate a) rnd 0 0 []

Attachment: signature.asc
Description: Digital signature

Reply via email to