Быстрая проверка, определяющая произвольные экземпляры с использованием функции, результат которой зависит от ее аргументов
У меня есть функция arbExample
генерировать случайный Example
тип данных, который зависит от ряда функций.
Я пытаюсь сделать некоторое тестирование свойства, делая quickCheck prop_example
проблема в том, что я не знаю, как определить Arbitrary
экземпляр для Example
который использует arbExample
,
Мне нравится уметь бегать quickCheck prop_example
при указании Gens
структура данных, которая arbExample
использует.
data Example = Example
{ myInt :: Int
, myList :: [String]
} deriving (Show)
data Gens = Gens
{ gen1 :: Gen Int
, gen2 :: Gen String }
arbExample :: Gens -> Gen Example
arbExample gens = do
i <- gen1 gens
xs <- vectorOf i (gen2 gens)
return Example{myInt=i, myList=xs}
prop_example :: Example -> Property
prop_example example = do
let len = length (myList example)
monadicIO $ do
-- result of running some program
successful <- run $ (\e -> return False) example
case successful of
True -> return ()
False -> fail "failure "
instance Arbitrary Example where
arbitrary = arbExample _ {- ??? -}
1 ответ
Использовать forAll
комбинатор который имеет подпись:
forAll :: (Show a, Testable prop) => Gen a -> (a -> prop) -> Property
Быстрый пример:
import Test.QuickCheck
genA :: Gen Int
genA = choose (-100,100)
genB :: Gen Int
genB = choose (1,100)
prop_example :: Int -> Bool
prop_example n = n > 0
testA = quickCheck $ forAll genA prop_example
testB = quickCheck $ forAll genB prop_example
testA
не удастся, но testB
преуспеет.