ScalaCheck 生成不同的值列表

ScalaCheck generate a distinct list of values

我是 ScalaCheck 的新手,我想以某种方式生成不同值的列表(即一组)。使用我的方法,值不是唯一的。

val valueList: Gen[List[Int]] = Gen.ListOf(Arbitrary.arbitrary[Int])

创建具有独特 values/a 集的列表的可能方法有哪些?也许使用 suchThatdistinct?

粗糙但有效:

Gen.listOf(Arbitrary.arbitrary[Int]).map(_.toSet)

如果你想要一套特定尺寸的套装,你可以这样做

def setOfN[A](n: Int, gen: Gen[A]): Gen[Set[A]] =
  Gen.listOfN(n, gen).flatMap { lst =>
    val set = lst.toSet

    if (set.size == n) Gen.const(set)
    else if (set.size > n) Gen.const(set.take(n))
    else setOfN(n - set.size, gen.retryUntil(x => !set(x))).flatMap(_ ++ set)
  }

(值得注意的是,retryUntil 可能很脆弱,尤其是当 n 相对于通常生成的值的数量增长时(例如,对于 Int Scalacheck 生成 0、+/- 1 等相当频繁))

当然,因为 Set

有一个 org.scalacheck.util.Buildable 实例
Gen.containerOf[Set, Int](Arbitrary.arbitrary[Int])