2017-10-10 66 views
0

我发现一个没有意义的案例。深层复制在工作台系统中总是失败

我有以下特点:

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中的地址在同一个索引处是不同的。

所以当我调试这段代码时,它说结果跨循环完成后设置为false。

问题是,“检查不结果”不会使false为真。

如果我运行工作台系统,它说以下内容: enter image description here

我不知道为什么。在“check not Result”语句中的“Result”之前的“not”应该使其全部检查为真,因此它应该在工作台系统中表示“PASSED”,但是它失败。

这是为什么?

回答

0

您的推理是正确的,写入的测试查询应返回False。很可能,只要查询返回False,系统就会报告FAILED。所以,需要做的是修复查询本身。

该数组的项目被克隆,因此循环中使用的相等=为所有元素提供False。要从循环中获取True,必须使用不同的相等运算符:~。它比较对象而不是引用。在改变之后,查询给出True并且测试应该通过。

另一种方法是用一个呼叫来代替相等操作到特征is_deep_equal

imp [j.item].is_deep_equal (old_imp [j.item]) 

不同于使用用户定义的功能is_equal比较对象操作~ - 串中的示例 - is_deep_equal通过遍历整个对象树来执行“深度”平等测试。在这种情况下,测试也应该通过。但在实践中很少使用深层平等。