Question

I want to extend QuickCheck to give me better messages when tests fail (rather than just the seed). For instance, I'd like to be able to create things along the lines of:

eqTest :: Eq a => a -> a -> TestResult
eqTest x y = if x == y
             then HappyResult
             else SadResult $ show x <> " /= " <> show y

or (with a Monoid instance which "stops" on SadResult and "continues" on HappyResult, akin to a (&&) operator for TestResult)

listEqTest :: Eq a => [a] -> [a] -> TestResult
listEqTest [] [] = HappyResult
listEqTest [] ys = SadResult $ "Ran out of xs to compare to " <> show ys
listEqTest xs [] = SadResult $ "Ran out of ys to compare to " <> show xs
listEqTest (x:xs) (y:ys) = eqTest x y <> listEqTest xs ys

How can I go about extending the QuickCheck functionality? Alternately, is there a randomized testing library which is more extensible?

Thanks!

Was it helpful?

Solution

From reading the QuickCheck documentation, the type you are looking for is Result:

data Result
  = MkResult
  { ok          :: Maybe Bool     -- ^ result of the test case; Nothing = discard
  , expect      :: Bool           -- ^ indicates what the expected result of the property is
  , reason      :: String         -- ^ a message indicating what went wrong
  , interrupted :: Bool           -- ^ indicates if the test case was cancelled by pressing ^C
  , abort       :: Bool           -- ^ if True, the test should not be repeated
  , stamp       :: [(String,Int)] -- ^ the collected values for this test case
  , callbacks   :: [Callback]     -- ^ the callbacks for this test case
  }

and thanks to the instance Testable Result you can use this as the return type of QuickCheck tests:

Prelude Test.QuickCheck Test.QuickCheck.Property> let test xs = if 13 `elem` xs then MkResult (Just False) True "Input contained bad number" False False [] [] else succeeded
Prelude Test.QuickCheck Test.QuickCheck.Property> quickCheck test
*** Failed! Input contained bad number (after 17 tests and 3 shrinks):    
[13]
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top