summaryrefslogtreecommitdiff
path: root/spec/ruby/optional/capi/finalizer_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/ruby/optional/capi/finalizer_spec.rb')
-rw-r--r--spec/ruby/optional/capi/finalizer_spec.rb40
1 files changed, 40 insertions, 0 deletions
diff --git a/spec/ruby/optional/capi/finalizer_spec.rb b/spec/ruby/optional/capi/finalizer_spec.rb
new file mode 100644
index 0000000000..162e8ea693
--- /dev/null
+++ b/spec/ruby/optional/capi/finalizer_spec.rb
@@ -0,0 +1,40 @@
+require_relative "spec_helper"
+
+extension_path = load_extension("finalizer")
+
+describe "CApiFinalizerSpecs" do
+ before :each do
+ @s = CApiFinalizerSpecs.new
+ end
+
+ describe "rb_define_finalizer" do
+ it "defines a finalizer on the object" do
+ code = <<~RUBY
+ require #{extension_path.dump}
+
+ obj = Object.new
+ finalizer = Proc.new { puts "finalizer run" }
+ CApiFinalizerSpecs.new.rb_define_finalizer(obj, finalizer)
+ RUBY
+
+ ruby_exe(code).should == "finalizer run\n"
+ end
+ end
+
+ describe "rb_undefine_finalizer" do
+ ruby_bug "#20981", "3.4.0"..."3.4.2" do
+ it "removes finalizers from the object" do
+ code = <<~RUBY
+ require #{extension_path.dump}
+
+ obj = Object.new
+ finalizer = Proc.new { puts "finalizer run" }
+ ObjectSpace.define_finalizer(obj, finalizer)
+ CApiFinalizerSpecs.new.rb_undefine_finalizer(obj)
+ RUBY
+
+ ruby_exe(code).should.empty?
+ end
+ end
+ end
+end