diff options
author | Jeremy Evans <code@jeremyevans.net> | 2019-09-27 13:35:29 -0700 |
---|---|---|
committer | Jeremy Evans <code@jeremyevans.net> | 2020-03-08 20:49:09 -0700 |
commit | f4394bbca361c2bb500f586ba0bf1bef8b919910 (patch) | |
tree | fea4e00e12d0dcbf6a76d7d4b7e95e6db34583c1 /spec | |
parent | 040cfc89b9a110cd0fb2abdcd35e8215b4a71f60 (diff) | |
download | ruby-f4394bbca361c2bb500f586ba0bf1bef8b919910.tar.gz |
Do not autosplat when calling procs that accept rest and keywords
When providing a single array to a block that takes a splat, pass the
array as one argument of the splat instead of as the splat itself,
even if the block also accepts keyword arguments. Previously, this
behavior was only used for blocks that did not accept keywords.
Implements [Feature#16166]
Diffstat (limited to 'spec')
-rw-r--r-- | spec/ruby/language/block_spec.rb | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/spec/ruby/language/block_spec.rb b/spec/ruby/language/block_spec.rb index 1a8e79063d..99366006b0 100644 --- a/spec/ruby/language/block_spec.rb +++ b/spec/ruby/language/block_spec.rb @@ -76,18 +76,18 @@ describe "A block yielded a single" do result.should == [1, 2, [3], {x: 9}, 2, {}] end - it "does not treat final Hash as keyword arguments" do + it "does not treat final Hash as keyword arguments and does not autosplat" do result = m(["a" => 1, a: 10]) { |a=nil, **b| [a, b] } - result.should == [{"a" => 1, a: 10}, {}] + result.should == [[{"a" => 1, a: 10}], {}] end - it "does not call #to_hash on final argument to get keyword arguments" do + it "does not call #to_hash on final argument to get keyword arguments and does not autosplat" do suppress_keyword_warning do obj = mock("coerce block keyword arguments") obj.should_not_receive(:to_hash) result = m([obj]) { |a=nil, **b| [a, b] } - result.should == [obj, {}] + result.should == [[obj], {}] end end end @@ -113,12 +113,12 @@ describe "A block yielded a single" do end ruby_version_is "2.8" do - it "does not call #to_hash on the argument when optional argument and keyword argument accepted" do + it "does not call #to_hash on the argument when optional argument and keyword argument accepted and does not autosplat" do obj = mock("coerce block keyword arguments") obj.should_not_receive(:to_hash) result = m([obj]) { |a=nil, **b| [a, b] } - result.should == [obj, {}] + result.should == [[obj], {}] end end @@ -132,18 +132,27 @@ describe "A block yielded a single" do end end ruby_version_is "2.8" do - it "does not separates non-symbol keys and symbol keys" do + it "does not separate non-symbol keys and symbol keys and does not autosplat" do suppress_keyword_warning do result = m(["a" => 10, b: 2]) { |a=nil, **b| [a, b] } - result.should == [{"a" => 10, b: 2}, {}] + result.should == [[{"a" => 10, b: 2}], {}] end end end end - it "does not treat hashes with string keys as keyword arguments" do - result = m(["a" => 10]) { |a = nil, **b| [a, b] } - result.should == [{"a" => 10}, {}] + ruby_version_is ""..."2.8" do + it "does not treat hashes with string keys as keyword arguments" do + result = m(["a" => 10]) { |a = nil, **b| [a, b] } + result.should == [{"a" => 10}, {}] + end + end + + ruby_version_is "2.8" do + it "does not treat hashes with string keys as keyword arguments and does not autosplat" do + result = m(["a" => 10]) { |a = nil, **b| [a, b] } + result.should == [[{"a" => 10}], {}] + end end ruby_version_is ''...'2.8' do |