使用 scalacheck 生成任意 A => 日期
Generating arbitrary A => Date with scalacheck
我 运行 遇到了 scalacheck 1.13.3 的一个奇怪问题:A => java.util.Date
的任意实例根据它们被调用的时间生成不同的值。
这是一个具体的、可重现的例子:
import org.scalatest.FunSuite
import org.scalatest.prop.GeneratorDrivenPropertyChecks
import java.util.Date
import org.scalacheck._
class Repr extends FunSuite with GeneratorDrivenPropertyChecks {
implicit val cogenDate: Cogen[Date] = Cogen(_.getTime)
test("reproduce") {
forAll { (s: String, g: String => Date) =>
val d1 = g(s)
Thread.sleep(100)
val d2 = g(s)
assert(d1 === d2)
}
}
}
这失败了。打印 d1
和 d2
的实际值表明日期确实不同,差异在 100 和 103 毫秒之间。
我猜问题出在我的 Cogen
实例上,但我必须承认我不明白为什么。
我 运行 遇到了 scalacheck 1.13.3 的一个奇怪问题:A => java.util.Date
的任意实例根据它们被调用的时间生成不同的值。
这是一个具体的、可重现的例子:
import org.scalatest.FunSuite
import org.scalatest.prop.GeneratorDrivenPropertyChecks
import java.util.Date
import org.scalacheck._
class Repr extends FunSuite with GeneratorDrivenPropertyChecks {
implicit val cogenDate: Cogen[Date] = Cogen(_.getTime)
test("reproduce") {
forAll { (s: String, g: String => Date) =>
val d1 = g(s)
Thread.sleep(100)
val d2 = g(s)
assert(d1 === d2)
}
}
}
这失败了。打印 d1
和 d2
的实际值表明日期确实不同,差异在 100 和 103 毫秒之间。
我猜问题出在我的 Cogen
实例上,但我必须承认我不明白为什么。