From 3e76ae901620a0967bb92c3bf84ad8f97862e972 Mon Sep 17 00:00:00 2001 From: Laurent Sansonetti Date: Tue, 16 Jul 2013 01:59:00 +0200 Subject: [PATCH] add tests for c-level block dealloc --- test/test/spec/block_spec.rb | 42 +++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/test/test/spec/block_spec.rb b/test/test/spec/block_spec.rb index 427dde53..ef1aa2a7 100644 --- a/test/test/spec/block_spec.rb +++ b/test/test/spec/block_spec.rb @@ -190,9 +190,9 @@ describe "An object accepting block in constructor" do end end -# http://hipbyte.myjetbrains.com/youtrack/issue/RM-118 -describe "C-level blocks created inside GCD" do - it "are not prematurely released" do +describe "C-level blocks" do + # http://hipbyte.myjetbrains.com/youtrack/issue/RM-118 + it "created inside GCD are not prematurely released" do autorelease_pool do Dispatch::Queue.main.async do [1,2,3].enumerateObjectsUsingBlock(lambda do |obj, idx, stop_ptr| @@ -202,6 +202,42 @@ describe "C-level blocks created inside GCD" do sleep 1 true.should == true # no crash end + + class TestCBlockLambda + def test + [1,2,3].enumerateObjectsUsingBlock(lambda do |obj, idx, stop_ptr| + end) + nil + end + def test2 + @obs = NSNotificationCenter.defaultCenter.addObserverForName('Foo', object:nil, queue:nil, usingBlock:lambda do |x| + end) + end + def test3 + NSNotificationCenter.defaultCenter.removeObserver(@obs) + @obs = nil + end + def dealloc + $test_dealloc = true + super + end + end + it "properly release the given lambda object when passed synchronously" do + $test_dealloc = false + autorelease_pool { TestCBlockLambda.new.test } + $test_dealloc.should == true + end + + it "properly release the given lambda object when passed asynchronously" do + $test_dealloc = false + autorelease_pool do + o = TestCBlockLambda.new + o.test2 + NSNotificationCenter.defaultCenter.postNotificationName('Foo', object:nil) + o.test3 + end + $test_dealloc.should == true + end end describe "self" do