带有生成对象的列表的Scalacheck生成器

带有生成对象的列表的Scalacheck生成器,scalacheck,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) impo

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

 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))
      }
    }
对象测试{
案例类别A(myInt:Int,randomInt:Int)
val list=列表(1,2,3,4,5)
val subListGen=Gen.someOf(列表)
val randomIntGen=Gen.choose(0,10)
导入scala.collection.JavaConverters_
val sekagen:Gen[Seq[A]]=for{
分条款A(x._1,x._2))
}
}

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

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

如果您不关心myInt的唯一性,这将起作用。

使用.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, _))))
}

正如Arseniy所注意到的:如果您有一个a类型,那么为该类型定制一个生成器是惯用的做法。如果您确定sample将返回非空的generator.val listOfAGen=Gen.listOfN(list.size*2,aGen.map(.groupBy(.myInt).flatMap(x=>x.\u 2.headOption))则可以使用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, _))))
}