在Eiffel中,奇怪的“Check_VIOLATION”测试用例失败了

时间:2016-03-17 02:09:58

标签: eiffel

下图中的主要问题是,当添加“检查结果结束”语句时,它会自动失败并在调试器中显示“CHECK_VIOLATION”错误。

此外,HASH_TABLE不会存储给它的所有项目,但我通过切换HASH_TABLE [G,INTEGER]而不是使用当前的HASH_TABLE [INTEGER,G]来修复它

我的主要问题是,为什么只要看到“检查结果结束”语句,它总是会抛出Check_violation并失败?也许HAS [...]功能不好?

目前任何带有“检查结果结束”的测试用例功能都会将其设为false并抛出CHECK_VILOATION

enter image description here

代码:

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

1 个答案:

答案 0 :(得分:1)

最有可能ADT_BAG代表多重集(也称为包)的抽象,它允许保留项目并告知有多少项目与给定项目相同(不同于一组,其中最多可能存在一个项目) )。如果是这样,使用HASH_TABLE [INTEGER, G]作为存储是正确的。然后它的键是元素,它的项是元素数字。

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

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

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

  1. 检查是否有具有给定密钥的项目。
  2. 如果没有,则添加具有给定计数的新元素。
  3. 否则,将当前元素数替换为当前元素数和给定元素数之和。
  4. 为简单起见,初始化过程将使用此功能添加新项目,而不是直接在哈希表中存储项目以正确处理重复项目。