Подтвердить что ты не робот

Создать опцию [T] в ScalaCheck

Я пытаюсь создать необязательные параметры в 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

Поэтому мне не нужно писать это более одного раза. Но, конечно, это уже в библиотеке, и я просто пропустил это?

4b9b3361

Ответ 1

Теперь вы можете просто использовать:

Gen.option(yourGen)

Ответ 2

Вы можете использовать pick для случайного выбора между генератором Some и None:

val someThing = thingGenerator.map( Some.apply )
val noThing = Gen.value( None:Option[Thing] )
val optThing = Gen.oneOf( someThing, noThing )