summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authornagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-02-07 17:18:46 +0000
committernagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-02-07 17:18:46 +0000
commit1034b6d23dee1ab33e5da4f5d816b2af0cefc062 (patch)
treec67c0a24c6f0a1dc7ba508f838ea77ad76f93146 /test
parent161f08ba0d090438c1aae47344fdb1724e38a37e (diff)
merge revision(s) 53383,55366: [Backport #12478]
* lib/forwardable.rb (def_instance_delegator): adjust backtrace of method body by tail call optimization. adjusting the delegated target is still done by deleting backtrace. * lib/forwardable.rb (def_single_delegator): ditto. * lib/forwardable.rb (Forwardable._delegator_method): extract method generator and deal with non-module objects. [ruby-dev:49656] [Bug #12478] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_3@57570 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test')
-rw-r--r--test/test_forwardable.rb54
1 files changed, 51 insertions, 3 deletions
diff --git a/test/test_forwardable.rb b/test/test_forwardable.rb
index a474e4ad76..f678ca4fc7 100644
--- a/test/test_forwardable.rb
+++ b/test/test_forwardable.rb
@@ -144,7 +144,7 @@ class TestForwardable < Test::Unit::TestCase
end
end
- def test_def_single_delegator
+ def test_class_single_delegator
%i[def_delegator def_single_delegator].each do |m|
cls = single_forwardable_class do
__send__ m, :@receiver, :delegated1
@@ -154,7 +154,7 @@ class TestForwardable < Test::Unit::TestCase
end
end
- def test_def_single_delegators
+ def test_class_single_delegators
%i[def_delegators def_single_delegators].each do |m|
cls = single_forwardable_class do
__send__ m, :@receiver, :delegated1, :delegated2
@@ -165,7 +165,7 @@ class TestForwardable < Test::Unit::TestCase
end
end
- def test_single_delegate
+ def test_class_single_delegate
%i[delegate single_delegate].each do |m|
cls = single_forwardable_class do
__send__ m, delegated1: :@receiver, delegated2: :@receiver
@@ -183,10 +183,50 @@ class TestForwardable < Test::Unit::TestCase
end
end
+ def test_obj_single_delegator
+ %i[def_delegator def_single_delegator].each do |m|
+ obj = single_forwardable_object do
+ __send__ m, :@receiver, :delegated1
+ end
+
+ assert_same RETURNED1, obj.delegated1
+ end
+ end
+
+ def test_obj_single_delegators
+ %i[def_delegators def_single_delegators].each do |m|
+ obj = single_forwardable_object do
+ __send__ m, :@receiver, :delegated1, :delegated2
+ end
+
+ assert_same RETURNED1, obj.delegated1
+ assert_same RETURNED2, obj.delegated2
+ end
+ end
+
+ def test_obj_single_delegate
+ %i[delegate single_delegate].each do |m|
+ obj = single_forwardable_object do
+ __send__ m, delegated1: :@receiver, delegated2: :@receiver
+ end
+
+ assert_same RETURNED1, obj.delegated1
+ assert_same RETURNED2, obj.delegated2
+
+ obj = single_forwardable_object do
+ __send__ m, %i[delegated1 delegated2] => :@receiver
+ end
+
+ assert_same RETURNED1, obj.delegated1
+ assert_same RETURNED2, obj.delegated2
+ end
+ end
+
class Foo
extend Forwardable
def_delegator :bar, :baz
+ def_delegator :caller, :itself, :c
class Exception
end
@@ -197,6 +237,7 @@ class TestForwardable < Test::Unit::TestCase
Foo.new.baz
}
assert_not_match(/\/forwardable\.rb/, e.backtrace[0])
+ assert_equal(caller(0, 1)[0], Foo.new.c[0])
end
class Foo2 < BasicObject
@@ -245,4 +286,11 @@ class TestForwardable < Test::Unit::TestCase
class_exec(&block)
end
end
+
+ def single_forwardable_object(&block)
+ obj = Object.new.extend SingleForwardable
+ obj.instance_variable_set(:@receiver, RECEIVER)
+ obj.instance_eval(&block)
+ obj
+ end
end