2016-09-06 4 views
1

dire que j'ai les types de données:QuickCheck pour générer à partir Permutations statique Liste

data A = A1 | A2 | A3 
data B = B1 A | B2 A 

Je peux facilement générer une liste de toutes les possibilités de B. Je veux tester toutes les permutations possibles, mais Je veux toujours utiliser QuickCheck pour cracher tous les éléments de la liste où il est appliqué. Dans ce cas, je veux tester qu'une règle est vraie pour toutes les possibilités, donc je ne veux pas générer de données aléatoires.

En supposant que j'ai déjà toutes les possibilités dans une liste, comment puis-je faire en sorte que QuickCheck produise chaque élément de la liste exactement une fois? Donner le même ensemble de valeurs exact à chaque fois.

+2

Si vous pouvez facilement générer toutes les permutations vous-même, pourquoi ne pas le faire dans un test unitaire sans invoquer QuickCheck du tout? QuickCheck ne fait rien pour vous si vous générez vos propres cas. –

+0

Tous mes tests utilisent QuickCheck. Je pense qu'il est plus agréable d'avoir toutes les données provenant de QuickCheck plutôt que de faire quelque chose de maladroit pour un cas particulier. Si QuickCheck peut alimenter cette liste un par un à cette vérification, alors je pense que c'est beaucoup plus propre. – kurzweil4

Répondre

1

On peut supposer que vous avez quelque chose comme:

prop_for_b :: B -> Bool 
prop_for_b = undefined 

test_for_b :: IO() 
test_for_b = quickCheck prop_for_b 

Vous pouvez utiliser quickCheck et ses variantes sur Bool plaine s et il fonctionnera intelligemment un seul « test »; ainsi:

prop_for_all_bs :: Bool 
prop_for_all_bs = all prop_for_b [{- ... -}] 

test_for_all_bs :: IO() 
test_for_all_bs = quickCheck prop_for_all_bs 
+0

Pas du tout dans le sens de ce que je pensais. Quelque chose de totalement différent, mais fait exactement ce que je cherchais. Et c'est un moyen beaucoup plus simple. – kurzweil4