を呼び出すときに、私は次のコードを持っているScalaCheck、異なる動作Test.checkまたはTest.checkProperties
package quickcheck.tests
import org.scalacheck.Arbitrary._
import org.scalacheck.Gen._
import org.scalacheck.Prop._
import org.scalacheck._
import org.scalacheck.util.ConsoleReporter
class Heap
{
}
object Heap
{
val empty = new Heap
def insert(i: Int, h: Heap) = new Heap
}
class TestCheck extends Properties("Heap")
{
lazy val genHeap: Gen[Heap] =
{
def sizedHeap(size: Int): Gen[Heap] =
{
if (size <= 0)
Heap.empty
else
for
(
i <- arbitrary[Int] suchThat(_ > Int.MinValue);
s <- choose(0, size);
h <- sizedHeap(s)
)
yield
Heap.insert(i, h)
}
Gen.sized[Heap](sizedHeap)
}
implicit lazy val arbHeap: Arbitrary[Heap] = Arbitrary(genHeap)
property("test1") = forAll
{
(h: Heap) => true
}
property("test2") = forAll
{
(h1: Heap, h2: Heap, n: Int) => true
}
}
object MyTest extends App
{
println("*** TEST 1")
val checkHeap = new TestCheck
Test.checkProperties(Test.Parameters.default.withTestCallback(ConsoleReporter(1)),
checkHeap)
println("*** TEST 2")
val checkHeap2 = new TestCheck
checkHeap2.check
println("*** TEST 3")
val checkHeap3 = new TestCheck
Test.check(Test.Parameters.default.withTestCallback(ConsoleReporter(1)), checkHeap)
}
私はScalaCheck Test
クラスを通してそれを実行した場合、私は異なる結果が出た場合私は方法Test.checkProperties
または方法Test.check
を使用します。
これは、私が手に出力されます:TEST1がTEST3とは異なる結果を与える理由
*** TEST 1
+ Heap.test1: OK, passed 100 tests.
+ Heap.test2: OK, passed 100 tests.
*** TEST 2
+ Heap.test1: OK, passed 100 tests.
+ Heap.test2: OK, passed 100 tests.
*** TEST 3
! Gave up after only 40 passed tests. 202 tests were discarded.
私の質問です。
私はsuchThat
フィルタを削除し、このようsizeHead
方法でfor
声明を残す場合:
for
(
i <- arbitrary[Int]
s <- choose(0, size);
h <- sizedHeap(s)
)
yield
Heap.insert(i, h)
私は次のような結果を得る:
*** TEST 1
+ Heap.test1: OK, passed 100 tests.
+ Heap.test2: OK, passed 100 tests.
*** TEST 2
+ Heap.test1: OK, passed 100 tests.
+ Heap.test2: OK, passed 100 tests.
*** TEST 3
+ OK, passed 100 tests.
はこのバグですか、それはあります正しい行動ですか? ScalaTest Checkers.check
はTest.check
を使用しています。
私の回答が物事をクリアするのに役立つことを願っていますか? – lunaryorn
ありがとうございます。はい、私は私が違うことをしていることに気付きました。私が理解していないのは、すべてのプロパティをチェックするのと同じことをする2つのチェックに対して異なる結果を得ている理由です。 正解ですが、コードを再フォーマットするときに、私が投稿する前にテストしたところで、エラーで右括弧が削除されました。これは構文エラーです。私はあなたの許しを請います。しかし残念なことに、再フォーマットを行わずにコードをコピー&ペーストできなければ、これが再び起こることは間違いありません。 –
ところで、私はタイプミスを修正するために質問を編集しました。 –