列表的Scalacheck生成器与生成的对象

时间:2017-02-01 13:13:46

标签: scalacheck

我需要生成对象列表。每个对象必须包含预定值和生成的值。 我创建了生成器,但不确定这是真正的方法。 有没有办法让它更具可读性?

 object Test {
      case class A(myInt: Int, randomInt: Int)
      val list = List(1, 2, 3, 4, 5)
      val subListGen = Gen.someOf(list)
      val randomIntGen = Gen.choose(0,10)
      import scala.collection.JavaConverters._
      val seqAGen: Gen[Seq[A]] = for {
        subsetMyInts <- subListGen
        seqOfRandomIntsWithSizeEqualGenSubList <- Gen.sequence(subsetMyInts.map(x => randomIntGen))
      } yield {
        subsetMyInts.zip(seqOfRandomIntsWithSizeEqualGenSubList.asScala.toList).map(x => A(x._1, x._2))
      }
    }

2 个答案:

答案 0 :(得分:2)

首先,我们可能希望为单个实例实现生成器:

val aGen: Gen[A] = for {
  myInt <- Gen.oneOf(list:_*)
  randomInt <- Gen.choose(0, 10)
} yield A(myInt, randomInt)

然后 - 生成这些对象的列表:

val listOfAGen = Gen.listOf(aGen)

如果您不关心myInt s的唯一性,这将有效。

答案 1 :(得分:0)

使用.sample

的方法
object Test {
  case class A(myInt: Int, randomInt: Int)
  val list = List(1, 2, 3, 4, 5)
  val randomIntGen = Gen.choose(0,10)
  val seqAGen: Gen[Seq[A]] =  Gen.someOf(list.flatMap(myInt => randomIntGen.sample.map(A(myInt, _))))
}