summaryrefslogtreecommitdiff
path: root/test/ruby/test_enumerator.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/ruby/test_enumerator.rb')
-rw-r--r--test/ruby/test_enumerator.rb45
1 files changed, 45 insertions, 0 deletions
diff --git a/test/ruby/test_enumerator.rb b/test/ruby/test_enumerator.rb
index 54dfebb814..1e306c33a2 100644
--- a/test/ruby/test_enumerator.rb
+++ b/test/ruby/test_enumerator.rb
@@ -811,4 +811,49 @@ class TestEnumerator < Test::Unit::TestCase
e5.inspect
)
end
+
+ def test_produce
+ assert_raise(ArgumentError) { Enumerator.produce }
+
+ # Without initial object
+ passed_args = []
+ enum = Enumerator.produce { |obj| passed_args << obj; (obj || 0).succ }
+ assert_instance_of(Enumerator, enum)
+ assert_equal Float::INFINITY, enum.size
+ assert_equal [1, 2, 3], enum.take(3)
+ assert_equal [nil, 1, 2], passed_args
+
+ # With initial object
+ passed_args = []
+ enum = Enumerator.produce(1) { |obj| passed_args << obj; obj.succ }
+ assert_instance_of(Enumerator, enum)
+ assert_equal Float::INFINITY, enum.size
+ assert_equal [1, 2, 3], enum.take(3)
+ assert_equal [1, 2], passed_args
+
+ # Raising StopIteration
+ words = "The quick brown fox jumps over the lazy dog.".scan(/\w+/)
+ enum = Enumerator.produce { words.shift or raise StopIteration }
+ assert_equal Float::INFINITY, enum.size
+ assert_instance_of(Enumerator, enum)
+ assert_equal %w[The quick brown fox jumps over the lazy dog], enum.to_a
+
+ # Raising StopIteration
+ object = [[[["abc", "def"], "ghi", "jkl"], "mno", "pqr"], "stuv", "wxyz"]
+ enum = Enumerator.produce(object) { |obj|
+ obj.respond_to?(:first) or raise StopIteration
+ obj.first
+ }
+ assert_equal Float::INFINITY, enum.size
+ assert_instance_of(Enumerator, enum)
+ assert_nothing_raised {
+ assert_equal [
+ [[[["abc", "def"], "ghi", "jkl"], "mno", "pqr"], "stuv", "wxyz"],
+ [[["abc", "def"], "ghi", "jkl"], "mno", "pqr"],
+ [["abc", "def"], "ghi", "jkl"],
+ ["abc", "def"],
+ "abc",
+ ], enum.to_a
+ }
+ end
end