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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
|
##
# Range(Ext) Test
assert('Range#cover?') do
assert_true ("a".."z").cover?("c")
assert_true !("a".."z").cover?("5")
assert_true ("a".."z").cover?("cc")
assert_true ("a"..).cover?("c")
assert_false ("a"..).cover?("5")
assert_true ("a"..).cover?("cc")
end
assert('Range#first') do
assert_equal 10, (10..20).first
assert_equal [10, 11, 12], (10..20).first(3)
assert_equal 10, (10..).first
assert_equal [10, 11, 12], (10..).first(3)
skip unless Object.const_defined?(:Float)
assert_equal [0, 1, 2], (0..Float::INFINITY).first(3)
end
assert('Range#last') do
assert_equal 20, (10..20).last
assert_equal 20, (10...20).last
assert_raise(RangeError) { (10..).last }
assert_raise(RangeError) { (10...).last }
assert_equal [18, 19, 20], (10..20).last(3)
assert_equal [17, 18, 19], (10...20).last(3)
end
assert('Range#size') do
assert_equal 42, (1..42).size
assert_equal 41, (1...42).size
assert_nil ('a'..'z').size
assert_nil ('a'..).size
assert_nil (1..).size unless Object.const_defined?(:Float)
skip unless Object.const_defined?(:Float)
assert_equal 6, (1...6.3).size
assert_equal 5, (1...6.0).size
assert_equal 5, (1.1...6).size
assert_equal 15, (1.0..15.9).size
assert_equal Float::INFINITY, (0..Float::INFINITY).size
assert_equal Float::INFINITY, (1..).size
assert_equal Float::INFINITY, (1...).size
assert_equal Float::INFINITY, (1.0..).size
end
assert('Range#max') do
# returns the maximum value in the range when called with no arguments
assert_equal 10, (1..10).max
assert_equal 9, (1...10).max
assert_equal 536870911, (0...2**29).max
# returns nil when the endpoint is less than the start point
assert_equal nil, (100..10).max
# returns nil when the endpoint equals the start point and the range is exclusive
assert_equal nil, (5...5).max
# returns the endpoint when the endpoint equals the start point and the range is inclusive
assert_equal 5, (5..5).max
# raises RangeError when called on an endless range
assert_raise(RangeError) { (10..).max }
assert_raise(RangeError) { (10...).max }
skip unless Object.const_defined?(:Float)
# returns the maximum value in the Float range when called with no arguments
assert_equal 908.1111, (303.20..908.1111).max
# raises TypeError when called on an exclusive range and a non Integer value
assert_raise(TypeError) { (303.20...908.1111).max }
# returns nil when the endpoint is less than the start point in a Float range
assert_equal nil, (3003.20..908.1111).max
end
assert('Range#max given a block') do
# passes each pair of values in the range to the block
acc = []
(1..10).max do |a, b|
acc << a
acc << b
a
end
(1..10).each do |value|
assert_true acc.include?(value)
end
# passes each pair of elements to the block in reversed order
acc = []
(1..5).max do |a, b|
acc << [a, b]
a
end
assert_equal [[2, 1], [3, 2], [4, 3], [5, 4]], acc
# returns the element the block determines to be the maximum
assert_equal 1, ((1..3).max { |_a, _b| -3 })
# returns nil when the endpoint is less than the start point
assert_equal nil, ((100..10).max { |x, y| x <=> y })
assert_equal nil, ((5...5).max { |x, y| x <=> y })
end
assert('Range#min') do
# returns the minimum value in the range when called with no arguments
assert_equal 1, (1..10).min
assert_equal 1, (1...10).min
assert_equal 1, (1..).min
# returns nil when the start point is greater than the endpoint
assert_equal nil, (100..10).min
# returns nil when the endpoint equals the start point and the range is exclusive
assert_equal nil, (5...5).min
# returns the endpoint when the endpoint equals the start point and the range is inclusive
assert_equal 5, (5..5).min
skip unless Object.const_defined?(:Float)
# returns the minimum value in the Float range when called with no arguments
assert_equal 303.20, (303.20..908.1111).min
assert_equal 1, (1.0..).min
# returns nil when the start point is greater than the endpoint in a Float range
assert_equal nil, (3003.20..908.1111).min
end
assert('Range#min given a block') do
# raise when called with a block in endless range
assert_raise(RangeError) { (1..).min{} }
# passes each pair of values in the range to the block
acc = []
(1..10).min do |a, b|
acc << a
acc << b
a
end
(1..10).each do |value|
assert_true acc.include?(value)
end
# passes each pair of elements to the block in reversed order
acc = []
(1..5).min do |a, b|
acc << [a, b]
a
end
assert_equal [[2, 1], [3, 1], [4, 1], [5, 1]], acc
# returns the element the block determines to be the minimum
assert_equal 3, ((1..3).min { |_a, _b| -3 })
# returns nil when the start point is greater than the endpoint
assert_equal nil, ((100..10).min { |x, y| x <=> y })
assert_equal nil, ((5...5).min { |x, y| x <=> y })
end
|