@@@ -35,10 -35,9 +35,10 @@@ assert('super', '11.3.4') d
end
assert('yield', '11.3.5') do
- assert_raise LocalJumpError do
- yield
- end
+# it's syntax error now
+# assert_raise LocalJumpError do
+# yield
+# end
assert_raise LocalJumpError do
o = Object.new
def o.foo
@@@ -188,6 -187,18 +188,18 @@@ assert('Abbreviated variable assignmen
assert_equal 1, Syntax4AbbrVarAsgnAsReturns::A.new.b
end
+ assert('Abbreviated variable assignment of object attribute') do
+ module Syntax4AbbrVarAsgnObjectAttr
+ class A
+ attr_accessor :c
+ def b
+ self.c ||= 1
+ end
+ end
+ end
+ assert_equal 1, Syntax4AbbrVarAsgnObjectAttr::A.new.b
+ end
+
assert('Splat and multiple assignment') do
*a = *[1,2,3]
b, *c = *[7,8,9]
@@@ -346,11 -357,6 +358,11 @@@ assert('splat object in assignment') d
assert_equal [2], (a = *o)
end
+assert('one-line pattern match') do
+ 1 => a
+ assert_equal(1, a)
+end
+
assert('splat object in case statement') do
o = Object.new
def o.to_a
@@@ -429,11 -435,10 +441,11 @@@ assert('parenthesed do-block in cmdarg'
end
assert('method definition in cmdarg') do
- if false
+ result = class MethodDefinitionInCmdarg
+ def self.bar(arg); arg end
bar def foo; self.each do end end
end
- true
+ assert_equal(:foo, result)
end
assert('optional argument in the rhs default expressions') do
@@@ -457,18 -462,6 +469,18 @@@ assert('optional block argument in the
assert_nil(Proc.new {|foo = foo| foo}.call)
end
+assert('local variable definition in default value and subsequent arguments') do
+ def m(a = b = 1, c) [a, b, c] end
+ assert_equal([1, 1, :c], m(:c))
+ assert_equal([:a, nil, :c], m(:a, :c))
+
+ def m(a = b = 1, &c) [a, b, c ? true : nil] end
+ assert_equal([1, 1, nil], m)
+ assert_equal([1, 1, true], m{})
+ assert_equal([:a, nil, nil], m(:a))
+ assert_equal([:a, nil, true], m(:a){})
+end
+
assert('multiline comments work correctly') do
=begin
this is a comment with nothing after begin and end
@@@ -490,10 -483,6 +502,10 @@@ this is a comment that has extra after
end
assert 'keyword arguments' do
+ def m(a, b:1) [a, b] end
+ assert_equal [1, 1], m(1)
+ assert_equal [1, 2], m(1, b: 2)
+
def m(a, b:) [a, b] end
assert_equal [1, 2], m(1, b: 2)
assert_raise(ArgumentError) { m b: 1 }
result = m(1, 2, e: 3, g: 4, h: 5, i: 6, &(l = ->{}))
assert_equal([1, 1, [], 2, 3, 2, 4, { h: 5, i: 6 }, l], result)
=end
+
+ def m(a: b = 1, c:) [a, b, c] end
+ assert_equal([1, 1, :c], m(c: :c))
+ assert_equal([:a, nil, :c], m(a: :a, c: :c))
+end
+
+assert('numbered parameters') do
+ assert_equal(15, [1,2,3,4,5].reduce {_1+_2})
+ assert_equal(45, Proc.new do _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 end.call(*[1, 2, 3, 4, 5, 6, 7, 8, 9]))
+end
+
+assert('_0 is not numbered parameter') do
+ _0 = :l
+ assert_equal(:l, ->{_0}.call)
+end
+
+assert('argument forwarding') do
+ c = Class.new {
+ def a0(*a,&b)
+ assert_equal([1,2,3], a)
+ assert_not_nil(b)
+ end
+ def a(...)
+ a0(...)
+ end
+ def b(a,...)
+ assert_equal(a,1)
+ a0(1,...)
+ end
+ }
+ o = c.new
+ o.a(1,2,3){}
+ o.b(1,2,3){}
+end
+
+assert('endless def') do
+ c = Class.new {
+ def m1 = 42
+ def m2() = 42
+ def m3(x) = x+1
+ def self.s1 = 42
+ def self.s2() = 42
+ def self.s3(x) = x + 1
+ def cm1 = m3 42
+ def cm2() = m3 42
+ def cm3(x) = m3 x+1
+ def self.cs1 = s3 42
+ def self.cs2() = s3 42
+ def self.cs3(x) = s3 x + 1
+ }
+ o = c.new
+ assert_equal(42, o.m1)
+ assert_equal(43, o.m3(o.m2))
+ assert_equal(42, c.s1)
+ assert_equal(43, c.s3(c.s2))
+ assert_equal(43, o.cm1)
+ assert_equal(45, o.cm3(o.cm2))
+ assert_equal(43, c.cs1)
+ assert_equal(45, c.cs3(c.cs2))
end