[英]ScalaCheck generate a distinct list of values
我對 ScalaCheck 相當陌生,不知何故我想生成一個不同值的列表(即一組)。 用我的方法,價值觀不是唯一的。
val valueList: Gen[List[Int]] = Gen.ListOf(Arbitrary.arbitrary[Int])
創建具有唯一值/集合的列表的可能方法是什么? 也許使用suchThat
或distinct
?
粗魯但有效:
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])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.