def randomStream[A](g: Gen[A])(rng: RNG): Stream[A] =
Stream.unfold(rng)(rng => Some(g.sample.run(rng)))
def forAll[A](as: Gen[A])(f: A => Boolean): Prop = Prop {
(n,rng) => randomStream(as)(rng).zip(Stream.from(0)).take(n).map {
case (a, i) => try {
if (f(a)) Passed else Falsified(a.toString, i)
} catch { case e: Exception => Falsified(buildMsg(a, e), i) }
}.find(_.isFalsified).getOrElse(Passed)
}
randomStream(as)(rng).zip(Stream.from(0)).take(n)の部分で、(a,i)のストリームをn個 生成
するようだ。
その後、PassedかFalsifiedにmapするということか。
.find(_.isFalsified).getOrElse(Passed)では、最初に失敗にぶつかるとそこでストップ?
def buildMsg[A](s: A, e: Exception): String =
s"test case: $s\n" +
s"generated an exception: ${e.getMessage}\n" +
s"stack trace:\n ${e.getStackTrace.mkString("\n")}"
0 件のコメント:
コメントを投稿