在 ScalaCheck 中生成任意 Function1

Ill*_*lSc 2 scala scalacheck

对于我的测试,我想生成类型为 的任意随机函数String => Boolean

是否可以使用 ScalaCheck 做到这一点?

Ale*_*nov 5

是的,就像您生成其他类型的任意值一样:

import org.scalacheck._

// Int instead of Boolean to better see that it is a function
val arb = implicitly[Arbitrary[String => Int]].arbitrary.sample.get

println(arb("a"))
println(arb("a")) // same
println(arb("b"))
Run Code Online (Sandbox Code Playgroud)

因为有一个隐式Cogen[String]和一个Arbitrary[Boolean]. Cogen用户指南中没有记录,但它等同于 QuickCheck CoArbitrary,在https://kseo.github.io/posts/2016-12-14-how-quick-check-generate-random-functions.htmlhttps 中有解释://begriffs.com/posts/2017-01-14-design-use-quickcheck.html(在“CoArbitrary and Gen (a -> b)”下)。

那么是否有可能从随机案例类生成任意函数?例如

case class File(name: Str, size:Long)
Run Code Online (Sandbox Code Playgroud)

定义一个Cogen[File]. 手动:

implicit val cogenFile: Cogen[File] = Cogen { 
  (seed: Seed, file: File) => Cogen.perturbPair(seed, (file.name, file.size))
}
Run Code Online (Sandbox Code Playgroud)

代码略多,但概括为 2 个以上的字段:

implicit val cogenFile: Cogen[File] = Cogen { (seed: Seed, file: File) => 
  val seed1 = Cogen.perturb(seed, file.name)
  Cogen.perturb(seed1, file.size)
}
Run Code Online (Sandbox Code Playgroud)

或者自动使用scalacheck-shapeless

implicit val cogenFile: Cogen[File] = MkCogen[File].cogen
Run Code Online (Sandbox Code Playgroud)