生成任意A=>;与scalacheck约会

生成任意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

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中的一个回归。打开了一个窗口。

你在问什么?您生成两个相隔100毫秒的时间戳,结果是。。。相隔100毫秒?您可能需要重新定义相等,以便epsilon中的两个值相等。@BobDalgleish我可能完全忽略了这一点,但我认为我生成的是一个纯函数,对于给定的
字符串
,它将始终生成相同的
日期
值。这就是我正在测试的-调用
g
,一个任意的纯
String=>Date
,在不同的时间对相同的字符串值生成不同的值。