【问题标题】:Scalacheck generator of list with generated objects带有生成对象的列表的Scalacheck生成器
【发布时间】:2017-02-01 21:44:19
【问题描述】:

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

 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))
      }
    }

【问题讨论】:

  • Arseniy 注意到:如果您有 A 类型,则为该类型量身定制生成器是惯用的。

标签: scalacheck


【解决方案1】:

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

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

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

val listOfAGen = Gen.listOf(aGen)

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

【讨论】:

  • val listOfAGen= Gen.listOfN(list.size * 2, aGen).map(.groupBy(.myInt).flatMap(x => x._2.headOption ))
【解决方案2】:

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

【讨论】:

  • 如果您确定它会返回非空生成器,则可以使用sample。
猜你喜欢
  • 1970-01-01
  • 2015-05-17
  • 1970-01-01
  • 2015-01-16
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多