2012-05-31 10 views
5

Estoy tratando de implementar un control de propiedad simple, pero Scalacheck está ignorando mis generadores. ¿Qué estoy haciendo mal aquí?Scalacheck está ignorando los generadores proporcionados

object AlgorithmTest extends Properties("Algorithm") { 
    property("Test") = forAll (Gen.choose(0,10)) (n => n>=0 & n<10) 
} 

y este es el resultado en el SBT

[info] ! Algorithm.Test: Falsified after 12 passed tests. [info] > 
ARG_0: -1 [error] Failed: : Total 1, Failed 1, Errors 0, Passed 0, 
Skipped 0 
+0

El problema ya se ha solucionado (para los generadores incorporados) mediante el uso de las condiciones posteriores 'suchThat'; consulte https://github.com/rickynils/scalacheck/issues/8 – DNA

Respuesta

4

Parece que la instancia del encogimiento que se pasa al método forAll no está usando el generador en la búsqueda de pequeñas contra-ejemplos. Si cambia su propiedad para:

property("Test") = Prop.forAllNoShrink(Gen.choose(1, 10)) (n => n >= 0 && n < 10) 

Entonces debería fallar correctamente con:

[info] ! Algorithm.Test: Falsified after 7 passed tests. 
[info] > ARG_0: 10 
[error] Failed: : Total 1, Failed 1, Errors 0, Passed 0, Skipped 0 

Una manera de visualizar los valores de encogimiento es utilizar el Prop.collect método:

property("Test") = Prop.forAll(Gen.choose(1, 10)) { n => 
    Prop.collect(n) { n >= 0 && n < 10 } 
} 

Entonces los valores recopilados se ven así:

[info] ! Algorithm.Test: Falsified after 40 passed tests. 
[info] > ARG_0: -1 
[info] > Collected test data: 
[info] 17% 3 
[info] 17% 1 
[info] 15% 6 
[info] 12% 9 
[info] 10% 2 
[info] 10% 5 
[info] 7% 4 
[info] 7% 8 
[info] 2% -1 
[info] 2% 7 

Donde puede ver que -1 se usó durante el proceso de reducción.

+1

. Pero este no es el comportamiento documentado. Si utilizo un generador entre 1 y 10, todos los valores deben estar en el rango [1,10 [. Nunca debería aparecer un -1 – tonicebrian

+2

@ancechu El '-1' aparece _después_ la prueba falló, ya que ScalaCheck intenta encontrar una entrada más simple que no pasa la prueba, esa es la" contracción ". Esa fase no respeta el proceso de generación, ya sea un error o una limitación intrínseca, no lo sé. –

+0

Debería haber buscado ayer, pero este problema se discute en realidad [aquí] (https://github.com/rickynils/scalacheck/issues/18) – Eric

Cuestiones relacionadas