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