Merge pull request #4141 from udzura/add-test-for-attr-nil-guard
authorYukihiro "Matz" Matsumoto <[email protected]>
Wed, 14 Jul 2021 22:27:48 +0000 (15 07:27 +0900)
committerGitHub <[email protected]>
Wed, 14 Jul 2021 22:27:48 +0000 (15 07:27 +0900)
Add a testcase of #4137 fix

1  2 
test/t/syntax.rb

diff --combined 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 }
    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