Ich bin in einem seltsamen Problem mit Scalacheck 1.13.3 ausgeführt: beliebige Instanzen von A => java.util.Date
generieren verschiedene Werte abhängig von der Zeit sie aufgerufen werden.Generieren beliebige A => Datum mit scalacheck
Hier ist ein Beton, reproduzierbares Beispiel:
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)
}
}
}
Dies schlägt fehl. Das Drucken der tatsächlichen Werte von d1
und d2
zeigt, dass die Daten tatsächlich unterschiedlich sind, mit einem Unterschied zwischen 100 und 103 ms. Ich würde vermuten, dass das Problem von meiner Cogen
Instanz kommt, aber ich muss zugeben, ich verstehe nicht warum
Wonach fragen Sie? Sie erzeugen zwei Zeitstempel im Abstand von 100 Millisekunden, und die Ergebnisse liegen im Abstand von 100 Millisekunden? Möglicherweise müssen Sie die Gleichheit neu definieren, so dass zwei Werte innerhalb Ihres Epsilons gleich sind. –
@BobDalgleish Ich könnte den Punkt komplett vermissen, aber ich dachte, ich würde eine reine Funktion erzeugen, die für einen gegebenen 'String' immer den gleichen' Date' Wert erzeugen würde. Dies ist, was ich gerade teste - indem ich 'g', ein beliebiges reines' String => Date', auf dem gleichen String-Wert zu verschiedenen Zeiten aufrufe, erzeugen Sie unterschiedliche Werte. –