我发现了一个没有意义的案例。
我有以下功能:
test_array_deep_copy: BOOLEAN
local
imp, old_imp: ARRAY[STRING]
do
comment("Test of a deep copy.")
create {ARRAY[STRING]} imp.make_empty
imp.force ("Alan", 1)
imp.force ("Mark", 2)
imp.force ("Tom", 3)
old_imp := imp.deep_twin
imp[2] := "Jim"
Result :=
across
1 |..| imp.count as j
all
j.item /= 2 implies imp [j.item] = old_imp [j.item]
end
check not Result end
end
由于它是深拷贝,这意味着imp和old_imp的地址不同,以及它们两者中的属性也指不同的地址。
所以,这"结果"在循环之后,它应该是假的,因为在相同索引处的imp和old_imp中的地址是不同的。
因此,当我调试此代码时,它表示在完成循环后,Result被设置为false。
问题是"检查不结果"并不是假的。
我不知道为什么。 "不"之前"结果"在"检查不结果"声明应该使整个检查成立,所以它应该说" PASSED"在workbench系统中,但它失败了。
为什么会这样?
答案 0 :(得分:0)
您的推理是正确的,所写的测试查询应返回False
。最有可能的是,只要查询返回FAILED
,系统就会报告False
。因此,需要做的是修复查询本身。
克隆了数组的项目,因此循环中使用的相等=
为所有元素提供了False
。要从循环中获取True
,必须使用不同的相等运算符:~
。它比较对象而不是引用。在更改之后,查询会给出True
,测试应该通过。
另一种方法是通过调用功能is_deep_equal
来替换相等运算符:
imp [j.item].is_deep_equal (old_imp [j.item])
与使用用户定义的特性~
来比较对象的运算符is_equal
不同 - 示例中的字符串 - is_deep_equal
通过遍历整个对象树来执行“深度”相等性测试。在这种情况下,测试也应该通过。但在实践中很少使用深度平等。