summaryrefslogtreecommitdiff
path: root/jni/ruby/test/test_weakref.rb
diff options
context:
space:
mode:
Diffstat (limited to 'jni/ruby/test/test_weakref.rb')
-rw-r--r--jni/ruby/test/test_weakref.rb71
1 files changed, 71 insertions, 0 deletions
diff --git a/jni/ruby/test/test_weakref.rb b/jni/ruby/test/test_weakref.rb
new file mode 100644
index 0000000..d21b431
--- /dev/null
+++ b/jni/ruby/test/test_weakref.rb
@@ -0,0 +1,71 @@
+require 'test/unit'
+require 'weakref'
+
+class TestWeakRef < Test::Unit::TestCase
+ def make_weakref(level = 10)
+ if level > 0
+ make_weakref(level - 1)
+ else
+ WeakRef.new(Object.new)
+ end
+ end
+
+ def test_ref
+ obj = Object.new
+ weak = WeakRef.new(obj)
+ assert_equal(obj.to_s, weak.to_s)
+ assert_predicate(weak, :weakref_alive?)
+ end
+
+ def test_recycled
+ weaks = []
+ weak = nil
+ 100.times do
+ weaks << make_weakref
+ ObjectSpace.garbage_collect
+ ObjectSpace.garbage_collect
+ break if weak = weaks.find {|w| !w.weakref_alive?}
+ end
+ assert_raise(WeakRef::RefError) {weak.to_s}
+ assert_not_predicate(weak, :weakref_alive?)
+ end
+
+ def test_not_reference_different_object
+ bug7304 = '[ruby-core:49044]'
+ weakrefs = []
+ 3.times do
+ obj = Object.new
+ def obj.foo; end
+ weakrefs << WeakRef.new(obj)
+ ObjectSpace.garbage_collect
+ end
+ assert_nothing_raised(NoMethodError, bug7304) {
+ weakrefs.each do |weak|
+ begin
+ weak.foo
+ rescue WeakRef::RefError
+ end
+ end
+ }
+ end
+
+ def test_weakref_finalize
+ bug7304 = '[ruby-core:49044]'
+ assert_normal_exit %q{
+ require 'weakref'
+ obj = Object.new
+ 3.times do
+ WeakRef.new(obj)
+ ObjectSpace.garbage_collect
+ end
+ }, bug7304
+ end
+
+ def test_repeated_object_leak
+ bug10537 = '[ruby-core:66428]'
+ assert_no_memory_leak(%w(-rweakref), '', <<-'end;', bug10537, timeout: 60)
+ a = Object.new
+ 150_000.times { WeakRef.new(a) }
+ end;
+ end
+end