Я пытаюсь создать необязательные параметры в ScalaCheck без успеха.
Кажется, нет прямого механизма для этого. Gen.containerOf[Option, Thing](thingGenerator)
терпит неудачу, потому что он не может найти неявный Buildable[Thing, Option]
.
Я пробовал
for {
thing <- Gen.listOfN[Thing](1, thingGenerator)
} yield thing.headOption
Но это не работает, потому что listOfN
создает список, который всегда имеет длину N. В результате я всегда получаю Some[Thing]
. Точно так же listOf1
не работает, потому что (a) он не создает пустые списки, но также (b) он неэффективен, потому что я не могу установить максимальное ограничение на количество элементов.
Как я могу сгенерировать Option[Thing]
, который включает в себя Nones?
EDIT. Я нашел решение, но это не кратким. Есть ли лучший способ, чем это?
for {
thing <- for {
qty <- Gen.choose(0,1)
things <- Gen.listOfN[Thing](qty, thingGenerator)
} yield things.headOption
} yield thing
EDIT 2: я обобщил это на
def optional[T](g: Gen[T]) =
for (qty <- Gen.choose(0, 1); xs <- Gen.listOfN[T](qty, g)) yield xs.headOption
Поэтому мне не нужно писать это более одного раза. Но, конечно, это уже в библиотеке, и я просто пропустил это?