在 ScalaCheck 中创建了没有空格生成器的 unicode 和 unicode
Created unicode & unicode without whitespace generators in 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," 等)到高阶拉丁字符(Germanic/Nordic 等)范围内选择字符。这非常适合测试基于拉丁语的字符输入,例如姓名。
latinUnicodeGenerator
创建长度为 21-40 个字符的字符串。这些字符串包括水平 space(不仅仅是 space 字符,还有其他 "horizontal space")。
最后一个示例 latinUnicodeGeneratorNoWhitespace
用于表示电子邮件地址。我们需要拉丁字符,但不需要 space、控制代码等。 问题: 因为我正在映射最终结果 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))
}
不过,我建议考虑一下您真正测试的是什么——您对测试用例的限制越多,您检查程序在意外输入时的行为方式的次数就越少。
在测试期间,我们想要限定 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," 等)到高阶拉丁字符(Germanic/Nordic 等)范围内选择字符。这非常适合测试基于拉丁语的字符输入,例如姓名。
latinUnicodeGenerator
创建长度为 21-40 个字符的字符串。这些字符串包括水平 space(不仅仅是 space 字符,还有其他 "horizontal space")。
最后一个示例 latinUnicodeGeneratorNoWhitespace
用于表示电子邮件地址。我们需要拉丁字符,但不需要 space、控制代码等。 问题: 因为我正在映射最终结果 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))
}
不过,我建议考虑一下您真正测试的是什么——您对测试用例的限制越多,您检查程序在意外输入时的行为方式的次数就越少。