在ScalaCheck中生成选项[T]

时间:2013-09-14 06:58:27

标签: scala 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)它效率低,因为我无法设置元素数量的最大限制。

如何生成包含Nones的Option[Thing]

编辑:我找到了一个解决方案,但它并不简洁。还有比这更好的方法吗?

for {
  thing <- for {
    qty <- Gen.choose(0,1)
    things <- Gen.listOfN[Thing](qty, thingGenerator)
  } yield things.headOption
} yield thing

编辑2 :我将此概括为

def optional[T](g: Gen[T]) = 
  for (qty <- Gen.choose(0, 1); xs <- Gen.listOfN[T](qty, g)) yield xs.headOption

所以我不必多次写它。但肯定这已经在图书馆了,我只是错过了它?

2 个答案:

答案 0 :(得分:25)

现在你可以使用:

Gen.option(yourGen)

答案 1 :(得分:9)

您可以使用pick在Some和None生成器之间随机选择:

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