aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/test/core_ext/object_and_class_ext_test.rb
blob: 29b2f2fc8b5ea61c29872821c7aab2527136b141 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
require 'test/unit'
require File.dirname(__FILE__) + '/../../lib/active_support/core_ext/object_and_class'

class ClassA; end
class ClassB < ClassA; end
class ClassC < ClassB; end
class ClassD < ClassA; end
class RemoveSubsTestClass; end
class RemoveSubsBaseClass
  def self.add_ivar
    @ivar = RemoveSubsTestClass.new
  end
end
class RemoveSubsSubClass < RemoveSubsBaseClass; end
class RemoveSubsTestClass2; end
class RemoveSubsBaseClass2
  def self.add_ivar
    @ivar = RemoveSubsTestClass2.new
  end
end
class RemoveSubsSubClass2 < RemoveSubsBaseClass2; end
class RemoveSubsTestClass3; end
class RemoveSubsBaseClass3
  def self.add_ivar
    @ivar = RemoveSubsTestClass3.new
  end
end
class RemoveSubsSubClass3 < RemoveSubsBaseClass3; end

class ClassExtTest < Test::Unit::TestCase
  def test_methods
    assert defined?(ClassB)
    assert defined?(ClassC)
    assert defined?(ClassD)

    ClassA.remove_subclasses

    assert !defined?(ClassB)
    assert !defined?(ClassC)
    assert !defined?(ClassD)
  end
end

class ObjectTests < Test::Unit::TestCase
  def test_suppress_re_raises
    assert_raises(LoadError) { suppress(ArgumentError) {raise LoadError} }
  end
  def test_suppress_supresses
    suppress(ArgumentError) { raise ArgumentError }
    suppress(LoadError) { raise LoadError }
    suppress(LoadError, ArgumentError) { raise LoadError }
    suppress(LoadError, ArgumentError) { raise ArgumentError }
  end
  
  def test_remove_subclasses_of_unsets_ivars
    r = RemoveSubsSubClass.new
    RemoveSubsSubClass.add_ivar
    RemoveSubsBaseClass.remove_subclasses

    GC.start
    ObjectSpace.each_object do |o|
      flunk("ObjectSpace still contains RemoveSubsTestClass") if o.class == RemoveSubsTestClass
    end
  end

  def test_remove_subclasses_of_multiple_classes_unsets_ivars
    r2 = RemoveSubsSubClass2.new
    RemoveSubsSubClass2.add_ivar
    r3 = RemoveSubsSubClass3.new
    RemoveSubsSubClass3.add_ivar
    
    Object.remove_subclasses_of(RemoveSubsBaseClass2, RemoveSubsBaseClass3)

    GC.start
    ObjectSpace.each_object do |o|
      flunk("ObjectSpace still contains RemoveSubsTestClass") if o.class == RemoveSubsTestClass
    end
  end
end