From d1ef73b59cede58f2173fa0f4ff7480a820f25d6 Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Thu, 5 Sep 2019 10:36:28 -0700 Subject: Always remove empty keyword hashes when calling methods While doing so is not backwards compatible with Ruby 2.6, it is necessary for generic argument forwarding to work for all methods: ```ruby def foo(*args, **kw, &block) bar(*args, **kw, &block) end ``` If you do not remove empty keyword hashes, and bar does not accept keyword arguments, then a call to foo without keyword arguments calls bar with an extra positional empty hash argument. --- test/ruby/test_keyword.rb | 48 ++++++++++++++++------------------------------- 1 file changed, 16 insertions(+), 32 deletions(-) (limited to 'test/ruby') diff --git a/test/ruby/test_keyword.rb b/test/ruby/test_keyword.rb index 71b72bd4ed..b337343420 100644 --- a/test/ruby/test_keyword.rb +++ b/test/ruby/test_keyword.rb @@ -185,9 +185,7 @@ class TestKeywordArguments < Test::Unit::TestCase f = -> { true } assert_equal(true, f[**{}]) - assert_warn(/The keyword argument is passed as the last hash parameter/m) do - assert_raise(ArgumentError) { f[**kw] } - end + assert_equal(true, f[**kw]) assert_warn(/The keyword argument is passed as the last hash parameter/m) do assert_raise(ArgumentError) { f[**h] } end @@ -203,9 +201,7 @@ class TestKeywordArguments < Test::Unit::TestCase f = ->(a) { a } assert_raise(ArgumentError) { f[**{}] } - assert_warn(/The keyword argument is passed as the last hash parameter/m) do - assert_equal(kw, f[**kw]) - end + assert_raise(ArgumentError) { f[**kw] } assert_warn(/The keyword argument is passed as the last hash parameter/m) do assert_equal(h, f[**h]) end @@ -283,7 +279,7 @@ class TestKeywordArguments < Test::Unit::TestCase end end assert_equal([], c[**{}].args) - assert_equal([{}], c[**kw].args) + assert_equal([], c[**kw].args) assert_equal([h], c[**h].args) assert_equal([h], c[a: 1].args) assert_equal([h2], c[**h2].args) @@ -294,7 +290,7 @@ class TestKeywordArguments < Test::Unit::TestCase def initialize; end end assert_nil(c[**{}].args) - assert_raise(ArgumentError) { c[**kw] } + assert_nil(c[**kw].args) assert_raise(ArgumentError) { c[**h] } assert_raise(ArgumentError) { c[a: 1] } assert_raise(ArgumentError) { c[**h2] } @@ -307,7 +303,7 @@ class TestKeywordArguments < Test::Unit::TestCase end end assert_raise(ArgumentError) { c[**{}] } - assert_equal(kw, c[**kw].args) + assert_raise(ArgumentError) { c[**kw] } assert_equal(h, c[**h].args) assert_equal(h, c[a: 1].args) assert_equal(h2, c[**h2].args) @@ -333,7 +329,7 @@ class TestKeywordArguments < Test::Unit::TestCase end end assert_raise(ArgumentError) { c[**{}] } - assert_equal([kw, kw], c[**kw].args) + assert_raise(ArgumentError) { c[**kw] } assert_equal([h, kw], c[**h].args) assert_equal([h, kw], c[a: 1].args) assert_equal([h2, kw], c[**h2].args) @@ -365,7 +361,7 @@ class TestKeywordArguments < Test::Unit::TestCase args end assert_equal([], c.method(:m)[**{}]) - assert_equal([{}], c.method(:m)[**kw]) + assert_equal([], c.method(:m)[**kw]) assert_equal([h], c.method(:m)[**h]) assert_equal([h], c.method(:m)[a: 1]) assert_equal([h2], c.method(:m)[**h2]) @@ -375,7 +371,7 @@ class TestKeywordArguments < Test::Unit::TestCase c.singleton_class.remove_method(:m) def c.m; end assert_nil(c.method(:m)[**{}]) - assert_raise(ArgumentError) { c.method(:m)[**kw] } + assert_nil(c.method(:m)[**kw]) assert_raise(ArgumentError) { c.method(:m)[**h] } assert_raise(ArgumentError) { c.method(:m)[a: 1] } assert_raise(ArgumentError) { c.method(:m)[**h2] } @@ -387,7 +383,7 @@ class TestKeywordArguments < Test::Unit::TestCase args end assert_raise(ArgumentError) { c.method(:m)[**{}] } - assert_equal(kw, c.method(:m)[**kw]) + assert_raise(ArgumentError) { c.method(:m)[**kw] } assert_equal(h, c.method(:m)[**h]) assert_equal(h, c.method(:m)[a: 1]) assert_equal(h2, c.method(:m)[**h2]) @@ -411,7 +407,7 @@ class TestKeywordArguments < Test::Unit::TestCase [arg, args] end assert_raise(ArgumentError) { c.method(:m)[**{}] } - assert_equal([kw, kw], c.method(:m)[**kw]) + assert_raise(ArgumentError) { c.method(:m)[**kw] } assert_equal([h, kw], c.method(:m)[**h]) assert_equal([h, kw], c.method(:m)[a: 1]) assert_equal([h2, kw], c.method(:m)[**h2]) @@ -487,9 +483,7 @@ class TestKeywordArguments < Test::Unit::TestCase [arg, args] end assert_raise(ArgumentError) { c.send(:m, **{}) } - assert_warn(/The keyword argument is passed as the last hash parameter.* for `m'/m) do - assert_equal([kw, kw], c.send(:m, **kw)) - end + assert_raise(ArgumentError) { c.send(:m, **kw) } assert_warn(/The keyword argument is passed as the last hash parameter.* for `m'/m) do assert_equal([h, kw], c.send(:m, **h)) end @@ -576,9 +570,7 @@ class TestKeywordArguments < Test::Unit::TestCase [arg, args] end assert_raise(ArgumentError) { :m.to_proc.call(c, **{}) } - assert_warn(/The keyword argument is passed as the last hash parameter.* for `m'/m) do - assert_equal([kw, kw], :m.to_proc.call(c, **kw)) - end + assert_raise(ArgumentError) { :m.to_proc.call(c, **kw) } assert_warn(/The keyword argument is passed as the last hash parameter.* for `m'/m) do assert_equal([h, kw], :m.to_proc.call(c, **h)) end @@ -664,9 +656,7 @@ class TestKeywordArguments < Test::Unit::TestCase [arg, args] end assert_raise(ArgumentError) { c.m(**{}) } - assert_warn(/The keyword argument is passed as the last hash parameter.* for `method_missing'/m) do - assert_equal([kw, kw], c.m(**kw)) - end + assert_raise(ArgumentError) { c.m(**kw) } assert_warn(/The keyword argument is passed as the last hash parameter.* for `method_missing'/m) do assert_equal([h, kw], c.m(**h)) end @@ -707,9 +697,7 @@ class TestKeywordArguments < Test::Unit::TestCase define_method(:m) { } end assert_nil(c.m(**{})) - assert_warn(/The keyword argument is passed as the last hash parameter/m) do - assert_raise(ArgumentError) { c.m(**kw) } - end + assert_nil(c.m(**kw)) assert_warn(/The keyword argument is passed as the last hash parameter/m) do assert_raise(ArgumentError) { c.m(**h) } end @@ -731,9 +719,7 @@ class TestKeywordArguments < Test::Unit::TestCase define_method(:m) {|arg| arg } end assert_raise(ArgumentError) { c.m(**{}) } - assert_warn(/The keyword argument is passed as the last hash parameter/m) do - assert_equal(kw, c.m(**kw)) - end + assert_raise(ArgumentError) { c.m(**kw) } assert_warn(/The keyword argument is passed as the last hash parameter/m) do assert_equal(h, c.m(**h)) end @@ -779,9 +765,7 @@ class TestKeywordArguments < Test::Unit::TestCase define_method(:m) {|arg, **opt| [arg, opt] } end assert_raise(ArgumentError) { c.m(**{}) } - assert_warn(/The keyword argument is passed as the last hash parameter/m) do - assert_equal([kw, kw], c.m(**kw)) - end + assert_raise(ArgumentError) { c.m(**kw) } assert_warn(/The keyword argument is passed as the last hash parameter/m) do assert_equal([h, kw], c.m(**h)) end -- cgit v1.2.3