2010-12-07 3 views
2

私はscalacheck 1.6.6とspecs 1.7(scala 2.8.1)で、(ゼロでない長さの)有効なUnicode文字列を生成するジェネレータを作成しようとしています。scalacheckを使って任意の(正式な)Unicode文字を生成していますか?

私は同じように発電機を作成することができ期待し:その後のようなスペックからそれらを使用して...

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 
} 

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

しかし、unicodeCharでフィルタを使用すると、問題が発生しているようです:私はunicodeCharからフィルタを削除した場合

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

、私のテストは合格、私は他の問題に遭遇します私の文字列は常によく定義されたUnicodeではないので、後で。

これを達成する方法に関するご意見をお寄せいただきありがとうございます。

+0

私はスペックを使用して、新しい暗黙のPARAMSインスタンスを提供しない場合、それは少し簡単に思えます。しかしそれは症状を修正するだけであり、根本的な原因を実際には解決しません。 –

答えて

7

して発電機を作成する前に、文字をフィルタリングしてみてください。

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

Unicode文字の完全なリストは、発電機が作成されたときに割り当てられ、それについて一つだけされますので、それは、より多くのメモリ集約されますリストが使用されるので、大きな問題ではありません。

+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.Params => TをGen.apply()に渡すことによって、タイプTの任意のジェネレータを作成できることです。

0

filterの代わりにsuchThatを試しましたか?

+0

私はもう少し読んだ後にそれを試しました。それは同じ症状を持っています。 –

+1

実際には、このようなフィルタでのラッパーです:def suchThat(p:T => Boolean):Gen [T] = filter(p) –

1

私はそれが2010年にあったか分からないが、今ではArbitraryを使用することができます。

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

    val unicodeChar: Gen[Char] = Arbitrary.arbChar.arbitrary 
    val unicodeString: Gen[String] = Arbitrary.arbString.arbitrary 
関連する問題