2016-08-15 10 views
3

私はScalacheckを使用して不具合を発見しています。おそらく、おそらく、私はそれが非ゼロの整数のペアを生成しているとして立ち往生しています。ScalaCheck:指定された範囲を超えて値を出力します。

私IntelliJのワークシート、そのまま広告から:

import org.scalacheck._ 
    import Arbitrary._ 
    import Gen._ 
    import Prop._ 

    implicit lazy val genUnequalIntPairs = for { 
     i <- Gen.choose(1,1000) 
     j <- Gen.choose(i+1,1000) 
     if (i < j) 
    } yield (i,j) 

    val kk = forAll (genUnequalIntPairs) { 
     case (x,y) => println("x =" + x + ", y =" + y) 
     x == y 
    } 

kk.check 

私は明示的にゼロであることを選択された値の最小値を言及しています、ので、私はプロパティ内の任意のゼロが表示されないはずです 、 右?少なくとも、それは私の理解です。しかし、これは私が見ているものです:

x =134, y =547 
x =0, y =547 
x =0, y =0 
x =0, y =274 
x =0, y =0 
x =0, y =137 
x =0, y =0 
x =0, y =69 
x =0, y =0 
x =0, y =35 
x =0, y =0 
x =0, y =18 
x =0, y =0 
x =0, y =9 
x =0, y =0 
x =0, y =5 
x =0, y =0 
x =0, y =3 
x =0, y =0 
x =0, y =2 
x =0, y =0 
x =0, y =1 
x =0, y =0 
! Falsified after 0 passed tests. 
> ARG_0: (0,1) 
> ARG_0_ORIGINAL: (134,547) 
res0: Unit =() 

どこから来ていますか?私は何が欠けているのですか?おそらく、明らかなものがありますが、私の目はそれらを捕まえません。

私はScalcheckバージョン1.12.1

Seq("org.scalacheck" %% "scalacheck" % "1.12.1") 

すべてのヘルプ、感謝を使用しています。

更新@:@samar(私もgitbookで同じことが言及されています)が提案したように、私はのようにジェネレータをフィルタリングしようとしました。。しかし、あまり運がない(下のコード):

implicit lazy val genUnequalIntPairs = for { 
    i <- Gen.choose(1,1000).suchThat(_ > 0) 
    j <- Gen.choose(i+1,1000).suchThat(_ > 0) 
    if (i < j) 
} yield (i,j) 

val kk = forAll (genUnequalIntPairs) { 
    case (x,y) => println("x =" + x + ", y =" + y) 
    x == y 
} 

kk.check 

私はこのコードを約6-7回実行しました。これは1つのランダムな出力です。

x =536, y =730 
x =0, y =730 
x =0, y =0 
x =0, y =365 
x =0, y =0 
x =0, y =183 
x =0, y =0 
x =0, y =92 
x =0, y =0 
x =0, y =46 
x =0, y =0 
x =0, y =23 
x =0, y =0 
x =0, y =12 
x =0, y =0 
x =0, y =6 
x =0, y =0 
x =0, y =3 
x =0, y =0 
x =0, y =2 
x =0, y =0 
x =0, y =1 
x =0, y =0 
! Falsified after 0 passed tests. 
> ARG_0: (0,1) 
> ARG_0_ORIGINAL: (536,730) 
res0: Unit =() 

アップデートII:ちょうど確認するために、私はエリックの提案に従っていると、この行っている:

implicit lazy val genUnequalIntPairs = for { 
    i <- Gen.choose(1,1000) 
    j <- Gen.choose(i+1,1000) 
    if (i != 0 && j != 0) 
} yield { 
    (i,j) 
} 

val kk = forAllNoShrink(genUnequalIntPairs) { 
    case (x,y) => println("x =" + x + ", y =" + y) 
    x < y 
} 

kk.check 

これは動作します:

x =805, y =1000 
x =742, y =926 
x =772, y =919 
x =219, y =686 
x =999, y =1000 
x =752, y =792 
x =163, y =585 
x =721, y =735 
x =251, y =866 
x =383, y =887 
x =797, y =939 
x =925, y =947 
x =291, y =951 
x =502, y =619 
x =422, y =756 
x =159, y =886 
x =49, y =955 
x =624, y =819 
x =922, y =979 
x =881, y =894 
x =936, y =952 
x =908, y =975 
x =802, y =976 
x =918, y =946 
x =564, y =823 
x =544, y =751 
x =916, y =938 
x =57, y =762 
x =614, y =963 
x =497, y =986 
x =102, y =332 
x =264, y =643 
x =611, y =720 
x =542, y =797 
x =704, y =784 
Output exceeds cutoff limit. 

アップデートIII: FWIWを、私が発見しましたScalacheckバージョン1.13.1(これはもともとは1.12.x)に移動すると、次のような動作が発生します。

implicit lazy val genUnequalIntPairs = for { 
    i <- Gen.choose(1,1000) 
    j <- Gen.choose(1,1000) 
    if (i < j) 
} yield { 
    (i,j) 
} 

val kk = forAll(genUnequalIntPairs) { 
    case (x,y) => println("x =" + x + ", y =" + y) 
    x < y 
} 

kk.check 

x =56, y =752 
x =395, y =532 
x =468, y =828 
x =326, y =749 
x =203, y =973 
x =294, y =393 
x =589, y =975 
x =44, y =75 
x =406, y =533 
x =33, y =381 
x =405, y =767 
x =13, y =883 
x =201, y =341 
x =593, y =991 
x =636, y =913 
x =508, y =782 
x =333, y =861 
x =306, y =863 
x =428, y =537 
x =373, y =775 
x =74, y =462 
x =196, y =299 
x =245, y =535 
x =312, y =993 
x =940, y =989 
x =12, y =708 

を生成未満、よりから平等に条件を変更することにより、これが起こる:

implicit lazy val genUnequalIntPairs = for { 
    i <- Gen.choose(1,1000) 
    j <- Gen.choose(1,1000) 
    if (i < j) 
} yield { 
    (i,j) 
} 

val kk = forAll(genUnequalIntPairs) { 
    case (x,y) => println("x =" + x + ", y =" + y) 
    x == y 
} 

kk.check 

明らか
x =370, y =585 
x =0, y =585 
x =0, y =0 
x =0, y =293 
x =0, y =0 
x =0, y =147 
x =0, y =0 
x =0, y =74 
x =0, y =0 
x =0, y =37 
x =0, y =0 
x =0, y =19 
x =0, y =0 
x =0, y =10 
x =0, y =0 
x =0, y =5 
x =0, y =0 
x =0, y =3 

、条件を生成します拍手するより優先されます。これは多少ではない直感的ではない?他の人はどう思いますか?

+1

これはバグだと思っています。私はそれを提起しました:https:// github。com/rickynils/scalacheck/issues/253 –

+0

奇妙な。あなたは試してみることができます:Gen.choose(1,1000)suchThat(_> 0) – Samar

+0

@Samar、その範囲は述語を暗示しています。ところで、それは問題も解決しません。 –

答えて

4

これはおそらくプロパティの縮小によるものです。代わりにforAllNoShrinkで試してください。

+0

ちょうどそれを試みました - 最初のテストを過ぎても得られません。 –

+0

x Eric

+0

実際は自分のコードではありません。もし条件がまだ問題を生み出すならば、それをコメントする。 –

関連する問題