1
scalacheck 1.13.3で奇妙な問題が発生しています。任意のインスタンスA => java.util.Date
は、呼び出された時間によって異なる値を生成します。scalacheckで任意のA =>日付を生成する
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
インスタンスから問題が発生していると推測していますが、私はその理由を理解できません。
あなたは何を求めていますか? 100ミリ秒離れた2つのタイムスタンプを生成すると、結果は100ミリ秒離れていますか? 2つの値がイプシロン内で等しくなるように等価を再定義する必要があるかもしれません。 –
@BobDalgleish私は完全にポイントを逃しているかもしれませんが、私は、与えられた 'String'に対して常に同じ' Date'値を生成する純関数を生成していると思いました。これは、私がテストしているものです。異なる文字列値に対して 'g 'という任意の純粋な' String => Date'を呼び出すことによって、異なる値が生成されます。 –