mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* enumerator.c: implement Enumerator#{next_values,peek_values,feed}
and StopIteration#result. [ruby-dev:39109] (struct enumerator): replace no_next by stop_exc. new field feedvalue. (enumerator_mark): mark feedvalue and stop_exc. (enumerator_init): initialize feedvalue and stop_exc. (enumerator_init_copy): initialize feedvalue. (next_ii): send yield arguments as an array. return feedvalue. (next_i): generate StopIteration exception here. set result. (next_init): initialize feedvalue. (enumerator_next_values): new method Enumerator#next_values. (ary2sv): new function. (enumerator_peek_values): new method Enumerator#peek_values. (enumerator_feed): new method Enumerator#feed. (yielder_yield): return the yield value. (generator_each): return the iterator value. (stop_result): new method StopIteration#result. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@24587 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
b307bd9847
commit
3b4949ffa8
4 changed files with 435 additions and 38 deletions
|
@ -152,5 +152,130 @@ class TestEnumerator < Test::Unit::TestCase
|
|||
assert_raise(StopIteration) { e.next }
|
||||
assert_raise(StopIteration) { e.next }
|
||||
end
|
||||
|
||||
def test_stop_result
|
||||
a = [1]
|
||||
res = a.each {}
|
||||
e = a.each
|
||||
assert_equal(1, e.next)
|
||||
exc = assert_raise(StopIteration) { e.next }
|
||||
assert_equal(res, exc.result)
|
||||
end
|
||||
|
||||
def test_next_values
|
||||
o = Object.new
|
||||
def o.each
|
||||
yield
|
||||
yield 1
|
||||
yield 1, 2
|
||||
end
|
||||
e = o.to_enum
|
||||
assert_equal(nil, e.next)
|
||||
assert_equal(1, e.next)
|
||||
assert_equal([1,2], e.next)
|
||||
e = o.to_enum
|
||||
assert_equal([], e.next_values)
|
||||
assert_equal([1], e.next_values)
|
||||
assert_equal([1,2], e.next_values)
|
||||
end
|
||||
|
||||
def test_peek_values
|
||||
o = Object.new
|
||||
def o.each
|
||||
yield
|
||||
yield 1
|
||||
yield 1, 2
|
||||
end
|
||||
e = o.to_enum
|
||||
assert_equal(nil, e.peek)
|
||||
assert_equal(nil, e.next)
|
||||
assert_equal(1, e.peek)
|
||||
assert_equal(1, e.next)
|
||||
assert_equal([1,2], e.peek)
|
||||
assert_equal([1,2], e.next)
|
||||
e = o.to_enum
|
||||
assert_equal([], e.peek_values)
|
||||
assert_equal([], e.next_values)
|
||||
assert_equal([1], e.peek_values)
|
||||
assert_equal([1], e.next_values)
|
||||
assert_equal([1,2], e.peek_values)
|
||||
assert_equal([1,2], e.next_values)
|
||||
e = o.to_enum
|
||||
assert_equal([], e.peek_values)
|
||||
assert_equal(nil, e.next)
|
||||
assert_equal([1], e.peek_values)
|
||||
assert_equal(1, e.next)
|
||||
assert_equal([1,2], e.peek_values)
|
||||
assert_equal([1,2], e.next)
|
||||
e = o.to_enum
|
||||
assert_equal(nil, e.peek)
|
||||
assert_equal([], e.next_values)
|
||||
assert_equal(1, e.peek)
|
||||
assert_equal([1], e.next_values)
|
||||
assert_equal([1,2], e.peek)
|
||||
assert_equal([1,2], e.next_values)
|
||||
end
|
||||
|
||||
def test_feed
|
||||
o = Object.new
|
||||
def o.each(ary)
|
||||
ary << yield
|
||||
ary << yield
|
||||
ary << yield
|
||||
end
|
||||
ary = []
|
||||
e = o.to_enum(:each, ary)
|
||||
e.next
|
||||
e.feed 1
|
||||
e.next
|
||||
e.feed 2
|
||||
e.next
|
||||
e.feed 3
|
||||
assert_raise(StopIteration) { e.next }
|
||||
assert_equal([1,2,3], ary)
|
||||
end
|
||||
|
||||
def test_feed_mixed
|
||||
o = Object.new
|
||||
def o.each(ary)
|
||||
ary << yield
|
||||
ary << yield
|
||||
ary << yield
|
||||
end
|
||||
ary = []
|
||||
e = o.to_enum(:each, ary)
|
||||
e.next
|
||||
e.feed 1
|
||||
e.next
|
||||
e.next
|
||||
e.feed 3
|
||||
assert_raise(StopIteration) { e.next }
|
||||
assert_equal([1,nil,3], ary)
|
||||
end
|
||||
|
||||
def test_feed_twice
|
||||
o = Object.new
|
||||
def o.each(ary)
|
||||
ary << yield
|
||||
ary << yield
|
||||
ary << yield
|
||||
end
|
||||
ary = []
|
||||
e = o.to_enum(:each, ary)
|
||||
e.feed 1
|
||||
assert_raise(TypeError) { e.feed 2 }
|
||||
end
|
||||
|
||||
def test_feed_yielder
|
||||
x = nil
|
||||
e = Enumerator.new {|y| x = y.yield; 10 }
|
||||
e.next
|
||||
e.feed 100
|
||||
exc = assert_raise(StopIteration) { e.next }
|
||||
assert_equal(100, x)
|
||||
assert_equal(10, exc.result)
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue