根据另一个 Gen 定义 ScalaCheck 生成器
Defining a ScalaCheck generator in terms of another Gen
如何定义一个生成器来为给定 Block
的 fields
生成随机数据。以下是脚手架代码。我需要有关替换 ???
的表达式的帮助。此表达式应生成 Seq[Field]
,但 Field
应使用定义的 genField
函数生成。
def blockGen(b: Block): Gen[Block] = for {
id <- b.blockId //Use the same blockId as b
fields <- ??? //Get the type from each field and call genField
} yield Block(id, fields)
ADT
trait Data {}
trait Field extends Data {
val name: String
val value: String
}
case class StringField(name: String, value: String) extends Field
case class NumberField(name: String, value: String) extends Field
case class Block(blockId: Field, fields: Seq[Field]) extends Data
发电机
def fieldGen(fieldType: Field): Gen[Field] = {
for {
f <-
fieldType match {
case _: NumberField => numGen
case _: StringField => strGen
}
} yield f
}
val strGen: Gen[StringField] = for {
name <- Gen.identifier
value <- Gen.alphaStr
} yield StringField(name, value)
val numGen: Gen[NumberField] = for {
name <- Gen.identifier
value <- Gen.numStr
} yield NumberField(name, value)
示例块:myBlock
val cx = new StringField("blockId", "CX")
val seg = StringField("segmentation", "ABC")
val ver = NumberField("version", "1.0")
val myBlock = Block(cx, Seq(seg, ver))
我相信你要找的是Gen.sequence
。
此外,id
不需要来自生成器,因为您所做的只是直接使用特定值。
def blockGen(b: Block): Gen[Block] =
for {
fields <- Gen.sequence[Seq[Field], Field](b.fields.map(fieldGen))
} yield Block(b.blockId, fields)
顺便说一下,Gen.sequence
与 Future.sequence
and sequence
in Haskell 非常相似。
如何定义一个生成器来为给定 Block
的 fields
生成随机数据。以下是脚手架代码。我需要有关替换 ???
的表达式的帮助。此表达式应生成 Seq[Field]
,但 Field
应使用定义的 genField
函数生成。
def blockGen(b: Block): Gen[Block] = for {
id <- b.blockId //Use the same blockId as b
fields <- ??? //Get the type from each field and call genField
} yield Block(id, fields)
ADT
trait Data {}
trait Field extends Data {
val name: String
val value: String
}
case class StringField(name: String, value: String) extends Field
case class NumberField(name: String, value: String) extends Field
case class Block(blockId: Field, fields: Seq[Field]) extends Data
发电机
def fieldGen(fieldType: Field): Gen[Field] = {
for {
f <-
fieldType match {
case _: NumberField => numGen
case _: StringField => strGen
}
} yield f
}
val strGen: Gen[StringField] = for {
name <- Gen.identifier
value <- Gen.alphaStr
} yield StringField(name, value)
val numGen: Gen[NumberField] = for {
name <- Gen.identifier
value <- Gen.numStr
} yield NumberField(name, value)
示例块:myBlock
val cx = new StringField("blockId", "CX")
val seg = StringField("segmentation", "ABC")
val ver = NumberField("version", "1.0")
val myBlock = Block(cx, Seq(seg, ver))
我相信你要找的是Gen.sequence
。
此外,id
不需要来自生成器,因为您所做的只是直接使用特定值。
def blockGen(b: Block): Gen[Block] =
for {
fields <- Gen.sequence[Seq[Field], Field](b.fields.map(fieldGen))
} yield Block(b.blockId, fields)
顺便说一下,Gen.sequence
与 Future.sequence
and sequence
in Haskell 非常相似。