在测试期间,我们想要限定 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 个字符串?