9 def assert_take(exp, enumerator)
12 enumerator.each do |v|
17 assert_equal exp, result
20 assert 'Enumerator.class' do
21 assert_equal Class, Enumerator.class
24 assert 'Enumerator.superclass' do
25 assert_equal Object, Enumerator.superclass
28 assert 'Enumerator.new' do
29 assert_equal [0,1,2], 3.times.map{|i| i}.sort
30 assert_equal [:x,:y,:z], [:x,:y,:z].each.map{|i| i}.sort
31 assert_equal [[:x,1],[:y,2]], {x:1, y:2}.each.map{|i| i}.sort
32 assert_equal [1,2,3], @obj.to_enum(:foo, 1,2,3).to_a
33 assert_take [1,2,3], Enumerator.new { |y| i = 0; loop { y << (i += 1) } }
34 assert_raise(ArgumentError) { Enumerator.new }
37 fib = Enumerator.new do |y|
44 assert_take [1,1,2,3,5,8,13,21,34,55], fib
47 assert 'Enumerator#initialize_copy' do
48 assert_equal [1, 2, 3], @obj.to_enum(:foo, 1, 2, 3).dup.to_a
49 e = @obj.to_enum :foo, 1, 2, 3
50 assert_nothing_raised { assert_equal(1, e.next) }
51 assert_raise(TypeError) { e.dup }
53 e = Enumerator.new { |y| i = 0; loop { y << (i += 1) } }.dup
54 assert_nothing_raised { assert_equal(1, e.next) }
55 assert_raise(TypeError) { e.dup }
58 assert 'Enumerator#with_index' do
59 assert_equal([[1,0],[2,1],[3,2]], @obj.to_enum(:foo, 1, 2, 3).with_index.to_a)
60 assert_equal([[1,5],[2,6],[3,7]], @obj.to_enum(:foo, 1, 2, 3).with_index(5).to_a)
62 @obj.to_enum(:foo, 1, 2, 3).with_index(10).with_index(20) { |*i| a << i }
63 assert_equal [[[1, 10], 20], [[2, 11], 21], [[3, 12], 22]], a
66 assert 'Enumerator#with_index string offset' do
67 assert_raise(TypeError){ @obj.to_enum(:foo, 1, 2, 3).with_index('1').to_a }
70 assert 'Enumerator#each_with_index' do
71 assert_equal([[1,0],[2,1],[3,2]], @obj.to_enum(:foo, 1, 2, 3).each_with_index.to_a)
73 @obj.to_enum(:foo, 1, 2, 3).each_with_index {|*i| a << i}
74 assert_equal([[1, 0], [2, 1], [3, 2]], a)
77 assert 'Enumerator#with_object' do
79 ret = (1..10).each.with_object(obj) {|i, memo|
83 assert_true(obj.equal?(ret))
84 assert_equal([55, 3628800], ret)
87 assert 'Enumerator#with_object arguments' do
88 to_three = Enumerator.new do |y|
95 to_three_with_string = to_three.with_object("foo")
96 to_three_with_string.each do |x,string|
99 assert_equal ["foo:0","foo:1","foo:2"], a
102 assert 'Enumerator#inspect' do
104 assert_equal('#<Enumerator: 0..10:each>', e.inspect)
105 e = 'FooObject'.enum_for(:foo, 1)
106 assert_equal('#<Enumerator: "FooObject":foo(1)>', e.inspect)
107 e = 'FooObject'.enum_for(:foo, 1, 2, 3)
108 assert_equal('#<Enumerator: "FooObject":foo(1, 2, 3)>', e.inspect)
109 e = nil.enum_for(:to_s)
110 assert_equal('#<Enumerator: nil:to_s>', e.inspect)
113 assert 'Enumerator#each' do
120 e = o.to_enum.each(ary)
122 assert_equal([1], ary)
125 assert 'Enumerator#each arguments' do
128 def obj.each_arg(a, b=:b, *rest)
135 enum = obj.to_enum :each_arg, :a, :x
137 assert_equal [:a, :x, []], enum.each.to_a
138 assert_true enum.each.equal?(enum)
139 assert_equal :method_returned, enum.each { |elm| elm }
141 assert_equal [:a, :x, [:y, :z]], enum.each(:y, :z).to_a
142 assert_false enum.each(:y, :z).equal?(enum)
143 assert_equal :method_returned, enum.each(:y, :z) { |elm| elm }
146 assert 'Enumerator#next' do
149 assert_equal i, e.next
151 assert_raise(StopIteration) { e.next }
154 assert 'Enumerator#next_values' do
162 assert_equal nil, e.next
163 assert_equal 1, e.next
164 assert_equal [1,2], e.next
166 assert_equal [], e.next_values
167 assert_equal [1], e.next_values
168 assert_equal [1,2], e.next_values
171 assert 'Enumerator#peek' do
174 assert_equal 1, e.peek
175 assert_equal 1, e.peek
176 assert_equal 1, e.next
177 assert_raise(StopIteration) { e.peek }
178 assert_raise(StopIteration) { e.peek }
181 assert 'Enumerator#peek modify' do
189 assert_equal([1,2], e.peek)
192 assert 'Enumerator#peek_values' do
200 assert_equal nil, e.peek
201 assert_equal nil, e.next
202 assert_equal 1, e.peek
203 assert_equal 1, e.next
204 assert_equal [1,2], e.peek
205 assert_equal [1,2], e.next
207 assert_equal [], e.peek_values
208 assert_equal [], e.next_values
209 assert_equal [1], e.peek_values
210 assert_equal [1], e.next_values
211 assert_equal [1,2], e.peek_values
212 assert_equal [1,2], e.next_values
214 assert_equal [], e.peek_values
215 assert_equal nil, e.next
216 assert_equal [1], e.peek_values
217 assert_equal 1, e.next
218 assert_equal [1,2], e.peek_values
219 assert_equal [1,2], e.next
221 assert_equal nil, e.peek
222 assert_equal [], e.next_values
223 assert_equal 1, e.peek
224 assert_equal [1], e.next_values
225 assert_equal [1,2], e.peek
226 assert_equal [1,2], e.next_values
229 assert 'Enumerator#peek_values modify' do
237 assert_equal [1,2], e.peek
240 assert 'Enumerator#feed' do
248 e = o.to_enum :each, ary
255 assert_raise(StopIteration) { e.next }
256 assert_equal [1,2,3], ary
259 assert 'Enumerator#feed mixed' do
267 e = o.to_enum :each, ary
273 assert_raise(StopIteration) { e.next }
274 assert_equal [1,nil,3], ary
277 assert 'Enumerator#feed twice' do
285 e = o.to_enum :each, ary
287 assert_raise(TypeError) { e.feed 2 }
290 assert 'Enumerator#feed before first next' do
298 e = o.to_enum :each, ary
302 assert_equal [1], ary
305 assert 'Enumerator#feed yielder' do
307 e = Enumerator.new {|y| x = y.yield; 10 }
310 assert_raise(StopIteration) { e.next }
314 assert 'Enumerator#rewind' do
315 e = @obj.to_enum(:foo, 1, 2, 3)
316 assert_equal 1, e.next
317 assert_equal 2, e.next
319 assert_equal 1, e.next
320 assert_equal 2, e.next
321 assert_equal 3, e.next
322 assert_raise(StopIteration) { e.next }
325 assert 'Enumerator#rewind clear feed' do
333 e = o.to_enum(:each, ary)
341 assert_equal([1,nil], ary)
344 assert 'Enumerator#rewind clear' do
352 e = o.to_enum :each, ary
360 assert_equal [1,nil], ary
363 assert 'Enumerator::Generator' do
364 # note: Enumerator::Generator is a class just for internal
365 g = Enumerator::Generator.new {|y| y << 1 << 2 << 3; :foo }
368 assert_equal(:foo, g.each {|x| a << x })
369 assert_equal([1, 2, 3], a)
371 assert_equal(:foo, g2.each {|x| a << x })
372 assert_equal([1, 2, 3], a)
375 assert 'Enumerator::Generator args' do
376 g = Enumerator::Generator.new {|y, x| y << 1 << 2 << 3; x }
378 assert_equal(:bar, g.each(:bar) {|x| a << x })
379 assert_equal([1, 2, 3], a)
382 assert 'Enumerator::Yielder' do
383 # note: Enumerator::Yielder is a class just for internal
385 y = Enumerator::Yielder.new {|x| a << x }
386 assert_equal(y, y << 1 << 2 << 3)
387 assert_equal([1, 2, 3], a)
390 y = Enumerator::Yielder.new {|x| a << x }
391 assert_equal([1], y.yield(1))
392 assert_equal([1, 2], y.yield(2))
393 assert_equal([1, 2, 3], y.yield(3))
395 assert_raise(LocalJumpError) { Enumerator::Yielder.new }
398 assert 'next after StopIteration' do
401 assert_equal(1, e.next)
402 assert_raise(StopIteration) { e.next }
403 assert_raise(StopIteration) { e.next }
405 assert_equal(1, e.next)
406 assert_raise(StopIteration) { e.next }
407 assert_raise(StopIteration) { e.next }
411 assert_nothing_raised do
413 foo = [1,2,3].to_enum
420 assert 'nested iteration' do
421 def (o = Object.new).each
423 yield [:ok2, :x].each.next
426 assert_equal :ok1, e.next
427 assert_equal :ok2, e.next
428 assert_raise(StopIteration) { e.next }
431 assert 'Kernel#to_enum' do
433 assert_equal Enumerator, [].to_enum.class
434 assert_nothing_raised { e = [].to_enum(:_not_implemented_) }
435 assert_raise(NoMethodError) { e.first }
438 assert 'modifying existing methods' do
439 assert_equal Enumerator, loop.class
443 assert_equal i, e.next
448 assert 'Integral#times' do
452 b.with_object(c) do |i, obj|
456 assert_equal Enumerator, b.class
457 assert_equal [0,1,2], c
460 assert 'Enumerable#each_with_index' do
461 assert_equal [['a',0],['b',1],['c',2]], ['a','b','c'].each_with_index.to_a
464 assert 'Enumerable#map' do
467 c = b.with_index do |i, index|
470 assert_equal [1,2,3], a
471 assert_equal [[1,0],[4,1],[9,4]], c
474 assert 'Enumerable#find_all' do
475 assert_equal [[3,4]], [[1,2],[3,4],[5,6]].find_all.each{ |i| i[1] == 4 }
478 assert 'Array#each_index' do
482 b.with_index do |index1,index2|
483 c << [index1+2,index2+5]
485 assert_equal [1,2,3], a
486 assert_equal [[2,5],[3,6],[4,7]], c
489 assert 'Array#map!' do
492 b.with_index do |i, index|
495 assert_equal [[1,0],[4,1],[9,4]], a
498 assert 'Hash#each' do
505 assert_equal [[:a,1], [:b,2]], c.sort
508 assert 'Hash#each_key' do
509 assert_equal [:a,:b], {a:1,b:2}.each_key.to_a.sort
512 assert 'Hash#each_value' do
513 assert_equal [1,2], {a:1,b:2}.each_value.to_a.sort
516 assert 'Hash#select' do
518 hret = h.select.with_index {|a,_b| a[1] == 4}
519 assert_equal({3=>4}, hret)
520 assert_equal({1=>2,3=>4,5=>6}, h)
523 assert 'Hash#select!' do
525 hret = h.select!.with_index {|a,_b| a[1] == 4}
527 assert_equal({3=>4}, h)
530 assert 'Hash#reject' do
532 hret = h.reject.with_index {|a,_b| a[1] == 4}
533 assert_equal({1=>2,5=>6}, hret)
534 assert_equal({1=>2,3=>4,5=>6}, h)
537 assert 'Hash#reject!' do
539 hret = h.reject!.with_index {|a,_b| a[1] == 4}
541 assert_equal({1=>2,5=>6}, h)
544 assert 'Range#each' do
551 assert_equal [1,2,3,4,5], c
554 assert 'Enumerable#zip' do
555 assert_equal [[1, 10], [2, 11], [3, 12]], [1,2,3].zip(10..Float::INFINITY)
558 assert_equal nil, [1,2,3].zip(10..Float::INFINITY) { |i| ret << i }
559 assert_equal [[1, 10], [2, 11], [3, 12]], ret
561 assert_raise(TypeError) { [1].zip(1) }
564 assert 'Enumerator.produce' do
565 assert_raise(ArgumentError) { Enumerator.produce }
567 # Without initial object
569 enum = Enumerator.produce {|obj| passed_args << obj; (obj || 0).succ }
570 assert_equal Enumerator, enum.class
571 assert_take [1, 2, 3], enum
572 assert_equal [nil, 1, 2], passed_args
574 # With initial object
576 enum = Enumerator.produce(1) {|obj| passed_args << obj; obj.succ }
577 assert_take [1, 2, 3], enum
578 assert_equal [1, 2], passed_args
580 # Raising StopIteration
581 words = %w[The quick brown fox jumps over the lazy dog]
582 enum = Enumerator.produce { words.shift or raise StopIteration }
583 assert_equal %w[The quick brown fox jumps over the lazy dog], enum.to_a
585 # Raising StopIteration
586 object = [[[["abc", "def"], "ghi", "jkl"], "mno", "pqr"], "stuv", "wxyz"]
587 enum = Enumerator.produce(object) {|obj|
588 obj.respond_to?(:first) or raise StopIteration
591 assert_nothing_raised {
593 [[[["abc", "def"], "ghi", "jkl"], "mno", "pqr"], "stuv", "wxyz"],
594 [[["abc", "def"], "ghi", "jkl"], "mno", "pqr"],
595 [["abc", "def"], "ghi", "jkl"],