1require 'test/unit'
2require "-test-/st/update"
3
4class Bug::StTable
5  class Test_Update < Test::Unit::TestCase
6    def setup
7      @tbl = Bug::StTable.new
8      @tbl[:a] = 1
9      @tbl[:b] = 2
10    end
11
12    def test_notfound
13      assert_equal(false, @tbl.st_update(:c) {42})
14      assert_equal({a: 1, b: 2, c: 42}, @tbl)
15    end
16
17    def test_continue
18      args = nil
19      assert_equal(true, @tbl.st_update(:a) {|*x| args = x; false})
20      assert_equal({a: 1, b: 2}, @tbl, :a)
21      assert_equal([:a, 1], args)
22    end
23
24    def test_delete
25      args = nil
26      assert_equal(true, @tbl.st_update(:a) {|*x| args = x; nil})
27      assert_equal({b: 2}, @tbl, :a)
28      assert_equal([:a, 1], args)
29    end
30
31    def test_update
32      args = nil
33      assert_equal(true, @tbl.st_update(:a) {|*x| args = x; 3})
34      assert_equal({a: 3, b: 2}, @tbl, :a)
35      assert_equal([:a, 1], args)
36    end
37
38    def test_pass_objects_in_st_table
39      bug7330 = '[ruby-core:49220]'
40      key = "abc".freeze
41      value = "def"
42      @tbl[key] = value
43      @tbl.st_update("abc") {|*args|
44        assert_same(key, args[0], bug7330)
45        assert_same(value, args[1], bug7330)
46        nil
47      }
48    end
49  end
50end
51