scala scalacheck

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 )