2010-12-07 4 views
2

scalacheck 1.6.6 및 specs 1.7 (scala 2.8.1)을 사용하여 (길이가 0이 아닌) 유효한 유니 코드 문자열을 생성하는 생성기를 만들려고합니다. 이 unicodeChar에서 필터를 사용하는 것은 문제가 될 것 같다,scalacheck로 임의의 (합법적 인) 유니 코드 문자를 생성 하시겠습니까?

import org.specs.Specification 
import org.specs.matcher.ScalaCheckMatchers 

object CoreSpec extends Specification with ScalaCheckMatchers {   
    "The core" should {  
    "pass trivially" in { 
     Generators.unicodeStr must pass((s: String) => s == s) 
    } 
    } 
} 

:하지만, 다음과 같은 사양에서 사용할 ...

object Generators { 
    def unicodeChar: Gen[Char] = 
    choose(Math.MIN_CHAR, Math.MAX_CHAR).map(_.toChar).filter(
     c => Character.isDefined(c)) 
    def unicodeStr: Gen[String] = for(cs <- listOf1(unicodeChar)) yield cs.mkString 
} 

:

는 난 그냥 같은 발전기를 만들 수 있습니다 희망 :

Specification "CoreSpec" 
    The core should 
    x pass trivially 
    Gave up after only 64 passed tests. 500 tests were discarded. 

unicodeChar에서 필터를 제거하면 테스트가 통과되지만 다른 문제가 발생합니다. 나중에 문자열이 잘 정의 된 유니 코드가 아니기 때문입니다.

이것을 달성하는 방법에 대한 제안을 미리 감사드립니다.

+0

그것은 좀 더 쉽게 보인다. 그러나 증상 만 수정하면 실제 원인을 해결할 수 없습니다. –

답변

7

발전기를 작성하기 전에 문자를 필터링 시도는 :

val unicodeChar: Gen[Char] = Gen.oneOf((Math.MIN_CHAR to Math.MAX_CHAR).filter(Character.isDefined(_))) 

은 유니 코드 문자의 전체 목록이 할당되기 때문에 발전기가 생성 될 때, 더 많은 메모리를 많이 할 수 있지만, 하나 개의 인스턴스 만합니다 목록이 사용되므로 큰 문제가 아니어야합니다.

+0

아, 그건 의미가 있습니다. 감사! –

+2

여기에 대신 할 수 있습니다 : val unicodeChar = Gen.choose (Char.MinValue, Char.MaxValue) .filter (Character.isDefined) –

2

좋아, 알아 냈어. 이것은 나를 위해 일하는 것입니다 :

def unicodeChar = Gen((p: Gen.Params) => { 
    var c = 0 
    do { 
     c = util.Random.nextInt(0xFFFF) 
    } while (!Character.isDefined(c)) 
    Some(c.toChar) 
    }) 

아주 간단합니다. 내가 얻지 못한 것은 Gen.apply() 함수에 Gen.Params => T를 전달하여 T 타입의 임의의 생성자를 생성 할 수 있다는 것입니다.

0

filter 대신 suchThat을 사용해 보셨습니까?

+0

나는 조금 더 읽은 후에 그것을 시도했다. 그것은 같은 증상을 가지고 있습니다. –

+1

실제로 그런 필터는 단지 래퍼입니다 : def suchThat (p : T => Boolean) : Gen [T] = filter (p) –

1

나는 2010 년에 얼마나 잘 모르겠지만, 요즘 당신은 Arbitrary을 사용할 수 있습니다 : 나는 사양을 사용하고, 새로운 암시에 Params 인스턴스를 제공하지 않는 경우

import org.scalacheck.Arbitrary 
    import org.scalacheck.Gen 

    val unicodeChar: Gen[Char] = Arbitrary.arbChar.arbitrary 
    val unicodeString: Gen[String] = Arbitrary.arbString.arbitrary 
관련 문제