奇数 "Check_VIOLATION" 个失败的埃菲尔测试用例

Odd "Check_VIOLATION" failed test case in Eiffel

下图中的主要问题是,当添加 "check Result end" 语句时,它会自动失败并在调试器中显示 "CHECK_VIOLATION" 错误。

此外,HASH_TABLE 不会存储所有提供给它的项目,但我通过切换 HASH_TABLE[G, INTEGER] 而不是使用当前的 HASH_TABLE[INTEGER] 来解决这个问题, G]

我的主要问题是为什么它总是抛出 Check_violation 并在看到 "check result end" 语句时失败?也许 HAS[...] 功能不好?

目前任何具有 "check result end" 的测试用例特性都会使其为假并抛出 CHECK_VILOATION

代码:

class
  MY_BAG[G -> {HASHABLE, COMPARABLE}]
inherit
  ADT_BAG[G]

create
  make_empty, make_from_tupled_array

convert
   make_from_tupled_array ({ARRAY [TUPLE [G, INTEGER]]})

feature{NONE} -- creation

    make_empty
     do
        create table.make(1)
     end

    make_from_tupled_array (a_array: ARRAY [TUPLE [x: G; y: INTEGER]])
     require else
        non_empty: a_array.count >= 0
        nonnegative: is_nonnegative(a_array)
      do

        create table.make(a_array.count)

        across a_array as a
            loop
                 table.force (a.item.y, a.item.x)

            end
      end

feature -- attributes

  table: HASH_TABLE[INTEGER, G]
  counter: INTEGER

测试代码:

  t6: BOOLEAN
    local
        bag: MY_BAG [STRING]
    do
        comment ("t6:repeated elements in contruction")
        bag := <<["foo",4], ["bar",3], ["foo",2], ["bar",0]>> -- test passes
        Result := bag ["foo"] = 5 -- test passes
        check Result end  -- test fails (really weird but as soon as check statement comes it fails)
        Result := bag ["bar"] = 3
        check Result end
        Result := bag ["baz"] = 0


    end

很可能 ADT_BAG 代表多重集(也称为包)的抽象,它允许保留项目并告诉那里有多少项目等于给定的项目(不像集合,在大多数项目可能存在)。如果是这样,用HASH_TABLE [INTEGER, G]作为存储是正确的。然后它的键是元素,它的项目是元素数字。

所以,如果我们多次添加同一个元素,它的计数应该增加。在初始化行中,我们添加了 "foo" 的 4 个元素、"bar" 的 3 个元素、"foo" 的 2 个元素,以及 "bar" 的 0 个元素。因此,我们应该有一个包含 6 个 "foo" 元素和 3 个 "bar" 元素的包。也没有元素 "baz"

根据此分析,要么初始化不正确("foo" 的数字应该不同),要么应该对 6 而不是 5 进行比较。

至于 class MY_BAG 的实现,我们的想法是拥有一个功能 add(或在 ADT_BAG 的接口中指定的任何名称)

  1. 检查是否有具有给定键的项目。
  2. 如果有 none,添加具有给定计数的新元素。
  3. 否则,将当前元素数替换为当前元素数与给定元素数之和。

为简单起见,初始化过程将使用此功能添加新项目而不是将项目直接存储在散列中 table 以正确处理重复的项目。