From: Yukihiro "Matz" Matsumoto Date: Wed, 14 Jul 2021 22:27:48 +0000 (+0900) Subject: Merge pull request #4141 from udzura/add-test-for-attr-nil-guard X-Git-Tag: 3.1.0-rc~390 X-Git-Url: https://repo.or.cz/mruby.git/commitdiff_plain/b8863c69dccce97f6fae178552afc61ba0b07f0c?hp=-c Merge pull request #4141 from udzura/add-test-for-attr-nil-guard Add a testcase of #4137 fix --- b8863c69dccce97f6fae178552afc61ba0b07f0c diff --combined test/t/syntax.rb index c5c677b3f,a726719f8..c4c99242b --- a/test/t/syntax.rb +++ b/test/t/syntax.rb @@@ -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 } @@@ -672,63 -661,4 +684,63 @@@ 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