2016-08-15 1 views
3

과제의 일부로 Scalacheck을 사용하여 결함을 찾습니다. 믿을 수 없을 정도로 아마, 나는 그것이 0이 아닌 정수들의 쌍을 생성 할 때 막혔다. 내 IntelliJ에 워크 시트에서 ScalaCheck : 지정된 범위를 벗어나는 값을 출력합니다.

, 광고는 그대로는 :

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") 

에게 어떤 도움을 사용하고 있습니다.

업데이트 I : @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 회 실행했습니다. 이것은 하나의 임의 출력입니다.

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 =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 

을 생성합니다

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 

하지만하여

에서 평등에 조건을 변경 생산 appling 은 Generator를 사용하여 명시한 지침을 무시합니다. 다소 직관적이지 않다? 다른 사람들은 어떻게 생각합니까?

+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

실제로 내 코드가 아닙니다. 또한 조건이 여전히 문제를 일으키는 경우이를 주석 처리합니다. –