1require 'test/unit' 2require 'weakref' 3require_relative './ruby/envutil' 4 5class TestWeakRef < Test::Unit::TestCase 6 def make_weakref(level = 10) 7 obj = Object.new 8 str = obj.to_s 9 level.times {obj = WeakRef.new(obj)} 10 return WeakRef.new(obj), str 11 end 12 13 def test_ref 14 weak, str = make_weakref 15 assert_equal(str, weak.to_s) 16 end 17 18 def test_recycled 19 weak, str = make_weakref 20 assert_nothing_raised(WeakRef::RefError) {weak.to_s} 21 ObjectSpace.garbage_collect 22 ObjectSpace.garbage_collect 23 assert_raise(WeakRef::RefError) {weak.to_s} 24 end 25 26 def test_not_reference_different_object 27 bug7304 = '[ruby-core:49044]' 28 weakrefs = [] 29 3.times do 30 obj = Object.new 31 def obj.foo; end 32 weakrefs << WeakRef.new(obj) 33 ObjectSpace.garbage_collect 34 end 35 assert_nothing_raised(NoMethodError, bug7304) { 36 weakrefs.each do |weak| 37 begin 38 weak.foo 39 rescue WeakRef::RefError 40 end 41 end 42 } 43 end 44 45 def test_weakref_finalize 46 bug7304 = '[ruby-core:49044]' 47 assert_normal_exit %q{ 48 require 'weakref' 49 obj = Object.new 50 3.times do 51 WeakRef.new(obj) 52 ObjectSpace.garbage_collect 53 end 54 }, bug7304 55 end 56end 57