生成任意A=>;与scalacheck约会
scalacheck 1.13.3出现了一个奇怪的问题:生成任意A=>;与scalacheck约会,scala,scalacheck,Scala,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 Gene
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中的一个回归。打开了一个窗口。你在问什么?您生成两个相隔100毫秒的时间戳,结果是。。。相隔100毫秒?您可能需要重新定义相等,以便epsilon中的两个值相等。@BobDalgleish我可能完全忽略了这一点,但我认为我生成的是一个纯函数,对于给定的字符串
,它将始终生成相同的日期
值。这就是我正在测试的-调用g
,一个任意的纯String=>Date
,在不同的时间对相同的字符串值生成不同的值。