aboutsummaryrefslogtreecommitdiffstats
path: root/test/ruby/test_keyword.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/ruby/test_keyword.rb')
-rw-r--r--test/ruby/test_keyword.rb272
1 files changed, 272 insertions, 0 deletions
diff --git a/test/ruby/test_keyword.rb b/test/ruby/test_keyword.rb
index 1dbde80cd5..1cfa982f0c 100644
--- a/test/ruby/test_keyword.rb
+++ b/test/ruby/test_keyword.rb
@@ -2306,6 +2306,278 @@ class TestKeywordArguments < Test::Unit::TestCase
assert_raise(ArgumentError) { m.call(42, a: 1, **h2) }
end
+ def test_ruby2_keywords
+ c = Class.new do
+ ruby2_keywords def foo(meth, *args)
+ send(meth, *args)
+ end
+
+ ruby2_keywords def foo_bar(*args)
+ bar(*args)
+ end
+
+ ruby2_keywords def foo_baz(*args)
+ baz(*args)
+ end
+
+ ruby2_keywords def foo_mod(meth, *args)
+ args << 1
+ send(meth, *args)
+ end
+
+ ruby2_keywords def foo_bar_mod(*args)
+ args << 1
+ bar(*args)
+ end
+
+ ruby2_keywords def foo_baz_mod(*args)
+ args << 1
+ baz(*args)
+ end
+
+ def bar(*args, **kw)
+ [args, kw]
+ end
+
+ def baz(*args)
+ args
+ end
+
+ ruby2_keywords def foo_dbar(*args)
+ dbar(*args)
+ end
+
+ ruby2_keywords def foo_dbaz(*args)
+ dbaz(*args)
+ end
+
+ define_method(:dbar) do |*args, **kw|
+ [args, kw]
+ end
+
+ define_method(:dbaz) do |*args|
+ args
+ end
+
+ ruby2_keywords def block(*args)
+ ->(*args, **kw){[args, kw]}.(*args)
+ end
+
+ ruby2_keywords def cfunc(*args)
+ self.class.new(*args).init_args
+ end
+
+ ruby2_keywords def store_foo(meth, *args)
+ @stored_args = args
+ use(meth)
+ end
+ def use(meth)
+ send(meth, *@stored_args)
+ end
+
+ attr_reader :init_args
+ def initialize(*args, **kw)
+ @init_args = [args, kw]
+ end
+ end
+
+ mmkw = Class.new do
+ def method_missing(*args, **kw)
+ [args, kw]
+ end
+ end
+
+ mmnokw = Class.new do
+ def method_missing(*args)
+ args
+ end
+ end
+
+ implicit_super = Class.new(c) do
+ ruby2_keywords def bar(*args)
+ super
+ end
+
+ ruby2_keywords def baz(*args)
+ super
+ end
+ end
+
+ explicit_super = Class.new(c) do
+ ruby2_keywords def bar(*args)
+ super(*args)
+ end
+
+ ruby2_keywords def baz(*args)
+ super(*args)
+ end
+ end
+
+ h1 = {a: 1}
+ o = c.new
+
+ assert_equal([[1], h1], o.foo(:bar, 1, :a=>1))
+ assert_equal([1, h1], o.foo(:baz, 1, :a=>1))
+ assert_equal([[1], h1], o.store_foo(:bar, 1, :a=>1))
+ assert_equal([1, h1], o.store_foo(:baz, 1, :a=>1))
+ assert_equal([[1], h1], o.foo_bar(1, :a=>1))
+ assert_equal([1, h1], o.foo_baz(1, :a=>1))
+
+ assert_equal([[1], h1], o.foo(:bar, 1, **h1))
+ assert_equal([1, h1], o.foo(:baz, 1, **h1))
+ assert_equal([[1], h1], o.store_foo(:bar, 1, **h1))
+ assert_equal([1, h1], o.store_foo(:baz, 1, **h1))
+ assert_equal([[1], h1], o.foo_bar(1, **h1))
+ assert_equal([1, h1], o.foo_baz(1, **h1))
+
+ assert_equal([[h1], {}], o.foo(:bar, h1, **{}))
+ assert_equal([h1], o.foo(:baz, h1, **{}))
+ assert_equal([[h1], {}], o.store_foo(:bar, h1, **{}))
+ assert_equal([h1], o.store_foo(:baz, h1, **{}))
+ assert_equal([[h1], {}], o.foo_bar(h1, **{}))
+ assert_equal([h1], o.foo_baz(h1, **{}))
+
+ assert_warn(/The last argument is used as the keyword parameter.* for `bar'/m) do
+ assert_equal([[1], h1], o.foo(:bar, 1, h1))
+ end
+ assert_equal([1, h1], o.foo(:baz, 1, h1))
+ assert_warn(/The last argument is used as the keyword parameter.* for `bar'/m) do
+ assert_equal([[1], h1], o.store_foo(:bar, 1, h1))
+ end
+ assert_equal([1, h1], o.store_foo(:baz, 1, h1))
+ assert_warn(/The last argument is used as the keyword parameter.* for `bar'/m) do
+ assert_equal([[1], h1], o.foo_bar(1, h1))
+ end
+ assert_equal([1, h1], o.foo_baz(1, h1))
+
+ assert_equal([[1, h1, 1], {}], o.foo_mod(:bar, 1, :a=>1))
+ assert_equal([1, h1, 1], o.foo_mod(:baz, 1, :a=>1))
+ assert_equal([[1, h1, 1], {}], o.foo_bar_mod(1, :a=>1))
+ assert_equal([1, h1, 1], o.foo_baz_mod(1, :a=>1))
+
+ assert_equal([[1, h1, 1], {}], o.foo_mod(:bar, 1, **h1))
+ assert_equal([1, h1, 1], o.foo_mod(:baz, 1, **h1))
+ assert_equal([[1, h1, 1], {}], o.foo_bar_mod(1, **h1))
+ assert_equal([1, h1, 1], o.foo_baz_mod(1, **h1))
+
+ assert_equal([[h1, {}, 1], {}], o.foo_mod(:bar, h1, **{}))
+ assert_equal([h1, {}, 1], o.foo_mod(:baz, h1, **{}))
+ assert_equal([[h1, {}, 1], {}], o.foo_bar_mod(h1, **{}))
+ assert_equal([h1, {}, 1], o.foo_baz_mod(h1, **{}))
+
+ assert_equal([[1, h1, 1], {}], o.foo_mod(:bar, 1, h1))
+ assert_equal([1, h1, 1], o.foo_mod(:baz, 1, h1))
+ assert_equal([[1, h1, 1], {}], o.foo_bar_mod(1, h1))
+ assert_equal([1, h1, 1], o.foo_baz_mod(1, h1))
+
+ assert_equal([[1], h1], o.foo(:dbar, 1, :a=>1))
+ assert_equal([1, h1], o.foo(:dbaz, 1, :a=>1))
+ assert_equal([[1], h1], o.store_foo(:dbar, 1, :a=>1))
+ assert_equal([1, h1], o.store_foo(:dbaz, 1, :a=>1))
+ assert_equal([[1], h1], o.foo_dbar(1, :a=>1))
+ assert_equal([1, h1], o.foo_dbaz(1, :a=>1))
+
+ assert_equal([[1], h1], o.foo(:dbar, 1, **h1))
+ assert_equal([1, h1], o.foo(:dbaz, 1, **h1))
+ assert_equal([[1], h1], o.store_foo(:dbar, 1, **h1))
+ assert_equal([1, h1], o.store_foo(:dbaz, 1, **h1))
+ assert_equal([[1], h1], o.foo_dbar(1, **h1))
+ assert_equal([1, h1], o.foo_dbaz(1, **h1))
+
+ assert_equal([[h1], {}], o.foo(:dbar, h1, **{}))
+ assert_equal([h1], o.foo(:dbaz, h1, **{}))
+ assert_equal([[h1], {}], o.store_foo(:dbar, h1, **{}))
+ assert_equal([h1], o.store_foo(:dbaz, h1, **{}))
+ assert_equal([[h1], {}], o.foo_dbar(h1, **{}))
+ assert_equal([h1], o.foo_dbaz(h1, **{}))
+
+ assert_warn(/The last argument is used as the keyword parameter.* for method/m) do
+ assert_equal([[1], h1], o.foo(:dbar, 1, h1))
+ end
+ assert_equal([1, h1], o.foo(:dbaz, 1, h1))
+ assert_warn(/The last argument is used as the keyword parameter.* for method/m) do
+ assert_equal([[1], h1], o.store_foo(:dbar, 1, h1))
+ end
+ assert_equal([1, h1], o.store_foo(:dbaz, 1, h1))
+ assert_warn(/The last argument is used as the keyword parameter.* for method/m) do
+ assert_equal([[1], h1], o.foo_dbar(1, h1))
+ end
+ assert_equal([1, h1], o.foo_dbaz(1, h1))
+
+ assert_equal([[1], h1], o.block(1, :a=>1))
+ assert_equal([[1], h1], o.block(1, **h1))
+ assert_warn(/The last argument is used as the keyword parameter.* for `call'/m) do
+ assert_equal([[1], h1], o.block(1, h1))
+ end
+ assert_equal([[h1], {}], o.block(h1, **{}))
+
+ assert_equal([[1], h1], o.cfunc(1, :a=>1))
+ assert_equal([[1], h1], o.cfunc(1, **h1))
+ assert_warn(/The last argument is used as the keyword parameter.* for `initialize'/m) do
+ assert_equal([[1], h1], o.cfunc(1, h1))
+ end
+ assert_equal([[h1], {}], o.cfunc(h1, **{}))
+
+ o = mmkw.new
+ assert_equal([[:b, 1], h1], o.b(1, :a=>1))
+ assert_equal([[:b, 1], h1], o.b(1, **h1))
+ assert_warn(/The last argument is used as the keyword parameter.* for `method_missing'/m) do
+ assert_equal([[:b, 1], h1], o.b(1, h1))
+ end
+ assert_equal([[:b, h1], {}], o.b(h1, **{}))
+
+ o = mmnokw.new
+ assert_equal([:b, 1, h1], o.b(1, :a=>1))
+ assert_equal([:b, 1, h1], o.b(1, **h1))
+ assert_equal([:b, 1, h1], o.b(1, h1))
+ assert_equal([:b, h1], o.b(h1, **{}))
+
+ o = implicit_super.new
+ assert_equal([[1], h1], o.bar(1, :a=>1))
+ assert_equal([[1], h1], o.bar(1, **h1))
+ assert_warn(/The last argument is used as the keyword parameter.* for `bar'/m) do
+ assert_equal([[1], h1], o.bar(1, h1))
+ end
+ assert_equal([[h1], {}], o.bar(h1, **{}))
+
+ assert_equal([1, h1], o.baz(1, :a=>1))
+ assert_equal([1, h1], o.baz(1, **h1))
+ assert_equal([1, h1], o.baz(1, h1))
+ assert_equal([h1], o.baz(h1, **{}))
+
+ o = explicit_super.new
+ assert_equal([[1], h1], o.bar(1, :a=>1))
+ assert_equal([[1], h1], o.bar(1, **h1))
+ assert_warn(/The last argument is used as the keyword parameter.* for `bar'/m) do
+ assert_equal([[1], h1], o.bar(1, h1))
+ end
+ assert_equal([[h1], {}], o.bar(h1, **{}))
+
+ assert_equal([1, h1], o.baz(1, :a=>1))
+ assert_equal([1, h1], o.baz(1, **h1))
+ assert_equal([1, h1], o.baz(1, h1))
+ assert_equal([h1], o.baz(h1, **{}))
+
+ assert_warn(/Skipping set of ruby2_keywords flag for bar \(method not defined in Ruby, method accepts keywords, or method does not accept argument splat\)/) do
+ assert_nil(c.send(:ruby2_keywords, :bar))
+ end
+
+ sc = Class.new(c)
+ assert_warn(/Skipping set of ruby2_keywords flag for bar \(can only set in method defining module\)/) do
+ sc.send(:ruby2_keywords, :bar)
+ end
+ m = Module.new
+ assert_warn(/Skipping set of ruby2_keywords flag for system \(can only set in method defining module\)/) do
+ m.send(:ruby2_keywords, :system)
+ end
+
+ assert_raise(NameError) { c.send(:ruby2_keywords, "a5e36ccec4f5080a1d5e63f8") }
+ assert_raise(NameError) { c.send(:ruby2_keywords, :quux) }
+
+ c.freeze
+ assert_raise(FrozenError) { c.send(:ruby2_keywords, :baz) }
+ end
+
def test_dig_kwsplat
kw = {}
h = {:a=>1}