summaryrefslogtreecommitdiff
path: root/test/ruby/test_enumerator.rb
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-08-19 16:36:00 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-08-19 16:36:00 +0000
commit3b4949ffa8602bf5b8fb4be880b9c73c9375d8fa (patch)
treeace672ab48d817ca1927ee8660859cdb2308da2c /test/ruby/test_enumerator.rb
parentb307bd9847b548f0f80621b2c4097a7be28de411 (diff)
* 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
Diffstat (limited to 'test/ruby/test_enumerator.rb')
-rw-r--r--test/ruby/test_enumerator.rb125
1 files changed, 125 insertions, 0 deletions
diff --git a/test/ruby/test_enumerator.rb b/test/ruby/test_enumerator.rb
index f8a3b3e32a..333dac79cb 100644
--- a/test/ruby/test_enumerator.rb
+++ b/test/ruby/test_enumerator.rb
@@ -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