summaryrefslogtreecommitdiff
path: root/spec/ruby
diff options
context:
space:
mode:
Diffstat (limited to 'spec/ruby')
-rw-r--r--spec/ruby/core/class/fixtures/callback_order.rb21
-rw-r--r--spec/ruby/core/class/inherited_spec.rb13
-rw-r--r--spec/ruby/optional/capi/class_spec.rb11
-rw-r--r--spec/ruby/optional/capi/fixtures/class.rb10
4 files changed, 55 insertions, 0 deletions
diff --git a/spec/ruby/core/class/fixtures/callback_order.rb b/spec/ruby/core/class/fixtures/callback_order.rb
new file mode 100644
index 0000000000..e82e0e6c19
--- /dev/null
+++ b/spec/ruby/core/class/fixtures/callback_order.rb
@@ -0,0 +1,21 @@
+module CoreClassSpecs
+ module Callbacks
+ class Base
+ def self.inherited(subclass)
+ subclass.const_set(:INHERITED_NAME, subclass.name)
+ ORDER << [:inherited, subclass, eval("defined?(#{subclass.name})")]
+ super
+ end
+ end
+
+ ORDER = []
+
+ def self.const_added(const_name)
+ ORDER << [:const_added, const_name, eval("defined?(#{const_name})")]
+ super
+ end
+
+ class Child < Base
+ end
+ end
+end
diff --git a/spec/ruby/core/class/inherited_spec.rb b/spec/ruby/core/class/inherited_spec.rb
index 8ef8bb8c35..3868ba4089 100644
--- a/spec/ruby/core/class/inherited_spec.rb
+++ b/spec/ruby/core/class/inherited_spec.rb
@@ -1,5 +1,6 @@
require_relative '../../spec_helper'
require_relative 'fixtures/classes'
+require_relative 'fixtures/callback_order'
describe "Class.inherited" do
@@ -98,4 +99,16 @@ describe "Class.inherited" do
-> { Class.new(top) }.should_not raise_error
end
+ it "is invoked after the class is named when using class definition syntax" do
+ CoreClassSpecs::Callbacks::Child::INHERITED_NAME.should == "CoreClassSpecs::Callbacks::Child"
+ end
+
+ ruby_version_is "3.5" do # https://bugs.ruby-lang.org/issues/21143
+ it "is invoked before `const_added`" do
+ CoreClassSpecs::Callbacks::ORDER.should == [
+ [:inherited, CoreClassSpecs::Callbacks::Child, nil],
+ [:const_added, :Child, "constant"],
+ ]
+ end
+ end
end
diff --git a/spec/ruby/optional/capi/class_spec.rb b/spec/ruby/optional/capi/class_spec.rb
index a231245ebe..6d53b62b75 100644
--- a/spec/ruby/optional/capi/class_spec.rb
+++ b/spec/ruby/optional/capi/class_spec.rb
@@ -383,6 +383,17 @@ describe "C-API Class function" do
CApiClassSpecs.const_get(cls.name)
}.should raise_error(NameError, /wrong constant name/)
end
+
+ ruby_version_is "3.5" do
+ it "calls .inherited before .const_added" do
+ ScratchPad.record([])
+ @s.rb_define_class_id_under(CApiClassSpecs::Callbacks, :Subclass, CApiClassSpecs::Callbacks)
+ ScratchPad.recorded.should == [
+ [:inherited, "CApiClassSpecs::Callbacks::Subclass"],
+ [:const_added, :Subclass],
+ ]
+ end
+ end
end
describe "rb_define_class_id_under" do
diff --git a/spec/ruby/optional/capi/fixtures/class.rb b/spec/ruby/optional/capi/fixtures/class.rb
index b463e3b4c3..a738f2fd0f 100644
--- a/spec/ruby/optional/capi/fixtures/class.rb
+++ b/spec/ruby/optional/capi/fixtures/class.rb
@@ -101,4 +101,14 @@ class CApiClassSpecs
module M
end
end
+
+ class Callbacks
+ def self.inherited(child)
+ ScratchPad << [:inherited, child.name]
+ end
+
+ def self.const_added(const_name)
+ ScratchPad << [:const_added, const_name]
+ end
+ end
end