Gerar Opção [T] no ScalaCheck
Eu estou tentando gerar parâmetros opcionais no ScalaCheck, sem sucesso.
Parece não haver um mecanismo direto para isso.Gen.containerOf[Option, Thing](thingGenerator)
falha porque não consegue encontrar uma implícitaBuildable[Thing, Option]
.
eu tentei
for {
thing <- Gen.listOfN[Thing](1, thingGenerator)
} yield thing.headOption
Mas isso não funciona porquelistOfN
produz uma lista que é sempre de comprimento N. Como resultado, eu sempre obtenhoSome[Thing]
. Similarmente,listOf1
não funciona, porque (a) não produz listas vazias, mas também (b) é ineficiente porque não posso definir um limite máximo para o número de elementos.
Como posso gerarOption[Thing]
que inclui o Nones?
EDITAR: Eu encontrei uma solução, mas não é sucinta. Existe uma maneira melhor do que isso?
for {
thing <- for {
qty <- Gen.choose(0,1)
things <- Gen.listOfN[Thing](qty, thingGenerator)
} yield things.headOption
} yield thing
EDIT 2: Eu generalizei isso para
def optional[T](g: Gen[T]) =
for (qty <- Gen.choose(0, 1); xs <- Gen.listOfN[T](qty, g)) yield xs.headOption
Então não preciso escrever mais de uma vez. Mas certamente isso já está na biblioteca e eu perdi isso?