Wygeneruj opcję [T] w ScalaCheck
Próbuję wygenerować opcjonalne parametry w ScalaCheck, bez powodzenia.
Wydaje się, że nie ma bezpośredniego mechanizmu na to.Gen.containerOf[Option, Thing](thingGenerator)
zawodzi, ponieważ nie może znaleźć ukrytegoBuildable[Thing, Option]
.
próbowałem
for {
thing <- Gen.listOfN[Thing](1, thingGenerator)
} yield thing.headOption
Ale to nie działa, ponieważlistOfN
tworzy listę, która zawsze ma długość N. W rezultacie zawsze otrzymujęSome[Thing]
. Podobnie,listOf1
nie działa, ponieważ (a) nie tworzy pustych list, ale także (b) jest nieefektywny, ponieważ nie mogę ustawić maksymalnego limitu liczby elementów.
Jak mogę wygenerowaćOption[Thing]
to obejmuje Nones?
EDYTOWAĆ: Znalazłem rozwiązanie, ale to nie jest zwięzłe. Czy jest lepszy sposób niż to?
for {
thing <- for {
qty <- Gen.choose(0,1)
things <- Gen.listOfN[Thing](qty, thingGenerator)
} yield things.headOption
} yield thing
EDYCJA 2: Uogólniłem to na
def optional[T](g: Gen[T]) =
for (qty <- Gen.choose(0, 1); xs <- Gen.listOfN[T](qty, g)) yield xs.headOption
Więc nie muszę pisać więcej niż raz. Ale na pewno jest to już w bibliotece, a ja właśnie to przegapiłem?