summaryrefslogtreecommitdiff
path: root/test/ruby/test_enumerator.rb
blob: 60864258c39878d6e5ec95f8db92f6ad04663a8b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
require 'test/unit'

class TestEnumerator < Test::Unit::TestCase
  def enum_test obj
    i = 0
    obj.map{|e|
      [i+=1, e]
    }.sort
  end

  def test_iterators
    assert_equal [[1, 0], [2, 1], [3, 2]], enum_test(3.times)
    assert_equal [[1, :x], [2, :y], [3, :z]], enum_test([:x, :y, :z].each)
    assert_equal [[1, [:x, 1]], [2, [:y, 2]]], enum_test({:x=>1, :y=>2})
  end

  ## Enumerator as Iterator

  def test_next
    e = 3.times
    3.times{|i|
      assert_equal i, e.next
    }
    assert_raise(StopIteration){e.next}
  end

  def test_next?
    e = 3.times
    assert_equal true, e.next?
    3.times{|i|
      assert_equal true, e.next?
      assert_equal i, e.next
    }
    assert_equal false, e.next?
  end

  def test_nested_itaration
    def (o = Object.new).each
      yield :ok1
      yield [:ok2, :x].each.next
    end
    e = o.to_enum
    assert_equal :ok1, e.next
    assert_equal :ok2, e.next
    assert_raise(StopIteration){e.next}
  end
end