0

该检查仍然失败。我把条件分开了,这样我就可以测试它们了。对于 cs = "WWWW", "WXW", "WWWWWWWWRWWWWWW" 它失败了

/** 
 * Check to ensure all lines are only composed of walls, 
 * entrance, exit, and space
 */
protected boolean invalidMazeCharacters(CharSequence cs) {

    p = Pattern.compile("^W+R|X|\\s*W+$");
    m = p.matcher(cs);
    if (!m.matches()) {
        return true;
    }
    return false;
}
4

2 回答 2

2
CharSequence cs = new String(line.toString());

在这里,您正在制作数组外观的字符串。类似“[C@333cb1eb”

将“toString()”放在该行上,您可能会更近一步。

于 2012-03-10T00:22:08.093 回答
1

您似乎误解了括号符号的含义[...]。它创建了一个字符类,这意味着它只匹配一个字符,可以是.... (有许多特殊语法可以更好地控制它可以匹配的字符,但这是基本思想。)例如,你的这个模式:

^W[W{10,20}R{1}]W$

要求字符串长度恰好为三个字符;第一个字符是 a W; 第二个字符是 a W, a {, a 1, a 0, a comma, a 2, a }, or an R; 第三个字符是另一个W

在那种情况下,你真正应该写的只是:

^W+RW+$

确保字符串完全由Ws 组成,除了 one R,并且它以Ws 开头和结尾。(您实际上不需要担心Ws 的数量,因为此时您已经确保字符串的长度正好为 22 个字符。)


编辑补充:顺便说一句,你有单元测试真是太棒了,但是你的方法有一个如此狭窄的接口——它需要一个字符串,执行一堆验证,然后只是返回true或者false——它真的不适合单元——测试。如果您的单元测试发现该方法错误地返回false给定字符串,那么您将几乎没有关于哪里出了问题的信息,因此对于查找问题没有多大帮助。(您自己已经看到了。)更糟糕的是,如果您的单元测试发现该方法正确返回false给定字符串,您仍然无法确定它是否false 出于正确的原因返回. 因此,它对确保您的代码正确无济于事。有几种方法可以解决这个问题:

  • 您可以为每个验证规则创建一个单独的方法,然后checkFileValidLine调用这些方法中的每一个来验证该行。这样,您可以对这些方法进行单元测试(除了粗略的单元测试checkFileValidLine以确保它正在调用这些方法并返回正确的结果)。(这是我推荐的方法。)
  • 您可以创建一个辅助方法来执行与当前方法相同的验证,但不是返回true有效字符串和false无效字符串,而是可以返回null有效字符串和(例如)无效字符串"line.length != 22"。然后,您的单元测试可以确保触发了正确的验证规则,而如果该辅助方法返回,则checkFileValidLine可以返回。truenull
于 2012-03-10T00:17:52.993 回答