您必须使用 QuickCheck 中的forAll函数。它有以下类型:
forAll :: (Show a, Testable prop)
=> Gen a -- ^ The generator to use for generating values
-> (a -> prop) -- ^ A function which returns a testable property
-> Property
forAll
接受两个参数:
- 生成器描述了如何生成值。生成器的示例有选择、任意、一个...
- 该函数测试给定输入的属性。它必须返回一个值,该值是 的实例,
Testable
例如另一个或函数。Property
Bool
带有选择和元素生成器的嵌套 forAll 示例:
-- This generates a Property p for all x's in the closed interval [1,3]
-- The property p in turn generates a property q for all y ∈ [4,5]
-- The property q is True if x < y.
prop_choose = forAll (choose (1,3)) $ \x ->
forAll (elements [4,5]) $ \y -> x < y
对于您的测试属性,您可以将 forAll 与选择一起用于第二个和第三个参数。对于第一个参数,Positive a
QuickCheck 中的类型可用于生成 a 类型的任意正值(当 a 为 Num 时,它有一个 Arbitrary 实例):
prop_alwayLessThanMaxIdx :: Positive Integer -> Property
prop_alwaysLessThanMaxIdx (Positive idx) =
forAll (choose (0,1)) $ \r1 ->
forAll (choose (0,1)) $ \r2 ->
(rndListIndex idx r1 r2) < idx