2012-10-10 27 views
16

Digamos que quiero escribir algunas pruebas de unidad para la función (!!).¿Cómo decirle a QuickCheck que genere solo índices de listas válidos para un parámetro?

my_prop xs n = ... 

que desea restringir n a sólo índices válidos y sé que podría hacer algo como

my_prop xs n = (not.null) (drop n xs) ==> ... 

Pero esto lo hace de manera que la gran mayoría de los casos generados no son válidos y botados . ¿Hay alguna manera de configurarlo para que QuickCheck genere primero la lista xs y use su valor para generar solo casos válidos de n?

+1

Crea un nuevo tipo que contenga una lista y un 'Int' con una instancia apropiada' Arbitrary'. –

Respuesta

17

Usando forAll, puede especificar generator para n que depende de los argumentos anteriores, p. Ej.

my_prop (NonEmpty xs) = forAll (choose (0, length xs - 1)) $ \n -> ... 
+0

aseado. Si necesito dos índices en la propety, ¿cómo puedo pasar un Gen (Int, Int) a forAll? Mi solución actual está anidando para Todos los como: 'para Todos (índices xs) $ \ x -> para Todos (índices xs) $ \ y -> ...' (usando la definición de índices de Daniel Fischer vista en otra respuesta). – Arild

10

Usted puede hacer un generador que sólo crea índices válidos y escribir su propiedad como

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') 

eliminando el argumento Int.

5

Como sugerido por Daniel Wagner, una posibilidad es la creación de mi propio tipo de datos y dándole una instancia 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 es de un tipo personalizado en Test.QuickCheck.Modifiers para generar listas no vacías.

Cuestiones relacionadas