diff options
Diffstat (limited to 'spec/ruby/core/class/inherited_spec.rb')
| -rw-r--r-- | spec/ruby/core/class/inherited_spec.rb | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/spec/ruby/core/class/inherited_spec.rb b/spec/ruby/core/class/inherited_spec.rb new file mode 100644 index 0000000000..c9acc740a1 --- /dev/null +++ b/spec/ruby/core/class/inherited_spec.rb @@ -0,0 +1,118 @@ +require_relative '../../spec_helper' +require_relative 'fixtures/classes' + +describe "Class.inherited" do + + before :each do + ScratchPad.record nil + end + + it "is invoked with the child Class when self is subclassed" do + begin + top = Class.new do + def self.inherited(cls) + $child_class = cls + end + end + + child = Class.new(top) + $child_class.should == child + + other_child = Class.new(top) + $child_class.should == other_child + ensure + $child_class = nil + end + end + + it "is invoked only once per subclass" do + expected = [ + [CoreClassSpecs::Inherited::A, CoreClassSpecs::Inherited::B], + [CoreClassSpecs::Inherited::B, CoreClassSpecs::Inherited::C], + ] + + CoreClassSpecs::Inherited::A::SUBCLASSES.should == expected + end + + it "is called when marked as a private class method" do + a = Class.new do + def self.inherited(klass) + ScratchPad.record klass + end + end + a.private_class_method :inherited + ScratchPad.recorded.should == nil + b = Class.new(a) + ScratchPad.recorded.should == b + end + + it "is called when marked as a protected class method" do + a = Class.new + class << a + def inherited(klass) + ScratchPad.record klass + end + protected :inherited + end + ScratchPad.recorded.should == nil + b = Class.new(a) + ScratchPad.recorded.should == b + end + + it "is called when marked as a public class method" do + a = Class.new do + def self.inherited(klass) + ScratchPad.record klass + end + end + a.public_class_method :inherited + ScratchPad.recorded.should == nil + b = Class.new(a) + ScratchPad.recorded.should == b + end + + it "is called by super from a method provided by an included module" do + ScratchPad.recorded.should == nil + e = Class.new(CoreClassSpecs::F) + ScratchPad.recorded.should == e + end + + it "is called by super even when marked as a private class method" do + ScratchPad.recorded.should == nil + CoreClassSpecs::H.private_class_method :inherited + i = Class.new(CoreClassSpecs::H) + ScratchPad.recorded.should == i + end + + it "will be invoked by child class regardless of visibility" do + top = Class.new do + class << self + def inherited(cls); end + end + end + + class << top; private :inherited; end + -> { Class.new(top) }.should_not.raise + + class << top; protected :inherited; end + -> { Class.new(top) }.should_not.raise + end + + it "if the subclass is assigned to a constant, it is all set" do + ScratchPad.record [] + + parent = Class.new do + def self.inherited(subclass) + ScratchPad << defined?(self::C) + ScratchPad << const_defined?(:C) + ScratchPad << constants + ScratchPad << const_get(:C) + ScratchPad << subclass.name.match?(/\A#<Class:0x\w+>::C\z/) + end + end + + class parent::C < parent; end + + ScratchPad.recorded.should == ["constant", true, [:C], parent::C, true] + end +end |
