diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/objspace/test_objspace.rb | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/test/objspace/test_objspace.rb b/test/objspace/test_objspace.rb index 329e418008..8845b83c4e 100644 --- a/test/objspace/test_objspace.rb +++ b/test/objspace/test_objspace.rb @@ -285,4 +285,55 @@ class TestObjSpace < Test::Unit::TestCase assert_not_match /"fd":/, output end end + + def traverse_classes klass + h = {} + while klass && !h.has_key?(klass) + h[klass] = true + klass = ObjectSpace.internal_class_of(klass) + end + end + + def test_internal_class_of + i = 0 + ObjectSpace.each_object{|o| + traverse_classes ObjectSpace.internal_class_of(o) + i += 1 + } + assert_operator i, :>, 0 + end + + def traverse_super_classes klass + while klass + klass = ObjectSpace.internal_super_of(klass) + end + end + + def all_super_classes klass + klasses = [] + while klass + klasses << klass + klass = ObjectSpace.internal_super_of(klass) + end + klasses + end + + def test_internal_super_of + klasses = all_super_classes(String) + String.ancestors.each{|k| + case k + when Class + assert_equal(true, klasses.include?(k), k.inspect) + when Module + assert_equal(false, klasses.include?(k), k.inspect) # Internal object (T_ICLASS) + end + } + + i = 0 + ObjectSpace.each_object(Module){|o| + traverse_super_classes ObjectSpace.internal_super_of(o) + i += 1 + } + assert_operator i, :>, 0 + end end |