/
test_reader.rb
131 lines (116 loc) · 3.25 KB
/
test_reader.rb
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# encoding: UTF-8
require "minitest/autorun"
require "mungr/reader"
class TestReader < MiniTest::Unit::TestCase
##############
### Status ###
##############
def test_a_new_reader_is_not_prepared_read_or_finished
reader
assert(!@reader.prepared?, "A new Reader was already prepared?().")
assert(!@reader.read?, "A new Reader was already read?().")
assert(!@reader.finished?, "A new Reader was already finished?().")
end
def test_a_reader_is_prepared_before_the_first_read
order = Array.new
reader do |r|
r.prepare { order << :prepared }
r.read { order << :read }
end
assert(!@reader.prepared?, "The Reader was prepared?() before the read().")
@reader.read
assert( @reader.prepared?,
"The Reader was not prepared?() after the read()." )
assert_equal([:prepared, :read], order)
end
def test_exhausting_a_reader_sets_read_and_finished
order = Array.new
reader do |r|
r.read {
order << :read
nil # signal that we are exhausted
}
r.finish { order << :finished }
end
assert(!@reader.read?, "The Reader was read?() before being exhausted.")
assert( !@reader.finished?,
"The Reader was finished?() before being exhausted." )
@reader.read
assert(@reader.read?, "The Reader was read?() after being exhausted.")
assert( @reader.finished?,
"The Reader was finished?() after being exhausted." )
assert_equal([:read, :finished], order)
end
###############
### Context ###
###############
def test_any_value_returned_from_prepare_is_forwarded_to_read_and_finish
object = Object.new
reader do |r|
r.prepare { object }
r.read { |context|
assert_same(object, context)
nil # signal that we are exhausted
}
r.finish { |context| assert_same(object, context) }
end.read
end
###############
### Reading ###
###############
def test_calling_read_a_with_block_sets_the_code_and_further_calls_run_it
data = (1..3).to_a
expected = data.dup
reader do |r|
r.read { data.shift }
end
4.times do |i|
assert_equal(expected[i], @reader.read)
end
end
def test_a_nil_signals_that_input_is_exhausted_and_no_more_reads_are_made
reader do |r|
r.prepare { [nil] + (1..3).to_a }
r.read { |data| data.shift }
end
5.times do
assert_nil(@reader.read)
end
end
def test_prepare_is_called_once_before_the_first_read
calls = Array.new
reader do |r|
r.prepare {
calls << :prepare
(1..3).to_a
}
r.read { |data|
calls << :read
data.shift
}
end
@reader.read until @reader.read?
assert_equal([:prepare, :read, :read, :read, :read], calls)
end
def test_finish_is_called_once_when_the_input_is_exhausted
calls = Array.new
reader do |r|
r.prepare { (1..3).to_a }
r.read { |data|
calls << :read
data.shift
}
r.finish { calls << :finish }
end
5.times do
@reader.read
end
assert_equal([:read, :read, :read, :read, :finish], calls)
end
#######
private
#######
def reader(&init)
@reader = Mungr::Reader.new(&init)
end
end