ScalaCheck - 有序数组生成器

rmo*_*ais 6 scala scalacheck

我是第一次尝试ScalaCheck,我想生成一个有序的Ints数组.

我阅读了文档并做了一些搜索,但我找不到办法.

有人可以对此有所了解吗?

谢谢

Tra*_*own 7

我假设你想要一个已经排序的任意整数数组,对吧?如果是这种情况,您可以使用以下任一方法获取Gen[Array[Int]]:

val genIntArray = Gen.containerOf[Array, Int](
  Gen.chooseNum(Int.MinValue, Int.MaxValue)
)
Run Code Online (Sandbox Code Playgroud)

要么:

val genIntArray = implicitly[Arbitrary[Array[Int]]].arbitrary
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用map修改生成器对其结果进行排序:

 val genSortedIntArray = genIntArray.map(_.sorted)
Run Code Online (Sandbox Code Playgroud)

现在你可以运行genSortedIntArray.sample.get几次来说服自己结果是一个随机整数的排序数组.

如果你想要一个Arbitrary有序的整数数组,最好定义一个包装器而不是隐藏默认值Arbitrary[Array[Int]].例如,您可以编写以下内容:

case class SortedIntArray(value: Array[Int]) extends AnyVal

object SortedIntArray {
  implicit val arb: Arbitrary[SortedIntArray] = Arbitrary(
    genSortedIntArray.map(SortedIntArray(_))
  )
}
Run Code Online (Sandbox Code Playgroud)

然后:

forAll { (a: SortedIntArray) =>
  confirmThatMyFunctionOnSortedIntArraysWorks(a.value)
}
Run Code Online (Sandbox Code Playgroud)