Verificação rápida, definindo instâncias arbitrárias usando uma função cujo resultado depende de seus argumentos
Eu tenho uma funçãoarbExample
para gerar um aleatórioExample
tipo de dados que depende de várias funções.
Estou tentando fazer alguns testes de propriedade fazendoquickCheck prop_example
, o problema é que não sei definir umArbitrary
instância paraExample
que usaarbExample
.
Eu gosto de poder correrquickCheck prop_example
enquanto especifica oGens
estrutura de dados quearbExample
usos.
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 _ {- ??? -}