summaryrefslogtreecommitdiff
path: root/test/ruby/test_yield.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/ruby/test_yield.rb')
-rw-r--r--test/ruby/test_yield.rb48
1 files changed, 40 insertions, 8 deletions
diff --git a/test/ruby/test_yield.rb b/test/ruby/test_yield.rb
index 143ee55a9f..e7e65fce9e 100644
--- a/test/ruby/test_yield.rb
+++ b/test/ruby/test_yield.rb
@@ -1,3 +1,4 @@
+# frozen_string_literal: false
require 'test/unit'
require 'stringio'
@@ -66,7 +67,7 @@ class TestRubyYield < Test::Unit::TestCase
end
def test_with_enum
- obj = Object
+ obj = Object.new
def obj.each
yield(*[])
end
@@ -340,11 +341,12 @@ class TestRubyYieldGen < Test::Unit::TestCase
t = t.subst('vars') { " [#{vars.join(",")}]" }
emu_values = emu(t, vars, islambda)
s = t.to_s
+ o = Object.new
#print "#{s}\t\t"
#STDOUT.flush
eval_values = disable_stderr {
begin
- eval(s, nil, 'generated_code_in_check_nofork')
+ o.instance_eval(s, 'generated_code_in_check_nofork')
rescue ArgumentError
ArgumentError
end
@@ -354,23 +356,29 @@ class TestRubyYieldGen < Test::Unit::TestCase
assert_equal(emu_values, eval_values, s)
end
+ def assert_all_sentences(syntax, *args)
+ syntax = Sentence.expand_syntax(syntax)
+ all_assertions do |a|
+ Sentence.each(syntax, *args) {|t|
+ a.for(t) {yield t}
+ }
+ end
+ end
+
def test_yield
- syntax = Sentence.expand_syntax(Syntax)
- Sentence.each(syntax, :test_proc, 4) {|t|
+ assert_all_sentences(Syntax, :test_proc, 4) {|t|
check_nofork(t)
}
end
def test_yield_lambda
- syntax = Sentence.expand_syntax(Syntax)
- Sentence.each(syntax, :test_lambda, 4) {|t|
+ assert_all_sentences(Syntax, :test_lambda, 4) {|t|
check_nofork(t, true)
}
end
def test_yield_enum
- syntax = Sentence.expand_syntax(Syntax)
- Sentence.each(syntax, :test_enum, 4) {|t|
+ assert_all_sentences(Syntax, :test_enum, 4) {|t|
code = t.to_s
r1, r2 = disable_stderr {
eval(code, nil, 'generated_code_in_test_yield_enum')
@@ -390,4 +398,28 @@ class TestRubyYieldGen < Test::Unit::TestCase
end
assert_equal [m, nil], y.s(m){|a,b|[a,b]}
end
+
+ def test_block_cached_argc
+ # [Bug #11451]
+ assert_ruby_status([], <<-"end;")
+ class Yielder
+ def each
+ yield :x, :y, :z
+ end
+ end
+ class Getter1
+ include Enumerable
+ def each(&block)
+ Yielder.new.each(&block)
+ end
+ end
+ class Getter2
+ include Enumerable
+ def each
+ Yielder.new.each { |a, b, c, d| yield(a) }
+ end
+ end
+ Getter1.new.map{Getter2.new.each{|x|}}
+ end;
+ end
end