Generar Opción[T] en ScalaCheck
(2)
Ahora solo puedes usar:
Gen.option(yourGen)
Estoy tratando de generar parámetros opcionales en ScalaCheck, sin éxito.
Parece que no hay un mecanismo directo para esto. Gen.containerOf[Option, Thing](thingGenerator)
falla porque no puede encontrar un Buildable[Thing, Option]
implícito.
Lo intenté
for {
thing <- Gen.listOfN[Thing](1, thingGenerator)
} yield thing.headOption
Pero esto no funciona porque listOfN
produce una lista que siempre es de longitud N. Como resultado, siempre obtengo un Some[Thing]
. De manera similar, listOf1
no funciona, porque (a) no produce listas vacías, pero también (b) es ineficiente porque no puedo establecer un límite máximo en el número de elementos.
¿Cómo puedo generar la Option[Thing]
que incluye Nones?
EDITAR : He encontrado una solución, pero no es sucinta. ¿Hay una manera mejor que esta?
for {
thing <- for {
qty <- Gen.choose(0,1)
things <- Gen.listOfN[Thing](qty, thingGenerator)
} yield things.headOption
} yield thing
EDIT 2 : generalicé esto a
def optional[T](g: Gen[T]) =
for (qty <- Gen.choose(0, 1); xs <- Gen.listOfN[T](qty, g)) yield xs.headOption
Así que no tengo que escribirlo más de una vez. Pero seguramente esto ya está en la biblioteca y me lo perdí.
Puede usar pick
para elegir aleatoriamente entre un generador de Some y de None:
val someThing = thingGenerator.map( Some.apply )
val noThing = Gen.value( None:Option[Thing] )
val optThing = Gen.oneOf( someThing, noThing )