Глубокая копия всегда терпит неудачу в системе рабочей среды

Я нашел один случай, который не имеет смысла.

У меня есть следующая функция:

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 с одним и тем же индексом разные.

Поэтому, когда я отлаживаю этот код, он говорит, что результат установлен как ложный после завершения цикла.

Проблема в том, что «проверить не результат» не превращает ложь в истину.

Если я запускаю систему рабочей среды, она говорит следующее: введите здесь описание изображения

Я не знаю, почему. «not» перед «Result» в выражении «check not Result» должно сделать всю проверку истинной, поэтому в системе рабочей среды должно быть указано «PASSED», но это не удается.

почему это?


person Kam    schedule 10.10.2017    source источник


Ответы (1)


Ваши рассуждения верны, и тестовый запрос, как написано, должен возвращать False. Скорее всего, система сообщает FAILED, как только запрос возвращает False. Итак, что нужно сделать, так это исправить сам запрос.

Элементы массива клонируются, поэтому используемое в цикле равенство = дает False для всех элементов. Чтобы получить True из цикла, необходимо использовать другой оператор равенства: ~. Он сравнивает объекты, а не ссылки. После этого изменения запрос дает True и тест должен пройти.

Альтернативой может быть замена оператора равенства вызовом функции is_deep_equal:

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

В отличие от оператора ~, который использует определяемую пользователем функцию is_equal для сравнения объектов — строк в примере — is_deep_equal выполняет «глубокую» проверку на равенство, обходя все дерево объектов. Тест должен пройти и в этом случае. Но на практике глубокое равенство используется редко.

person Alexander Kogtenkov    schedule 11.10.2017