[英]How to tell QuickCheck to generate only valid list indices for a parameter?
假设我想为(!!)
函数编写一些单元测试。
my_prop xs n = ...
我想将n限制为仅有效的索引,我知道我可以做类似的事情
my_prop xs n = (not.null) (drop n xs) ==> ...
但这使得绝大多数生成的案例都无效并被抛弃。 有没有办法设置,以便QuickCheck首先生成xs
列表并使用其值仅生成n
有效情况?
你可以创建一个只生成有效索引的生成器并编写你的属性
import Test.QuickCheck
import Test.QuickCheck.Gen
import System.Random
indices :: [a] -> Gen Int
indices xs = MkGen $ \sg _ -> fst $ randomR (0, length xs - 1) sg
my_prop :: [Char] -> Property
my_prop xs = not (null xs) ==> forAll (indices xs) (\i -> xs !! i /= '0')
消除Int
参数。
正如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
的自定义类型,用于生成非空列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.