summaryrefslogtreecommitdiff
path: root/test/ruby/test_weakmap.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/ruby/test_weakmap.rb')
-rw-r--r--test/ruby/test_weakmap.rb91
1 files changed, 77 insertions, 14 deletions
diff --git a/test/ruby/test_weakmap.rb b/test/ruby/test_weakmap.rb
index 15463bb030..5ca6b0fbdd 100644
--- a/test/ruby/test_weakmap.rb
+++ b/test/ruby/test_weakmap.rb
@@ -16,29 +16,50 @@ class TestWeakMap < Test::Unit::TestCase
def test_aset_const
x = Object.new
- assert_raise(ArgumentError) {@wm[true] = x}
- assert_raise(ArgumentError) {@wm[false] = x}
- assert_raise(ArgumentError) {@wm[nil] = x}
- assert_raise(ArgumentError) {@wm[42] = x}
- assert_raise(ArgumentError) {@wm[:foo] = x}
- assert_raise(ArgumentError) {@wm[x] = true}
- assert_raise(ArgumentError) {@wm[x] = false}
- assert_raise(ArgumentError) {@wm[x] = nil}
- assert_raise(ArgumentError) {@wm[x] = 42}
- assert_raise(ArgumentError) {@wm[x] = :foo}
+ @wm[true] = x
+ assert_same(x, @wm[true])
+ @wm[false] = x
+ assert_same(x, @wm[false])
+ @wm[nil] = x
+ assert_same(x, @wm[nil])
+ @wm[42] = x
+ assert_same(x, @wm[42])
+ @wm[:foo] = x
+ assert_same(x, @wm[:foo])
+
+ @wm[x] = true
+ assert_same(true, @wm[x])
+ @wm[x] = false
+ assert_same(false, @wm[x])
+ @wm[x] = nil
+ assert_same(nil, @wm[x])
+ @wm[x] = 42
+ assert_same(42, @wm[x])
+ @wm[x] = :foo
+ assert_same(:foo, @wm[x])
end
- def test_include?
- m = __callee__[/test_(.*)/, 1]
- k = "foo"
+ def assert_weak_include(m, k, n = 100)
+ if n > 0
+ return assert_weak_include(m, k, n-1)
+ end
1.times do
x = Object.new
@wm[k] = x
assert_send([@wm, m, k])
assert_not_send([@wm, m, "FOO".downcase])
- x = nil
+ x = Object.new
+ end
+ end
+
+ def test_include?
+ m = __callee__[/test_(.*)/, 1]
+ k = "foo"
+ 1.times do
+ assert_weak_include(m, k)
end
GC.start
+ skip('TODO: failure introduced from r60440')
assert_not_send([@wm, m, k])
end
alias test_member? test_include?
@@ -52,6 +73,15 @@ class TestWeakMap < Test::Unit::TestCase
@wm.inspect)
end
+ def test_inspect_garbage
+ 1000.times do |i|
+ @wm[i] = Object.new
+ @wm.inspect
+ end
+ assert_match(/\A\#<#{@wm.class.name}:[^:]++:(?:\s\d+\s=>\s\#<(?:Object|collected):[^:<>]*+>(?:,|>\z))+/,
+ @wm.inspect)
+ end
+
def test_each
m = __callee__[/test_(.*)/, 1]
x1 = Object.new
@@ -131,4 +161,37 @@ class TestWeakMap < Test::Unit::TestCase
assert_equal(2, @wm.__send__(m))
end
alias test_length test_size
+
+ def test_frozen_object
+ o = Object.new.freeze
+ assert_nothing_raised(FrozenError) {@wm[o] = 'foo'}
+ assert_nothing_raised(FrozenError) {@wm['foo'] = o}
+ end
+
+ def test_no_memory_leak
+ assert_no_memory_leak([], '', "#{<<~"begin;"}\n#{<<~'end;'}", "[Bug #19398]", rss: true, limit: 1.5, timeout: 60)
+ begin;
+ 1_000_000.times do
+ ObjectSpace::WeakMap.new
+ end
+ end;
+ end
+
+ def test_compaction_bug_19529
+ obj = Object.new
+ 100.times do |i|
+ GC.compact
+ @wm[i] = obj
+ end
+
+ assert_separately(%w(--disable-gems), <<-'end;')
+ wm = ObjectSpace::WeakMap.new
+ obj = Object.new
+ 100.times do
+ wm[Object.new] = obj
+ GC.start
+ end
+ GC.compact
+ end;
+ end
end