如何告诉QuickCheck只为参数生成有效的列表索引?

时间:2012-10-10 20:32:12

标签: haskell quickcheck

说我想为(!!)函数编写一些单元测试。

my_prop xs n = ...

我想将n限制为仅有效索引,我知道我可以做类似

的操作
my_prop xs n = (not.null) (drop n xs) ==> ...

但这使得绝大多数生成的案例无效并被抛弃。有没有办法设置,以便QuickCheck首先生成xs列表并使用其值仅生成n的有效案例?

1 个答案:

答案 0 :(得分:5)

正如Daniel Wagner所建议的,一种可能性是创建我自己的数据类型并为其提供Arbitrary实例。

data ListAndIndex a = ListAndIndex [a] Int deriving (Show)

instance Arbitrary a => Arbitrary (ListAndIndex a) where
   arbitrary = do
     (NonEmpty xs) <- arbitrary
     n  <- elements [0..(length xs - 1)]
     return $ ListAndIndex xs n

NonEmpty来自Test.QuickCheck.Modifiers中的自定义类型,用于生成非空列表。