scala - 在 ScalaCheck 中创建了 unicode 和没有空格生成器的 unicode

标签 scala unit-testing unicode scalacheck

在测试过程中,我们想要限定 unicode 字符,有时范围很宽,有时范围更窄。我创建了一些特定的生成器:

// Generate a wide varying of Unicode strings with all legal characters (21-40 characters):
val latinUnicodeCharacter = Gen.choose('\u0041', '\u01B5').filter(Character.isDefined)

// Generate latin Unicode strings with all legal characters (21-40 characters):
val latinUnicodeGenerator: Gen[String] = Gen.chooseNum(21, 40).flatMap { n =>
    Gen.sequence[String, Char](List.fill(n)(latinUnicodeCharacter))
}

// Generate latin unicode strings without whitespace (21-40 characters): !! COMES UP SHORT...
val latinUnicodeGeneratorNoWhitespace: Gen[String] = Gen.chooseNum(21, 40).flatMap { n =>
    Gen.sequence[String, Char](List.fill(n)(latinUnicodeCharacter)).map(_.replaceAll("[\\p{Z}\\p{C}]", ""))
}

latinUnicodeCharacter 生成器从标准拉丁字符(“A”、“B”等)到高阶拉丁字符(日耳曼语/北欧语等)中进行选择。这非常适合测试基于拉丁语的字符输入,例如姓名。

latinUnicodeGenerator 创建长度为 21-40 个字符的字符串。这些字符串包含水平空格(不仅仅是空格字符,还包括其他“水平空格”)。

最后一个示例,latinUnicodeGeneratorNoWhitespace,用于电子邮件地址。我们需要拉丁字符,但不需要空格、控制代码等。 问题:因为我正在映射最终结果String并过滤掉控制字符,所以String缩小了,最终得到了总计长度小于 21 个字符(有时)。

所以问题是:我怎样才能实现latinUnicodeGeneratorNoWhitespace,但在生成器中以这样的方式实现它,以便我始终获得 21-40 个字符串?

最佳答案

您可以通过将一系列非空白字符和另一个空白字符放在一起,然后仅从非空白字符中进行选择,或从两者中进行选择:

import org.scalacheck.Gen

val myChars = ('A' to 'Z') ++ ('a' to 'z')
val ws = Seq(' ', '\t')

val myCharsGenNoWhitespace: Gen[String] = Gen.chooseNum(21, 40).flatMap { n =>
  Gen.buildableOfN[String, Char](n, Gen.oneOf(myChars))
}

val myCharsGen: Gen[String] = Gen.chooseNum(21, 40).flatMap { n =>
  Gen.buildableOfN[String, Char](n, Gen.oneOf(myChars ++ ws))
}

不过,我建议考虑一下您真正要测试的内容 - 对测试用例的限制越多,您就越少检查程序在意外输入时的行为方式。

关于scala - 在 ScalaCheck 中创建了 unicode 和没有空格生成器的 unicode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30405612/

相关文章:

c++ - Visual C++ argv 问题

scala - 如何在 Akka HTTP 中将数字流完成为 CSV 值?

scala - 为什么Scala 中的这个函数调用没有被优化掉?

c# - 如何对生成线程的方法进行单元测试?

java - 单元测试 : Entry name 'res/layout/test_toolbar.xml' collided

macos - 如何在没有数字键盘的情况下在 mac 上输入 unicode 字符?

ruby - 是什么阻止了静态类型语言拥有像 Ruby 的 method_missing 这样的东西?

用于管理对象池的 Scala 方式

java - 在Android中正确测试静态方法

java - 使用 Stax 解析 XML 文件时出现 Unicode(0xb) 错误