Быстрая проверка, определяющая произвольные экземпляры с использованием функции, результат которой зависит от ее аргументов
У меня есть функция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 _ {- ??? -}