Option [T] in ScalaCheck generieren
Ich versuche erfolglos, optionale Parameter in ScalaCheck zu generieren.
Es scheint keinen direkten Mechanismus dafür zu geben.Gen.containerOf[Option, Thing](thingGenerator)
schlägt fehl, weil es ein implizites nicht finden kannBuildable[Thing, Option]
.
Ich habe es versucht
for {
thing <- Gen.listOfN[Thing](1, thingGenerator)
} yield thing.headOption
Aber das funktioniert nicht, weillistOfN
erzeugt eine Liste, die immer die Länge N hat. Als Ergebnis bekomme ich immer eineSome[Thing]
. Ähnlich,listOf1
funktioniert nicht, weil (a) keine leeren Listen erzeugt werden, aber auch (b) es ineffizient ist, weil ich die maximale Anzahl der Elemente nicht festlegen kann.
Wie kann ich generierenOption[Thing]
das schließt Nones ein?
BEARBEITEN: Ich habe eine Lösung gefunden, aber sie ist nicht prägnant. Gibt es einen besseren Weg als diesen?
for {
thing <- for {
qty <- Gen.choose(0,1)
things <- Gen.listOfN[Thing](qty, thingGenerator)
} yield things.headOption
} yield thing
BEARBEITEN 2: Ich verallgemeinerte dies zu
def optional[T](g: Gen[T]) =
for (qty <- Gen.choose(0, 1); xs <- Gen.listOfN[T](qty, g)) yield xs.headOption
Ich muss es also nicht mehr als einmal schreiben. Aber sicher ist das schon in der Bibliothek und ich habe es einfach verpasst?