diff options
Diffstat (limited to 'test/ruby')
-rw-r--r-- | test/ruby/test_call.rb | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/test/ruby/test_call.rb b/test/ruby/test_call.rb index 88e2ddcb7b..dbdb0752be 100644 --- a/test/ruby/test_call.rb +++ b/test/ruby/test_call.rb @@ -115,4 +115,88 @@ class TestCall < Test::Unit::TestCase ary = [1, 2, b] assert_equal([0, 1, 2, b], aaa(0, *ary, &ary.pop), bug16504) end + + def test_call_cfunc_splat_large_array_bug_4040 + a = 1380.times.to_a # Greater than VM_ARGC_STACK_MAX + + assert_equal(a, [].push(*a)) + assert_equal(a, [].push(a[0], *a[1..])) + assert_equal(a, [].push(a[0], a[1], *a[2..])) + assert_equal(a, [].push(*a[0..1], *a[2..])) + assert_equal(a, [].push(*a[...-1], a[-1])) + assert_equal(a, [].push(a[0], *a[1...-1], a[-1])) + assert_equal(a, [].push(a[0], a[1], *a[2...-1], a[-1])) + assert_equal(a, [].push(*a[0..1], *a[2...-1], a[-1])) + assert_equal(a, [].push(*a[...-2], a[-2], a[-1])) + assert_equal(a, [].push(a[0], *a[1...-2], a[-2], a[-1])) + assert_equal(a, [].push(a[0], a[1], *a[2...-2], a[-2], a[-1])) + assert_equal(a, [].push(*a[0..1], *a[2...-2], a[-2], a[-1])) + + kw = {x: 1} + a_kw = a + [kw] + + assert_equal(a_kw, [].push(*a, **kw)) + assert_equal(a_kw, [].push(a[0], *a[1..], **kw)) + assert_equal(a_kw, [].push(a[0], a[1], *a[2..], **kw)) + assert_equal(a_kw, [].push(*a[0..1], *a[2..], **kw)) + assert_equal(a_kw, [].push(*a[...-1], a[-1], **kw)) + assert_equal(a_kw, [].push(a[0], *a[1...-1], a[-1], **kw)) + assert_equal(a_kw, [].push(a[0], a[1], *a[2...-1], a[-1], **kw)) + assert_equal(a_kw, [].push(*a[0..1], *a[2...-1], a[-1], **kw)) + assert_equal(a_kw, [].push(*a[...-2], a[-2], a[-1], **kw)) + assert_equal(a_kw, [].push(a[0], *a[1...-2], a[-2], a[-1], **kw)) + assert_equal(a_kw, [].push(a[0], a[1], *a[2...-2], a[-2], a[-1], **kw)) + assert_equal(a_kw, [].push(*a[0..1], *a[2...-2], a[-2], a[-1], **kw)) + + assert_equal(a_kw, [].push(*a, x: 1)) + assert_equal(a_kw, [].push(a[0], *a[1..], x: 1)) + assert_equal(a_kw, [].push(a[0], a[1], *a[2..], x: 1)) + assert_equal(a_kw, [].push(*a[0..1], *a[2..], x: 1)) + assert_equal(a_kw, [].push(*a[...-1], a[-1], x: 1)) + assert_equal(a_kw, [].push(a[0], *a[1...-1], a[-1], x: 1)) + assert_equal(a_kw, [].push(a[0], a[1], *a[2...-1], a[-1], x: 1)) + assert_equal(a_kw, [].push(*a[0..1], *a[2...-1], a[-1], x: 1)) + assert_equal(a_kw, [].push(*a[...-2], a[-2], a[-1], x: 1)) + assert_equal(a_kw, [].push(a[0], *a[1...-2], a[-2], a[-1], x: 1)) + assert_equal(a_kw, [].push(a[0], a[1], *a[2...-2], a[-2], a[-1], x: 1)) + assert_equal(a_kw, [].push(*a[0..1], *a[2...-2], a[-2], a[-1], x: 1)) + + a_kw[-1][:y] = 2 + kw = {y: 2} + + assert_equal(a_kw, [].push(*a, x: 1, **kw)) + assert_equal(a_kw, [].push(a[0], *a[1..], x: 1, **kw)) + assert_equal(a_kw, [].push(a[0], a[1], *a[2..], x: 1, **kw)) + assert_equal(a_kw, [].push(*a[0..1], *a[2..], x: 1, **kw)) + assert_equal(a_kw, [].push(*a[...-1], a[-1], x: 1, **kw)) + assert_equal(a_kw, [].push(a[0], *a[1...-1], a[-1], x: 1, **kw)) + assert_equal(a_kw, [].push(a[0], a[1], *a[2...-1], a[-1], x: 1, **kw)) + assert_equal(a_kw, [].push(*a[0..1], *a[2...-1], a[-1], x: 1, **kw)) + assert_equal(a_kw, [].push(*a[...-2], a[-2], a[-1], x: 1, **kw)) + assert_equal(a_kw, [].push(a[0], *a[1...-2], a[-2], a[-1], x: 1, **kw)) + assert_equal(a_kw, [].push(a[0], a[1], *a[2...-2], a[-2], a[-1], x: 1, **kw)) + assert_equal(a_kw, [].push(*a[0..1], *a[2...-2], a[-2], a[-1], x: 1, **kw)) + + kw = {} + + assert_equal(a, [].push(*a, **kw)) + assert_equal(a, [].push(a[0], *a[1..], **kw)) + assert_equal(a, [].push(a[0], a[1], *a[2..], **kw)) + assert_equal(a, [].push(*a[0..1], *a[2..], **kw)) + assert_equal(a, [].push(*a[...-1], a[-1], **kw)) + assert_equal(a, [].push(a[0], *a[1...-1], a[-1], **kw)) + assert_equal(a, [].push(a[0], a[1], *a[2...-1], a[-1], **kw)) + assert_equal(a, [].push(*a[0..1], *a[2...-1], a[-1], **kw)) + assert_equal(a, [].push(*a[...-2], a[-2], a[-1], **kw)) + assert_equal(a, [].push(a[0], *a[1...-2], a[-2], a[-1], **kw)) + assert_equal(a, [].push(a[0], a[1], *a[2...-2], a[-2], a[-1], **kw)) + assert_equal(a, [].push(*a[0..1], *a[2...-2], a[-2], a[-1], **kw)) + + a_kw = a + [Hash.ruby2_keywords_hash({})] + assert_equal(a, [].push(*a_kw)) + + # Single test with value that would cause SystemStackError. + # Not all tests use such a large array to reduce testing time. + assert_equal(1380888, [].push(*1380888.times.to_a).size) + end end |