2017-10-10 9 views
0

私は理にかなっていない1つのケースを発見しました。私は機能には、次のしているディープコピーは常にワークベンチシステムで失敗します

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のアドレスを意味し、異なるだけでなく、両方2でその属性も別のアドレスを参照することold_impです。

したがって、この結果 "across" afterループでは、同じインデックスのimpとold_impのアドレスが異なるため、falseにする必要があります。

私はこのコードをデバッグするとき、結果がループを越えて終了した後に偽に設定されていると言います。

問題は「結果をチェックしない」が真に偽にならないことです。

私はワークベンチシステムを実行する場合、それは次の言葉: enter image description here

私は理由を知りません。 "check not Result"ステートメントの "Result"の前に "not"を指定すると、全体的なチェックが真であるため、Workbenchシステムで "PASSED"と表示されますが、失敗します。

なぜですか?

答えて

0

あなたの推論は正しいですし、書かれたテストクエリはFalseを返すべきです。おそらく、クエリがFalseを返すとすぐに、システムはFAILEDを報告します。したがって、実行する必要があるのは、クエリ自体を修正することです。

配列の項目が複製されているため、ループ内で使用される等価=はすべての要素に対してFalseとなります。ループからTrueを取得するには、異なる等価演算子を使用する必要があります(~)。参照ではなくオブジェクトを比較します。その変更後、クエリはTrueとなり、テストは合格になります。

代替が機能is_deep_equalへの呼び出しで等価演算子を置き換えるために、次のようになります - 例では、文字列 - オブジェクトを比較するために、ユーザー定義の機能is_equalを使用してオペレータ~とは異なり

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

is_deep_equalオブジェクトツリー全体をトラバースすることによって "深い"等価性テストを実行します。この場合もテストは合格になります。しかし、実際には深い平等はめったに使われません。

関連する問題