summaryrefslogtreecommitdiff
path: root/test/ruby
diff options
context:
space:
mode:
authorJean Boussier <byroot@ruby-lang.org>2023-03-30 16:23:14 +0200
committerJean Boussier <jean.boussier@gmail.com>2023-04-15 16:29:46 +0200
commit52449b5b75068872ce568ed00c4c7fb8e6c28072 (patch)
tree15c4ee12b472b863609d04344473986a79343608 /test/ruby
parent4dc2e5a850e6b44e715ca8fa31d21dddf5ec1491 (diff)
downloadruby-52449b5b75068872ce568ed00c4c7fb8e6c28072.tar.gz
Implement ObjectSpace::WeakMap#delete and ObjectSpace::WeakKeyMap#delete
[Feature #19561] It's useful to be able to remove references from weak maps.
Diffstat (limited to 'test/ruby')
-rw-r--r--test/ruby/test_weakkeymap.rb (renamed from test/ruby/weakkeymap.rb)21
-rw-r--r--test/ruby/test_weakmap.rb16
2 files changed, 33 insertions, 4 deletions
diff --git a/test/ruby/weakkeymap.rb b/test/ruby/test_weakkeymap.rb
index 20bfe5ec2c..5df53749ca 100644
--- a/test/ruby/weakkeymap.rb
+++ b/test/ruby/test_weakkeymap.rb
@@ -33,11 +33,24 @@ class TestWeakKeyMap < Test::Unit::TestCase
end
def test_key?
- 1.times do
- assert_weak_include(:key?, "foo")
+ assert_weak_include(:key?, "foo")
+ assert_not_send([@wm, :key?, "bar"])
+ end
+
+ def test_delete
+ k1 = "foo"
+ x1 = Object.new
+ @wm[k1] = x1
+ assert_equal x1, @wm[k1]
+ assert_equal x1, @wm.delete(k1)
+ assert_nil @wm[k1]
+ assert_nil @wm.delete(k1)
+
+ fallback = @wm.delete(k1) do |key|
+ assert_equal k1, key
+ 42
end
- GC.start
- assert_not_send([@wm, :key?, "FOO".downcase])
+ assert_equal 42, fallback
end
def test_clear
diff --git a/test/ruby/test_weakmap.rb b/test/ruby/test_weakmap.rb
index 7fc956dfae..f9358e11f3 100644
--- a/test/ruby/test_weakmap.rb
+++ b/test/ruby/test_weakmap.rb
@@ -82,6 +82,22 @@ class TestWeakMap < Test::Unit::TestCase
@wm.inspect)
end
+ def test_delete
+ k1 = "foo"
+ x1 = Object.new
+ @wm[k1] = x1
+ assert_equal x1, @wm[k1]
+ assert_equal x1, @wm.delete(k1)
+ assert_nil @wm[k1]
+ assert_nil @wm.delete(k1)
+
+ fallback = @wm.delete(k1) do |key|
+ assert_equal k1, key
+ 42
+ end
+ assert_equal 42, fallback
+ end
+
def test_each
m = __callee__[/test_(.*)/, 1]
x1 = Object.new