QuickCheck值相等

时间:2014-02-25 14:02:53

标签: haskell quickcheck

我有一个QuickCheck属性,如下所示:

prop42 :: Foo -> Bool
prop42 foo = fn1 foo == fn2 foo

如果此属性失败,它将打印出foo的内容。但我真的很想知道fn1fn2返回了什么。如果foo很大,那么手工生成这些信息有点不重要。 (即,坐在那里,手动输入打印到Windows控制台窗口的巨大文本楔形。)

测试框架通常会有一个比较相等的东西,并且如果相等不成立则打印出两个值。但我似乎无法为QuickCheck找到这样的功能...

3 个答案:

答案 0 :(得分:10)

看一下来自here的组合子。例如,printTestCase允许将任意字符串添加到失败案例的输出中。一个简单的例子:

prop x = let f = sin x
    in printTestCase ("Should be at least " ++ show f) $ x >= sin x
$> quickCheck prop
*** Failed! Falsifiable (after 2 tests and 1 shrink): 
-1.0
Should be at least -0.8414709848078965

答案 1 :(得分:2)

根据Yuuri的回答,这就是我的用途:

(?==?) :: (Eq x, Show x) => x -> x -> Property
x ?==? y =
  printTestCase ("Left:  " ++ show x) $
  printTestCase ("Right: " ++ show y) $
  x == y

现在我可以写一些像

这样的东西
prop42 :: Foo -> Prop
prop42 foo = fn1 foo ?==? fn2 foo

答案 2 :(得分:0)

我认为假设fn1gn2返回Bar,可以执行以下操作:

newtype Bar1 = B1 Bar deriving Show
newtype Bar2 = B2 Bar deriving Show
instance Arbitrary Bar1 where
   arbitrary = arbitrary >>= return . B1 . fn1
instance Arbitrary Bar2 where
   arbitrary = arbitrary >>= return . B2 . fn2

prop_xx = forAll arbitrary $ \(B1 b1) ->
             forAll arbitrary $ \(B2 b2) ->
                b1 == b2