Generar Opción [T] en ScalaCheck
Estoy intentando 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 implícitoBuildable[Thing, Option]
.
Lo intenté
for {
thing <- Gen.listOfN[Thing](1, thingGenerator)
} yield thing.headOption
Pero esto no funciona porquelistOfN
produce una lista que siempre es de longitud N. Como resultado, siempre obtengo unaSome[Thing]
. 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.
Como puedo generarOption[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
Editar 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í.