¿Por qué no hay una función QuickCheck similar a la de hedgehog success? En particular, me preguntaba cómo se podría traducir una propiedad como la siguiente:

prop_specialPair :: Property
prop_specialPair = property $ do
  (_, xs) <- forAll specialPair
  case xs of
    x:_ -> x /== 3
    _   -> success

En QuickCheck si uso =/= luego me veo obligado a devolver algo de tipo Property, y parece que no hay una función constante para devolver una propiedad de paso.

Así que tengo que recurrir al tipo Bool:

prop_specialPair :: SpecialPair -> Bool
prop_specialPair SpecialPair { xs } =
  case xs of
    x:_ -> x == 3
    _   -> True

O utilice una codificación muy incómoda para success, por ejemplo:

prop_specialPair :: SpecialPair -> Property
prop_specialPair SpecialPair { xs } =
  case xs of
    x:_ -> x =/= 3
    _   -> True === True

¿Hay mejores formas de expresar la propiedad anterior en QuickCheck?

7
Damian Nadales 18 dic. 2019 a las 01:41

2 respuestas

La mejor respuesta

Puede utilizar la función property de la clase Testable y varias instancias Testable para crear un Property con las características que necesite.

Por ejemplo, property () siempre tiene éxito. Para otro ejemplo, property (b :: Bool) tiene éxito iff b == True.

Entonces podrías hacer esto por ejemplo:

prop_specialPair :: SpecialPair -> Property
prop_specialPair SpecialPair { xs } =
  case xs of
    x:_ -> x =/= 3
    _   -> property ()

O puede hacerlo más explícito utilizando la instancia Testable Result y el valor succeeded :: Result:

prop_specialPair :: SpecialPair -> Property
prop_specialPair SpecialPair { xs } =
  case xs of
    x:_ -> x =/= 3
    _   -> property succeeded
8
Fyodor Soikin 17 dic. 2019 a las 23:11

También puede usar la implicación con (==>):

prop_specialPair :: Property
prop_specialPair =
  forAll specialPair $ \(_, xs) ->
    not (null xs) ==> take 1 xs =/= [3]
1
Simon Shine 18 dic. 2019 a las 11:49