Eri*_*o - 4 specs scala scalacheck
我正在尝试使用scalacheck 1.6.6和specs 1.7(scala 2.8.1)创建一个生成(非零长度)合法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
}
Run Code Online (Sandbox Code Playgroud)
...然后从规格中使用它们:
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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,似乎在unicodeChar中使用过滤器会导致问题:
Specification "CoreSpec"
The core should
x pass trivially
Gave up after only 64 passed tests. 500 tests were discarded.
Run Code Online (Sandbox Code Playgroud)
如果我从unicodeChar中删除过滤器,我的测试通过了,但我后来遇到其他问题,因为我的字符串并不总是定义良好的unicode.
提前感谢有关如何实现这一目标的任何建议.
尝试在创建生成器之前过滤掉字符:
val unicodeChar: Gen[Char] = Gen.oneOf((Math.MIN_CHAR to Math.MAX_CHAR).filter(Character.isDefined(_)))
Run Code Online (Sandbox Code Playgroud)
它将占用大量内存,因为在创建生成器时将分配完整的unicode字符列表,但是只使用该列表的一个实例,因此它不应该是一个大问题.
我不知道 2010 年情况如何,但现在您可以使用Arbitrary
:
import org.scalacheck.Arbitrary
import org.scalacheck.Gen
val unicodeChar: Gen[Char] = Arbitrary.arbChar.arbitrary
val unicodeString: Gen[String] = Arbitrary.arbString.arbitrary
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1512 次 |
最近记录: |