range_extd 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/ChangeLog +14 -0
- data/README.en.rdoc +317 -0
- data/README.ja.rdoc +300 -0
- data/Rakefile +9 -0
- data/lib/range_extd/infinity/infinity.rb +386 -0
- data/lib/range_extd/range_extd.rb +1137 -0
- data/range_extd.gemspec +47 -0
- data/test/test_range_extd.rb +1253 -0
- metadata +61 -0
data/range_extd.gemspec
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{range_extd}
|
5
|
+
s.version = "0.1.0"
|
6
|
+
# s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
7
|
+
# s.executables << 'hola'
|
8
|
+
# s.bindir = 'bin'
|
9
|
+
s.authors = ["Masa Sakano"]
|
10
|
+
s.date = %q{2014-04-27}
|
11
|
+
s.summary = %q{RangeExtd - Extended Range class with exclude_begin and open-ends}
|
12
|
+
s.description = %q{This defines a subclass of Range, RangeExtd and its subclass, RangeExtd::Infinity. The former defines a range that enables an exclusion of the begin boundary, in addition to the end boundary as in the built-in Range, and accepts open-ended ranges to infinity for either (or both) positive/negative direction. The latter has the two constant objects, POSITIVE and NEGATIVE, and they are a generalised Infinity of Float::INFINITY to any Comparable objects.}
|
13
|
+
# s.email = %q{abc@example.com}
|
14
|
+
s.extra_rdoc_files = [
|
15
|
+
# "LICENSE",
|
16
|
+
"README.en.rdoc",
|
17
|
+
"README.ja.rdoc",
|
18
|
+
]
|
19
|
+
s.license = 'MIT'
|
20
|
+
s.files = [
|
21
|
+
#".document",
|
22
|
+
#".gitignore",
|
23
|
+
#"VERSION",
|
24
|
+
"ChangeLog",
|
25
|
+
"README.en.rdoc",
|
26
|
+
"README.ja.rdoc",
|
27
|
+
"Rakefile",
|
28
|
+
"range_extd.gemspec",
|
29
|
+
"lib/range_extd/range_extd.rb",
|
30
|
+
"lib/range_extd/infinity/infinity.rb",
|
31
|
+
"test/test_range_extd.rb",
|
32
|
+
]
|
33
|
+
# s.add_runtime_dependency 'library', '~> 2.2', '>= 2.2.1' # 2.2.1 <= Ver < 2.3.0
|
34
|
+
# s.add_development_dependency "bourne", [">= 0"]
|
35
|
+
# s.homepage = %q{http://}
|
36
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
37
|
+
# s.require_paths = ["lib"]
|
38
|
+
s.required_ruby_version = '>= 2.0'
|
39
|
+
s.test_files = [
|
40
|
+
"test/test_range_extd.rb",
|
41
|
+
]
|
42
|
+
# s.test_files = Dir.glob('test/tc_*.rb')
|
43
|
+
# s.requirements << 'libmagick, v6.0' # Simply, info to users.
|
44
|
+
# s.rubygems_version = %q{1.3.5} # This is always set automatically!!
|
45
|
+
|
46
|
+
end
|
47
|
+
|
@@ -0,0 +1,1253 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
$stdout.sync=true
|
4
|
+
$stderr.sync=true
|
5
|
+
# print '$LOAD_PATH=';p $LOAD_PATH
|
6
|
+
arlibrelpath = []
|
7
|
+
arlibbase = %w(range_extd range_extd/infinity) # range_extd/infinity is actually loaded from range_extd. But by writing here, the absolute path will be displayed.
|
8
|
+
|
9
|
+
arlibbase.each do |elibbase|
|
10
|
+
elibbase
|
11
|
+
|
12
|
+
arAllPaths = []
|
13
|
+
er=nil
|
14
|
+
pathnow = nil
|
15
|
+
(['../lib/', 'lib/', ''].map{|i| i+elibbase+'/'} + ['']).each do |dir|
|
16
|
+
# eg., pathcand = %w(../lib/rangesmaller/ lib/rangesmaller/ rangesmaller/) + ['']
|
17
|
+
begin
|
18
|
+
s = dir+File.basename(elibbase)
|
19
|
+
arAllPaths.push(s)
|
20
|
+
#print "Trying: "; puts s
|
21
|
+
require s
|
22
|
+
pathnow = s
|
23
|
+
break
|
24
|
+
rescue LoadError => er
|
25
|
+
end
|
26
|
+
end # (['../lib/', 'lib/', ''].map{|i| i+elibbase+'/'} + '').each do |dir|
|
27
|
+
|
28
|
+
if pathnow.nil?
|
29
|
+
warn "Warning: All the attempts to load the following files have failed. Abort..."
|
30
|
+
warn arAllPaths.inspect
|
31
|
+
warn " NOTE: It may be because a require statement in that file failed,
|
32
|
+
rather than requiring the file itself.
|
33
|
+
Check with % ruby -r#{File.basename(elibbase)} -e p
|
34
|
+
or maybe add env RUBYLIB=$RUBYLIB:`pwd`"
|
35
|
+
# p $LOADED_FEATURES.grep(/#{Regexp.quote(File.basename(elibbase)+'.rb')}$/)
|
36
|
+
raise er
|
37
|
+
else
|
38
|
+
#print pathnow," is loaded!\n"
|
39
|
+
arlibrelpath.push pathnow
|
40
|
+
end
|
41
|
+
end # arlibbase.each do |elibbase|
|
42
|
+
|
43
|
+
print "NOTE: Library relative paths: "; p arlibrelpath
|
44
|
+
print "NOTE: Library full paths:\n"
|
45
|
+
arlibbase.each do |elibbase|
|
46
|
+
p $LOADED_FEATURES.grep(/#{Regexp.quote(File.basename(elibbase)+'.rb')}$/)
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
#################################################
|
51
|
+
# Unit Test
|
52
|
+
#################################################
|
53
|
+
|
54
|
+
#if $0 == __FILE__
|
55
|
+
require 'minitest/unit'
|
56
|
+
require 'minitest/autorun'
|
57
|
+
# MiniTest::Unit.autorun
|
58
|
+
|
59
|
+
# Taken from ((<URL:http://www.ruby-doc.org/core-2.1.1/Range.html>))
|
60
|
+
class Xs # represent a string of 'x's
|
61
|
+
include Comparable
|
62
|
+
attr :length
|
63
|
+
def initialize(n)
|
64
|
+
@length = n
|
65
|
+
end
|
66
|
+
def succ
|
67
|
+
Xs.new(@length + 1)
|
68
|
+
end
|
69
|
+
def <=>(other)
|
70
|
+
@length <=> other.length
|
71
|
+
end
|
72
|
+
def to_s
|
73
|
+
sprintf "%2d #{inspect}", @length
|
74
|
+
end
|
75
|
+
def inspect
|
76
|
+
'x' * @length
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# Used in test_overwrite_compare
|
81
|
+
class CLComparable
|
82
|
+
include Comparable
|
83
|
+
def <=>(c)
|
84
|
+
# Badly designed, deliberately.
|
85
|
+
if c == 7
|
86
|
+
"XXX"
|
87
|
+
elsif c == 8
|
88
|
+
__method__ # => :<=>
|
89
|
+
else
|
90
|
+
nil
|
91
|
+
# super # BTW, this is the statement that should be.
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
# Used in test_rangeextd_new_infinity
|
97
|
+
# The absolute minimum Comparable class.
|
98
|
+
class CLC2
|
99
|
+
include Comparable
|
100
|
+
end
|
101
|
+
|
102
|
+
# Used in test_range_c3c4 and test_rangeextd_new_infinity_c3
|
103
|
+
class CLC3
|
104
|
+
include Comparable
|
105
|
+
# alias :original_compare :<=> if !self.method_defined?(:original_compare) # No overwriting.
|
106
|
+
def <=>(c)
|
107
|
+
if c == 7
|
108
|
+
"XXX" # Bad statement. Just for the sake of test.
|
109
|
+
elsif c == 8
|
110
|
+
-1
|
111
|
+
elsif c.class == CLC4
|
112
|
+
-1 # basically, CLC3 < CLC4
|
113
|
+
else # When self does not know what to do with c.
|
114
|
+
super # to call Object#<=>
|
115
|
+
#original_compare(c) # to call the original
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
# Used in test_range_c3c4
|
121
|
+
class CLC4
|
122
|
+
include Comparable
|
123
|
+
def <=>(c)
|
124
|
+
if c.class == CLC3
|
125
|
+
1 # basically, CLC3 < CLC4
|
126
|
+
else
|
127
|
+
super
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
# Used in test_bsearch_special
|
133
|
+
class Special
|
134
|
+
def [](f)
|
135
|
+
(f>3.5 && f<4) ? true : false
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
def RaE(*rest)
|
140
|
+
RangeExtd(*rest)
|
141
|
+
end
|
142
|
+
T = true
|
143
|
+
F = false
|
144
|
+
|
145
|
+
class TestUnitFoo < MiniTest::Unit::TestCase
|
146
|
+
def setup
|
147
|
+
@ib = 1
|
148
|
+
@ie = 6
|
149
|
+
@r11 = (@ib..@ie) # incl, incl
|
150
|
+
@r12 = (@ib...@ie) # incl, excl
|
151
|
+
@s11 = RangeExtd.new(@r11, false) # (1..6) incl, incl
|
152
|
+
@s21 = RangeExtd.new(@r11, true) # (1<..6) excl, incl
|
153
|
+
@s12 = RangeExtd.new(@r12, false) # (1...6) incl, excl
|
154
|
+
@s22 = RangeExtd.new(@r12, true) # (1<...6) excl, excl
|
155
|
+
end
|
156
|
+
# teardown is not often used.
|
157
|
+
def teardown
|
158
|
+
@foo = nil
|
159
|
+
end
|
160
|
+
|
161
|
+
def test_object_compare
|
162
|
+
assert_equal 0, (3 <=> 3)
|
163
|
+
assert_equal 1, (4 <=> 3)
|
164
|
+
assert_equal 1, (?b <=> ?a)
|
165
|
+
assert_equal 0, (nil <=> nil)
|
166
|
+
assert_equal 0, (true <=> true)
|
167
|
+
assert_equal 0, (IO <=> IO)
|
168
|
+
end # def test_object_compare
|
169
|
+
|
170
|
+
def test_overwrite_compare
|
171
|
+
assert_equal nil, (Float::INFINITY <=> RangeExtd::Infinity::POSITIVE)
|
172
|
+
assert_equal nil, RangeExtd::Infinity.overwrite_compare(Numeric)
|
173
|
+
assert_equal nil, (Float::INFINITY <=> RangeExtd::Infinity::POSITIVE) # no change
|
174
|
+
assert_equal nil, RangeExtd::Infinity.overwrite_compare(3)
|
175
|
+
assert_equal nil, (Float::INFINITY <=> RangeExtd::Infinity::POSITIVE) # no change
|
176
|
+
assert_equal false, RangeExtd::Infinity.overwrite_compare(true) # no change
|
177
|
+
assert_equal 1, (RangeExtd::Infinity::POSITIVE <=> 's')
|
178
|
+
assert_equal(-1, ('s' <=> RangeExtd::Infinity::POSITIVE))
|
179
|
+
assert_equal(-1, (RangeExtd::Infinity::NEGATIVE <=> 's'))
|
180
|
+
assert_equal 1, ('s' <=> RangeExtd::Infinity::NEGATIVE)
|
181
|
+
assert_equal nil, RangeExtd::Infinity.overwrite_compare('s') # no change
|
182
|
+
assert_equal 1, (RangeExtd::Infinity::POSITIVE <=> 's')
|
183
|
+
assert_equal(-1, ('s' <=> RangeExtd::Infinity::POSITIVE))
|
184
|
+
assert_equal(-1, (RangeExtd::Infinity::NEGATIVE <=> 's'))
|
185
|
+
assert_equal 1, ('s' <=> RangeExtd::Infinity::NEGATIVE)
|
186
|
+
assert_equal nil, (RangeExtd::Infinity::POSITIVE <=> [3,5])
|
187
|
+
assert_equal nil, ([3,5] <=> RangeExtd::Infinity::POSITIVE) # no change
|
188
|
+
assert_equal nil, (defined? [3,5].compare_before_infinity)
|
189
|
+
assert_equal false, RangeExtd::Infinity.overwrite_compare([3,5])
|
190
|
+
assert_equal false, RangeExtd::Infinity.overwrite_compare(Hash) # no change
|
191
|
+
c = CLComparable.new
|
192
|
+
assert_equal 'XXX', (c <=> 7) # Defined in this code
|
193
|
+
assert_equal nil, (c <=> 1) # Object#<=>
|
194
|
+
assert_equal nil, (c <=> RangeExtd::Infinity::POSITIVE)
|
195
|
+
assert_raises(ArgumentError){ (c..RangeExtd::Infinity::POSITIVE) } # => bad value for range
|
196
|
+
assert_equal true, RangeExtd::Infinity.overwrite_compare(c)
|
197
|
+
assert_equal(-1, (c <=> RangeExtd::Infinity::POSITIVE))
|
198
|
+
return
|
199
|
+
assert_equal 1, (c <=> RangeExtd::Infinity::NEGATIVE)
|
200
|
+
assert_equal 'method', (defined? c.compare_before_infinity) # Backup of the original
|
201
|
+
assert_equal 'XXX', (c.compare_before_infinity(7)) # Preserved.
|
202
|
+
assert_equal 'XXX', (c <=> 7) # Preserved.
|
203
|
+
assert_equal nil, (c <=> 1)
|
204
|
+
assert_equal nil, (c <=> nil)
|
205
|
+
assert_equal :<=>, (c <=> 8)
|
206
|
+
end
|
207
|
+
|
208
|
+
def test_rangeextd_new_infinity_c2
|
209
|
+
c2 = CLC2.new
|
210
|
+
assert_equal nil, (c2 <=> 1) # Object#<=>
|
211
|
+
assert_equal(-1, (c2 <=> RangeExtd::Infinity::POSITIVE))
|
212
|
+
assert_equal 1, (c2 <=> RangeExtd::Infinity::NEGATIVE)
|
213
|
+
r=(c2..RangeExtd::Infinity::POSITIVE)
|
214
|
+
assert_equal RangeExtd::Infinity::POSITIVE, r.end
|
215
|
+
r=(RangeExtd::Infinity::NEGATIVE..c2)
|
216
|
+
assert_equal RangeExtd::Infinity::NEGATIVE, r.begin
|
217
|
+
|
218
|
+
assert_raises(ArgumentError){ (true..RangeExtd::Infinity::POSITIVE) } # => bad value for range
|
219
|
+
end # def test_rangeextd_new_infinity_c2
|
220
|
+
|
221
|
+
def test_range_c3c4
|
222
|
+
c3 = CLC3.new
|
223
|
+
assert_equal nil, (c3 <=> 1) # Object#<=>
|
224
|
+
assert_equal 'XXX', (c3 <=> 7) # Preserved.
|
225
|
+
|
226
|
+
r8=(c3..8)
|
227
|
+
assert_equal 8, r8.end
|
228
|
+
assert !r8.valid? # Because (c3<=>8) is not commutative: (c3<=>8) != (8<=>c3)
|
229
|
+
assert_raises(ArgumentError){ (8..c3) } # => bad value for range (8<=>c3 # => nil)
|
230
|
+
|
231
|
+
c4 = CLC4.new
|
232
|
+
r34=(c3..c4) # c3 and c4 are consistently commutative: c3 < c4
|
233
|
+
r43=(c4..c3)
|
234
|
+
assert_equal c3, r34.begin
|
235
|
+
assert_equal c4, r34.end
|
236
|
+
assert r34.valid?
|
237
|
+
assert !r43.valid? # Because c3 < c4
|
238
|
+
end # def test_range_c3c4
|
239
|
+
|
240
|
+
def test_rangeextd_new_infinity_c3
|
241
|
+
c3 = CLC3.new
|
242
|
+
assert_equal(-1, (c3 <=> RangeExtd::Infinity::POSITIVE))
|
243
|
+
assert_equal 1, (c3 <=> RangeExtd::Infinity::NEGATIVE)
|
244
|
+
|
245
|
+
r=(c3..RangeExtd::Infinity::POSITIVE)
|
246
|
+
assert_equal RangeExtd::Infinity::POSITIVE, r.end
|
247
|
+
r=(RangeExtd::Infinity::NEGATIVE..c3)
|
248
|
+
assert_equal RangeExtd::Infinity::NEGATIVE, r.begin
|
249
|
+
end # def test_rangeextd_new_infinity_c3
|
250
|
+
|
251
|
+
|
252
|
+
def test_new
|
253
|
+
e22 = RangeExtd.new(@s22)
|
254
|
+
assert e22.exclude_begin?
|
255
|
+
assert e22.exclude_end?
|
256
|
+
assert_equal @ib, e22.begin
|
257
|
+
assert_equal @ie, e22.end
|
258
|
+
|
259
|
+
f12 = RangeExtd.new(@r12)
|
260
|
+
assert !f12.exclude_begin?
|
261
|
+
assert f12.exclude_end?
|
262
|
+
assert_equal @ib, f12.begin
|
263
|
+
assert_equal @ie, f12.end
|
264
|
+
|
265
|
+
g11 = RangeExtd.new(@ib, @ie)
|
266
|
+
assert !g11.exclude_begin?
|
267
|
+
assert !g11.exclude_end?
|
268
|
+
assert_equal @ib, g11.begin
|
269
|
+
assert_equal @ie, g11.end
|
270
|
+
|
271
|
+
h12 = RangeExtd.new(@ib, @ie, true)
|
272
|
+
assert h12.exclude_begin?
|
273
|
+
assert !h12.exclude_end?
|
274
|
+
assert_equal @ib, h12.begin
|
275
|
+
assert_equal @ie, h12.end
|
276
|
+
|
277
|
+
j22 = RangeExtd.new(-@ie, -@ib, true, true)
|
278
|
+
assert j22.exclude_begin?
|
279
|
+
assert j22.exclude_end?
|
280
|
+
assert_equal(-@ie, j22.begin)
|
281
|
+
assert_equal(-@ib, j22.end)
|
282
|
+
end
|
283
|
+
|
284
|
+
def test_new_const
|
285
|
+
assert_equal @s22, RangeExtd(@r12, true)
|
286
|
+
end
|
287
|
+
|
288
|
+
def test_new_invalid
|
289
|
+
ae = ArgumentError
|
290
|
+
# Wrong number of parameters
|
291
|
+
assert_raises(ae){ RangeExtd() }
|
292
|
+
assert_raises(ae){ RangeExtd(1,2,3,4,5) }
|
293
|
+
assert_raises(ae){ RangeExtd(1,2,3,4,{},6) }
|
294
|
+
assert_raises(ae){ RangeExtd(1..1,2,3,4) }
|
295
|
+
assert_raises(ae){ RangeExtd(1..1,2,3,{},5) }
|
296
|
+
|
297
|
+
# Wrong range (Object input)
|
298
|
+
assert_raises(ae){ RaE(2, -1) }
|
299
|
+
assert_raises(ae){ RaE(nil, nil) }
|
300
|
+
assert_raises(ae){ RaE(nil, false) }
|
301
|
+
assert_raises(ae){ RaE(?d..?a) }
|
302
|
+
assert_raises(ae){ RaE(?a, 5) }
|
303
|
+
assert_raises(ae){ RaE(0, 0, true, false) }
|
304
|
+
assert_raises(ae){ RaE(0, 0, nil, 1) }
|
305
|
+
assert_equal RangeExtd::NONE, RaE(0, 0, true, true)
|
306
|
+
assert_equal RangeExtd::NONE, RaE(?a, ?a, true, true)
|
307
|
+
assert_equal (0..0), RaE(0, 0, false, false)
|
308
|
+
|
309
|
+
# Wrong range (Infinity input)
|
310
|
+
assert_raises(ae){ RaE(?a, RangeExtd::Infinity::NEGATIVE) }
|
311
|
+
assert_equal (RangeExtd::Infinity::NEGATIVE..?a), RaE(RangeExtd::Infinity::NEGATIVE, ?a)
|
312
|
+
assert_equal (RangeExtd::Infinity::NEGATIVE...?a), RaE(RangeExtd::Infinity::NEGATIVE, ?a, nil, 3)
|
313
|
+
assert_equal (?a..RangeExtd::Infinity::POSITIVE), RaE(?a, RangeExtd::Infinity::POSITIVE)
|
314
|
+
assert_equal RangeExtd, RaE(?a, RangeExtd::Infinity::POSITIVE, 1).class
|
315
|
+
assert_raises(ae){ RaE(RangeExtd::Infinity::NEGATIVE, Float::INFINITY) } # Float::INFINITY is an exception - you should not mix it up.
|
316
|
+
assert_raises(ae){ RaE(-Float::INFINITY, RangeExtd::Infinity::POSITIVE) } # Float::INFINITY is an exception - you should not mix it up.
|
317
|
+
assert_raises(ae){ RaE(RangeExtd::Infinity::POSITIVE, ?a) }
|
318
|
+
assert_raises(ae){ RaE(RangeExtd::Infinity::POSITIVE, RangeExtd::Infinity::NEGATIVE) }
|
319
|
+
assert_equal RangeExtd, RaE(RangeExtd::Infinity::NEGATIVE, RangeExtd::Infinity::POSITIVE).class
|
320
|
+
assert_raises(ae){ RaE(RangeExtd::Infinity::NEGATIVE, 0, false, false) } # For Numeric, you should use -Float::INFINITY
|
321
|
+
assert_raises(ae){ RaE(0, RangeExtd::Infinity::POSITIVE, false, false) } # For Numeric, you should use Float::INFINITY
|
322
|
+
assert_equal RangeExtd, RaE(RangeExtd::Infinity::NEGATIVE, ?a, false, false).class
|
323
|
+
assert_equal RangeExtd, RaE(?a, RangeExtd::Infinity::POSITIVE, false, false).class
|
324
|
+
# assert_raises(ae){ RaE(RangeExtd::Infinity::NEGATIVE, ?a, true) } #### No exception. Is it OK???
|
325
|
+
# assert_raises(ae){ RaE(?a, RangeExtd::Infinity::POSITIVE, nil, 1) } #### No exception. Is it OK???
|
326
|
+
|
327
|
+
# Wrong range (Range input)
|
328
|
+
assert_raises(ae){ RangeExtd(2..-1) }
|
329
|
+
assert_raises(ae){ RangeExtd(nil..nil) }
|
330
|
+
assert_raises(ae){ RangeExtd(?d..?a) }
|
331
|
+
|
332
|
+
# Range with contradictory boundary
|
333
|
+
assert_equal ?a..?e, RaE(?a...?e, nil, nil)
|
334
|
+
assert_equal ?a...?e, RaE(?a..?e, nil, 1)
|
335
|
+
assert_equal ?a..?a, RaE(?a...?a, nil, nil)
|
336
|
+
assert_equal RangeExtd::NONE, RaE(?a...?a, 1, 1)
|
337
|
+
assert_equal RangeExtd::NONE, RaE(?a..?b, 1, 1)
|
338
|
+
assert_raises(ae){ RaE(?a..?a, true, nil) }
|
339
|
+
assert_raises(ae){ RaE(?a..?a, nil, 1) }
|
340
|
+
end
|
341
|
+
|
342
|
+
|
343
|
+
def test_exclude_begin
|
344
|
+
b = 1
|
345
|
+
e = 4
|
346
|
+
r1 = (b...e)
|
347
|
+
assert !RangeExtd.new(r1).exclude_begin?
|
348
|
+
assert RangeExtd.new(r1).exclude_end?
|
349
|
+
assert RangeExtd.new(r1, true).exclude_begin?
|
350
|
+
assert RangeExtd.new(r1, true).exclude_end?
|
351
|
+
assert !RangeExtd.new(b,e).exclude_begin?
|
352
|
+
assert !RangeExtd.new(b,e).exclude_end?
|
353
|
+
assert !RangeExtd.new(b,e,nil).exclude_begin?
|
354
|
+
assert !RangeExtd.new(b,e,nil).exclude_end?
|
355
|
+
assert RangeExtd.new(b,e,'c').exclude_begin?
|
356
|
+
assert !RangeExtd.new(b,e,'c').exclude_end?
|
357
|
+
assert RangeExtd.new(b,e,:a =>5).exclude_begin?
|
358
|
+
assert !RangeExtd.new(b,e, false, false).exclude_begin?
|
359
|
+
assert !RangeExtd.new(b,e, false, false).exclude_end?
|
360
|
+
assert !RangeExtd.new(b,e, false, true ).exclude_begin?
|
361
|
+
assert RangeExtd.new(b,e, false, true ).exclude_end?
|
362
|
+
assert RangeExtd.new(b,e, true, true ).exclude_begin?
|
363
|
+
assert RangeExtd.new(b,e, true, true ).exclude_end?
|
364
|
+
assert RangeExtd.new(b,e, true, false).exclude_begin?
|
365
|
+
assert !RangeExtd.new(b,e, true, false).exclude_end?
|
366
|
+
assert RangeExtd(3,5,8,9).exclude_begin?
|
367
|
+
assert RangeExtd(3,5,8,9).exclude_end?
|
368
|
+
|
369
|
+
assert_raises ArgumentError do
|
370
|
+
RangeExtd.new()
|
371
|
+
end
|
372
|
+
assert_raises ArgumentError do
|
373
|
+
RangeExtd.new(5)
|
374
|
+
end
|
375
|
+
assert_raises ArgumentError do
|
376
|
+
RangeExtd.new(nil,5)
|
377
|
+
end
|
378
|
+
assert_raises ArgumentError do
|
379
|
+
RangeExtd.new(nil,5,true)
|
380
|
+
end
|
381
|
+
end # def test_exclude_begin
|
382
|
+
|
383
|
+
|
384
|
+
# Test of Range(Extd)#is_none?
|
385
|
+
def test_is_none
|
386
|
+
assert (RangeExtd::NONE.is_none?)
|
387
|
+
assert !(RangeExtd( 1, 1,true,true).is_none?)
|
388
|
+
assert !(RangeExtd(?a,?a,true,true).is_none?)
|
389
|
+
assert !((1...1).is_none?)
|
390
|
+
end
|
391
|
+
|
392
|
+
# Test of Range(Extd)#is_everything?
|
393
|
+
def test_is_everything
|
394
|
+
assert (RangeExtd::EVERYTHING.is_everything?)
|
395
|
+
assert (RangeExtd(RangeExtd::Infinity::NEGATIVE, RangeExtd::Infinity::POSITIVE).is_everything?) # You can create it, if you want.
|
396
|
+
assert !((RangeExtd::Infinity::NEGATIVE..RangeExtd::Infinity::POSITIVE).is_everything?) # Not the standard Range, though.
|
397
|
+
assert !(RangeExtd(-Float::INFINITY, Float::INFINITY).is_everything?) # Different from Numeric, though.
|
398
|
+
end
|
399
|
+
|
400
|
+
|
401
|
+
# Test of Range#== because it has changed first!
|
402
|
+
def test_eql_range
|
403
|
+
assert (@r11 == (@ib..@ie))
|
404
|
+
assert_equal @r11, (@ib..@ie)
|
405
|
+
assert (@r11 != @r12)
|
406
|
+
assert_equal @r12, (@ib...@ie)
|
407
|
+
assert_equal @r11, @s11
|
408
|
+
assert (@r11 != @s12)
|
409
|
+
assert (@r11 != @s21)
|
410
|
+
assert (@r11 != @s22)
|
411
|
+
assert_equal @r12, @s12
|
412
|
+
assert (@r12 != @s11)
|
413
|
+
assert (@r12 != @s21)
|
414
|
+
assert (@r12 != @s22)
|
415
|
+
assert (@r12 != 'K')
|
416
|
+
assert (@r12 != @ib)
|
417
|
+
end # def test_eql_range
|
418
|
+
|
419
|
+
def test_eql
|
420
|
+
t21 = RangeExtd.new(@ib..@ie,true)
|
421
|
+
u11 = RangeExtd.new(3, @ie, false)
|
422
|
+
v11 = RangeExtd.new(@ib, 4, false)
|
423
|
+
v21 = RangeExtd.new(@ib..4, true)
|
424
|
+
v22 = RangeExtd.new(@ib...4, true)
|
425
|
+
|
426
|
+
assert (@s11 == @r11)
|
427
|
+
assert_equal @s11, @r11
|
428
|
+
assert !(@s11 == @r12)
|
429
|
+
assert (@s11 != @r12)
|
430
|
+
assert_equal @s21, t21
|
431
|
+
assert (@s21 == t21)
|
432
|
+
assert (@s21 != @s11)
|
433
|
+
assert (@s21 != @s12)
|
434
|
+
assert (@s21 != @s22)
|
435
|
+
assert (@s12 == @r12)
|
436
|
+
assert @s12.eql?(@r12)
|
437
|
+
assert (@s11 != u11)
|
438
|
+
assert (@s11 != v11)
|
439
|
+
assert (@s21 != v21)
|
440
|
+
assert (@s22 != v22)
|
441
|
+
assert (@s22 != u11)
|
442
|
+
assert (@s22 != 'a')
|
443
|
+
|
444
|
+
sc1 = RangeExtd.new("D".."F", false)
|
445
|
+
sc2 = RangeExtd("D".."F", true)
|
446
|
+
assert (sc1 == ("D".."F"))
|
447
|
+
assert (sc1 == RangeExtd(("D".."F")))
|
448
|
+
assert (sc1 != sc2)
|
449
|
+
end # def test_eql
|
450
|
+
|
451
|
+
def test_eql2
|
452
|
+
assert ((1..2) == (1..2))
|
453
|
+
assert ((1..2) == (1.0..2))
|
454
|
+
assert ((1..2).eql? (1..2)) # 1==(1.0) == true
|
455
|
+
assert (1 == 1.0)
|
456
|
+
assert !(1.eql?(1.0))
|
457
|
+
assert !(1.0.eql?(1))
|
458
|
+
assert !((1..2).eql? (1.0..2)) # 1.eql?(1.0) == false
|
459
|
+
r12 = RangeExtd(1..2, true)
|
460
|
+
assert (r12.eql? RangeExtd(1..2, true))
|
461
|
+
assert !(r12.eql? RangeExtd(1.0..2, true))
|
462
|
+
end
|
463
|
+
|
464
|
+
def test_eql3
|
465
|
+
# Comparison of NOT valid Range.
|
466
|
+
assert ((?a...?a) == (?a...?a))
|
467
|
+
assert ((?a...?a) != (?c...?c))
|
468
|
+
assert ((?a...?a) != ("ff"..."ff"))
|
469
|
+
assert ((1...1) != (8...8))
|
470
|
+
assert ((1...1) == (1.0...1.0))
|
471
|
+
assert ((1...1) != (8.0...8.0))
|
472
|
+
assert ((nil..nil) != (nil...nil))
|
473
|
+
assert ((nil...nil) == (nil...nil))
|
474
|
+
assert_equal false, ((?a...?a) == RangeExtd(?a...?b, true))
|
475
|
+
end
|
476
|
+
|
477
|
+
|
478
|
+
def test_begin
|
479
|
+
assert_equal(@ib, @s11.begin)
|
480
|
+
assert_equal(@ib, @s12.begin)
|
481
|
+
assert_equal(@ib, @s21.begin)
|
482
|
+
assert_equal(@ib, @s22.begin)
|
483
|
+
end
|
484
|
+
|
485
|
+
def test_end
|
486
|
+
assert_equal(@ie, @s11.end)
|
487
|
+
assert_equal(@ie, @s12.end)
|
488
|
+
assert_equal(@ie, @s21.end)
|
489
|
+
assert_equal(@ie, @s22.end)
|
490
|
+
end
|
491
|
+
|
492
|
+
|
493
|
+
def test_first
|
494
|
+
# This is the key method of this class.
|
495
|
+
|
496
|
+
# irb> (5...8.9).last(1) # => [8]
|
497
|
+
# irb> (5.2..9).last(1) # => TypeError: can't iterate from Float
|
498
|
+
# irb> (5.2..9).first(1) # => TypeError: can't iterate from Float
|
499
|
+
# irb> (5.2...9).first(1) # => TypeError: can't iterate from Float
|
500
|
+
# irb> RangeExtd(5.2,9,:exclude_begin=>true).first(1) # => [6] # Not right!
|
501
|
+
#
|
502
|
+
|
503
|
+
assert_equal(@ib, @s11.first)
|
504
|
+
assert_equal(@ib, @s12.first)
|
505
|
+
assert_equal(@ib, @s21.first)
|
506
|
+
assert_equal(@ib, @s22.first)
|
507
|
+
assert_equal(@ib, @s12.first(1)[0])
|
508
|
+
assert_equal(@ib+1, @s21.first(1)[0])
|
509
|
+
assert_equal(@ib+1, @s22.first(1)[0])
|
510
|
+
|
511
|
+
assert_raises ArgumentError do
|
512
|
+
RangeExtd(9, 3, true)
|
513
|
+
end
|
514
|
+
assert_raises ArgumentError do
|
515
|
+
@s22.first(1, 3)
|
516
|
+
end
|
517
|
+
|
518
|
+
## String
|
519
|
+
sc1 = RangeExtd.new("D".."F", false)
|
520
|
+
sc2 = RangeExtd.new("D".."F", true)
|
521
|
+
assert_equal('D', sc1.first)
|
522
|
+
assert_equal('D', sc2.first)
|
523
|
+
assert_equal('E', sc2.first(1)[0])
|
524
|
+
|
525
|
+
## Arbitrary Class
|
526
|
+
sx1 = RangeExtd.new((Xs.new(3)..Xs.new(6)), true)
|
527
|
+
assert_equal(Xs.new(3), sx1.first)
|
528
|
+
assert_equal(Xs.new(4), sx1.first(1)[0])
|
529
|
+
|
530
|
+
## Float
|
531
|
+
sf1 = RangeExtd.new((-1.4)..8, false)
|
532
|
+
sf2 = RangeExtd.new((-1.4)..8, true)
|
533
|
+
assert_equal(-1.4, sf1.first)
|
534
|
+
assert_equal(-1.4, sf2.first)
|
535
|
+
assert_raises TypeError do
|
536
|
+
sf1.first(1)
|
537
|
+
end
|
538
|
+
assert_raises TypeError do
|
539
|
+
sf2.first(1)
|
540
|
+
end
|
541
|
+
|
542
|
+
## Else
|
543
|
+
assert_raises ArgumentError do
|
544
|
+
RangeExtd.new(nil..nil, true)
|
545
|
+
end
|
546
|
+
|
547
|
+
assert_raises ArgumentError do
|
548
|
+
@s22.first(-7) # "negative array size (or size too big)"
|
549
|
+
end
|
550
|
+
assert_raises TypeError do
|
551
|
+
@s22.first('a')
|
552
|
+
end
|
553
|
+
assert_raises TypeError do
|
554
|
+
@s22.first(nil)
|
555
|
+
end
|
556
|
+
end # def test_first
|
557
|
+
|
558
|
+
|
559
|
+
def test_each
|
560
|
+
ns=0; @s11.each{|i| ns+=i}
|
561
|
+
assert_equal(@r11.reduce(:+), ns)
|
562
|
+
ns=0; @s12.each{|i| ns+=i}
|
563
|
+
assert_equal(@r12.reduce(:+), ns)
|
564
|
+
ns=0; @s21.each{|i| ns+=i}
|
565
|
+
assert_equal(((@ib+1)..@ie).reduce(:+), ns)
|
566
|
+
ns=0; ret=@s22.each{|i| ns+=i}
|
567
|
+
assert_equal(((@ib+1)...@ie).reduce(:+), ns)
|
568
|
+
assert_equal(@s22, ret)
|
569
|
+
assert(Enumerator === @s22.each)
|
570
|
+
|
571
|
+
## Arbitrary Class
|
572
|
+
sx1 = RangeExtd.new(Xs.new(3), Xs.new(6), true, true)
|
573
|
+
a=[]; sx1.each{|i| a.push(i)}
|
574
|
+
assert_equal([Xs.new(4), Xs.new(5)], a)
|
575
|
+
end # def test_each
|
576
|
+
|
577
|
+
|
578
|
+
def test_end
|
579
|
+
assert_equal(@ie, @s11.end)
|
580
|
+
assert_equal(@ie, @s12.end)
|
581
|
+
assert_equal(@ie, @s21.end)
|
582
|
+
assert_equal(@ie, @s22.end)
|
583
|
+
end
|
584
|
+
|
585
|
+
def test_last # Apparently it uses each() internally.
|
586
|
+
assert_equal(@ie, @s11.last)
|
587
|
+
assert_equal(@ie-1, @s12.last(1)[0])
|
588
|
+
assert_equal(@ie, @s21.last)
|
589
|
+
assert_equal(@ie-1, @s22.last(1)[0])
|
590
|
+
end
|
591
|
+
|
592
|
+
|
593
|
+
def test_include
|
594
|
+
assert @s11.include?(@ib)
|
595
|
+
assert @s11.include?(@ie)
|
596
|
+
assert @s12.include?(@ib)
|
597
|
+
assert !@s12.include?(@ie)
|
598
|
+
assert @s12.include?(@ie-1)
|
599
|
+
assert !@s21.include?(@ib)
|
600
|
+
assert @s21.include?(@ib+1)
|
601
|
+
assert @s21.include?(@ie)
|
602
|
+
assert !@s22.include?(@ib)
|
603
|
+
assert !@s22.include?(@ie)
|
604
|
+
assert (@s11 === @ib)
|
605
|
+
assert !(@s21 === @ib)
|
606
|
+
assert (@s21 === @ib+1)
|
607
|
+
assert !(@s22 === @ie)
|
608
|
+
|
609
|
+
assert (RangeExtd.new("a", "z") === "c")
|
610
|
+
assert !(RangeExtd.new("a", "z") === "cc") # Key! (see cover?)
|
611
|
+
assert (@s22 === (@ib+@ie)/2.0+0.1) # Key! (see cover?)
|
612
|
+
assert (RangeExtd.new("a", "z").member?("c"))
|
613
|
+
assert !(RangeExtd.new("a", "z").member?("cc"))
|
614
|
+
assert !(RangeExtd.new("a", "z", 777) === "a")
|
615
|
+
assert (RangeExtd.new("a", "z", nil) === "a")
|
616
|
+
assert (RangeExtd.new("a", "z", 777) === "b")
|
617
|
+
end # def test_include
|
618
|
+
|
619
|
+
|
620
|
+
def test_bsearch
|
621
|
+
ary = [0, 4, 7, 10, 12]
|
622
|
+
assert_equal(2, RangeExtd(0, ary.size).bsearch{|i| ary[i] >= 6})
|
623
|
+
# http://www.ruby-doc.org/core-2.1.1/Range.html#method-i-bsearch
|
624
|
+
|
625
|
+
assert_equal(nil, RangeExtd(3...4).bsearch{ |i| ary[i] >= 11})
|
626
|
+
assert_equal(nil, RangeExtd(3.6...4).bsearch{|i| ary[i] >= 11})
|
627
|
+
assert_equal(4, RangeExtd(3...5).bsearch{ |i| ary[i] >= 11})
|
628
|
+
assert_equal(4.0, RangeExtd(3...5.1).bsearch{|i| ary[i] >= 11})
|
629
|
+
assert_equal(nil, RangeExtd(3.6...4).bsearch{|i| ary[i] >= 11})
|
630
|
+
|
631
|
+
assert_equal(4, RangeExtd(3...5, 1).bsearch{ |i| ary[i] >= 11})
|
632
|
+
assert_equal(nil, RangeExtd(4...5, 1).bsearch{ |i| ary[i] >= 11})
|
633
|
+
assert_equal(4.0, RangeExtd(3...5.1, 1).bsearch{|i| ary[i] >= 11})
|
634
|
+
assert_equal(nil, RangeExtd(3.6...4, 1).bsearch{|i| ary[i] >= 11})
|
635
|
+
|
636
|
+
assert_raises TypeError do
|
637
|
+
RangeExtd.new((?a..?b), :exclude_begin => true).bsearch{|i| ary[i] >= 11}
|
638
|
+
end
|
639
|
+
end # def test_bsearch
|
640
|
+
|
641
|
+
def test_bsearch_special
|
642
|
+
sp = Special.new
|
643
|
+
|
644
|
+
# Standard Range
|
645
|
+
assert_equal(nil, RangeExtd(3..4).bsearch{ |i| sp[i]})
|
646
|
+
assert_equal(nil, RangeExtd(3...4).bsearch{|i| sp[i]})
|
647
|
+
assert(1e-8 > (RangeExtd(3.0...4).bsearch{|i| sp[i]} - 3.5).abs)
|
648
|
+
assert(1e-8 > (RangeExtd(3...4.0).bsearch{|i| sp[i]} - 3.5).abs)
|
649
|
+
assert(1e-8 > (RangeExtd(3.3..4).bsearch{ |i| sp[i]} - 3.5).abs)
|
650
|
+
|
651
|
+
# RangeExtd
|
652
|
+
assert(1e-8 > (RangeExtd(3...4.1, 1).bsearch{|i| sp[i]} - 3.5).abs)
|
653
|
+
assert(1e-8 > (RangeExtd(3.7...4, 1).bsearch{|i| sp[i]} - 3.7).abs)
|
654
|
+
assert(1e-8 > (RangeExtd(3.7...4.2, 1).bsearch{|i| sp[i]} - 3.7).abs) # If end is 4.7, it will be nil (presumably due to the algorithm), whereas still 3.7 if 4.5.
|
655
|
+
end # def test_bsearch_special
|
656
|
+
|
657
|
+
|
658
|
+
def test_cover
|
659
|
+
assert @s11.cover?(@ib)
|
660
|
+
assert @s11.cover?(@ie)
|
661
|
+
assert @s12.cover?(@ib)
|
662
|
+
assert !@s12.cover?(@ie)
|
663
|
+
assert @s12.cover?(@ie-1)
|
664
|
+
assert !@s21.cover?(@ib)
|
665
|
+
assert @s21.cover?(@ib+1)
|
666
|
+
assert @s21.cover?(@ie)
|
667
|
+
assert !@s22.cover?(@ib)
|
668
|
+
assert !@s22.cover?(@ie)
|
669
|
+
st = RangeExtd.new((1.4..7), true)
|
670
|
+
assert !(st.cover?(1.4))
|
671
|
+
assert (st.cover?(1.5))
|
672
|
+
|
673
|
+
assert (RangeExtd.new("a", "z").cover?("c"))
|
674
|
+
assert (RangeExtd.new("a", "z").cover?("cc")) # Key! (see include?)
|
675
|
+
assert (@s22.cover?((@ib+@ie)/2.0+0.1)) # Key! (see cover?)
|
676
|
+
su = RangeExtd.new("a", "z", 777)
|
677
|
+
sv = RangeExtd.new("a", "z", nil)
|
678
|
+
assert !(su.cover?("a"))
|
679
|
+
assert (sv.cover?("a"))
|
680
|
+
assert (su.cover?("b"))
|
681
|
+
end # def test_cover
|
682
|
+
|
683
|
+
|
684
|
+
def test_hash
|
685
|
+
assert_equal(@r11.hash, @s11.hash)
|
686
|
+
assert_equal(@r12.hash, @s12.hash)
|
687
|
+
assert (@r12.hash != @s22.hash)
|
688
|
+
end # def test_hash
|
689
|
+
|
690
|
+
def test_min
|
691
|
+
assert_equal(@ib, @s11.min)
|
692
|
+
assert_equal(@ib, @s12.min)
|
693
|
+
assert_equal(@ib+1, @s21.min)
|
694
|
+
assert_equal(@ib+1, @s22.min)
|
695
|
+
|
696
|
+
assert_equal(@ie-1, @s22.min{|a,b| -a <=> -b})
|
697
|
+
|
698
|
+
assert_raises TypeError do
|
699
|
+
RangeExtd.new(1.0, 5, :exclude_begin => true).min
|
700
|
+
end
|
701
|
+
end # def test_min
|
702
|
+
|
703
|
+
def test_min_by
|
704
|
+
assert_equal(@ib+1, @s22.min_by.each{|i| i})
|
705
|
+
|
706
|
+
assert_raises TypeError do
|
707
|
+
RangeExtd.new(1.0, 5, :exclude_begin => true).min_by
|
708
|
+
end
|
709
|
+
|
710
|
+
assert_equal(@ie-1, @s22.min_by{|a| -a })
|
711
|
+
end # def test_min_by
|
712
|
+
|
713
|
+
|
714
|
+
def test_minmax
|
715
|
+
assert_equal([@ib,@ie], @s11.minmax)
|
716
|
+
assert_equal([@ib,@ie-1], @s12.minmax)
|
717
|
+
assert_equal([@ib+1,@ie], @s21.minmax)
|
718
|
+
assert_equal([@ib+1,@ie-1], @s22.minmax)
|
719
|
+
|
720
|
+
assert_equal([@ie-1,@ib+1], @s22.minmax{|a,b| -a <=> -b}) # Not the best test...
|
721
|
+
|
722
|
+
assert_raises TypeError do
|
723
|
+
RangeExtd.new(1.0, 5, true).minmax
|
724
|
+
end
|
725
|
+
end # def test_minmax
|
726
|
+
|
727
|
+
|
728
|
+
def test_minmax_by
|
729
|
+
assert_equal([@ib+1,@ie-1], @s22.minmax_by.each{|i| i})
|
730
|
+
|
731
|
+
assert_raises TypeError do
|
732
|
+
RangeExtd.new(1.0, 5, true).minmax_by
|
733
|
+
end
|
734
|
+
|
735
|
+
assert_equal([@ie-1,@ib+1], @s22.minmax_by{|a| -a })
|
736
|
+
end # def test_minmax_by
|
737
|
+
|
738
|
+
|
739
|
+
def test_max
|
740
|
+
assert_equal(@ie, @s11.max)
|
741
|
+
assert_equal(@ie-1, @s12.max)
|
742
|
+
assert_equal(@ie, @s21.max)
|
743
|
+
assert_equal(@ie-1, @s22.max)
|
744
|
+
|
745
|
+
assert_equal(@ib+1, @s22.max{|a,b| -a <=> -b}) # Not the best test...
|
746
|
+
|
747
|
+
assert_raises TypeError do
|
748
|
+
RangeExtd.new(1.0, 5, true).max
|
749
|
+
end
|
750
|
+
end # def test_max
|
751
|
+
|
752
|
+
|
753
|
+
def test_max_by
|
754
|
+
assert_equal(@ie-1, @s22.max_by.each{|i| i})
|
755
|
+
|
756
|
+
assert_raises TypeError do
|
757
|
+
RangeExtd.new(1.0, 5, true).max_by
|
758
|
+
end
|
759
|
+
|
760
|
+
assert_equal(@ib+1, @s22.max_by{|a| -a })
|
761
|
+
end # def test_max_by
|
762
|
+
|
763
|
+
|
764
|
+
def test_size
|
765
|
+
assert_equal(@ie-@ib+1, @s11.size)
|
766
|
+
assert_equal(@ie-@ib, @s12.size)
|
767
|
+
assert_equal(@ie-@ib, @s21.size)
|
768
|
+
assert_equal(@ie-@ib-1, @s22.size)
|
769
|
+
assert_equal nil, RangeExtd("a", "c").size
|
770
|
+
assert_equal 0, RangeExtd::NONE.size
|
771
|
+
assert_equal Float::INFINITY, RangeExtd::EVERYTHING.size
|
772
|
+
|
773
|
+
# Infinity
|
774
|
+
inf = Float::INFINITY
|
775
|
+
excl_ini = true
|
776
|
+
assert_equal inf, RangeExtd(-inf, 1).size
|
777
|
+
assert_raises ArgumentError do
|
778
|
+
RangeExtd(-inf, -inf, excl_ini) # exclde_begin yet !exclude_end
|
779
|
+
end
|
780
|
+
assert_equal inf, RangeExtd(-inf, 1, excl_ini).size
|
781
|
+
assert_raises ArgumentError do
|
782
|
+
RangeExtd( inf, inf, excl_ini) # exclde_begin yet !exclude_end
|
783
|
+
end
|
784
|
+
assert_equal inf, RangeExtd( 1, inf, excl_ini).size
|
785
|
+
|
786
|
+
# Float
|
787
|
+
rfi = (2.4..4.4) # size() => 3 see [ruby-list:49797] from matz
|
788
|
+
rfe = (2.4...4.4) # size() => 2
|
789
|
+
siz = rfi.size
|
790
|
+
assert_equal siz, RangeExtd(rfi).size
|
791
|
+
assert_equal siz-1, RangeExtd(rfe).size
|
792
|
+
assert_equal siz-1, RangeExtd(rfi, excl_ini).size
|
793
|
+
assert_equal siz-2, RangeExtd(rfe, excl_ini).size
|
794
|
+
assert_equal siz-1, RangeExtd(Rational(24,10)..4.4, excl_ini).size
|
795
|
+
assert_equal siz-2, RangeExtd(Rational(24,10)...4.4, excl_ini).size
|
796
|
+
# (0.5...5).size # => 5 (Ruby 2.1)
|
797
|
+
# (Rational(1,2)...5).size # => 4 (Ruby 2.1) => Bug!
|
798
|
+
|
799
|
+
# String
|
800
|
+
rsi = (?a..?d)
|
801
|
+
if rsi.size.nil?
|
802
|
+
assert_equal nil, RangeExtd(rsi, excl_ini).size # Ruby 2.1
|
803
|
+
else
|
804
|
+
assert_equal 3, RangeExtd(rsi, excl_ini).size # If the specification ever changes?
|
805
|
+
end
|
806
|
+
end # def test_size
|
807
|
+
|
808
|
+
|
809
|
+
def test_step
|
810
|
+
ns=0; @s11.step(2){|i| ns+=i}
|
811
|
+
assert_equal(1+3+5, ns)
|
812
|
+
ns=0; @s12.step(2){|i| ns+=i}
|
813
|
+
assert_equal(1+3+5, ns)
|
814
|
+
ns=0; @s21.step(2){|i| ns+=i}
|
815
|
+
assert_equal(2+4+6, ns)
|
816
|
+
ns=0; ret=@s22.step(2){|i| ns+=i}
|
817
|
+
assert_equal(2+4, ns)
|
818
|
+
assert_equal(@s22, ret)
|
819
|
+
assert(Enumerator === @s22.step(2))
|
820
|
+
|
821
|
+
## Arbitrary Class
|
822
|
+
sx1 = RangeExtd.new(Xs.new(3), Xs.new(6), true, true)
|
823
|
+
a=[]; sx1.step(2){|i| a.push(i)}
|
824
|
+
assert_equal([Xs.new(4)], a)
|
825
|
+
end # def test_step
|
826
|
+
|
827
|
+
|
828
|
+
def test_to_s
|
829
|
+
assert_equal 'a...c', RangeExtd(?a...?c).to_s
|
830
|
+
assert_equal 'a<..c', RangeExtd(?a..?c, true).to_s
|
831
|
+
assert_equal 'a<...c', RangeExtd(?a...?c, true).to_s
|
832
|
+
assert_equal '"a"<.."c"', RangeExtd(?a..?c, true).inspect
|
833
|
+
end
|
834
|
+
|
835
|
+
|
836
|
+
def test_Infinity
|
837
|
+
assert (RangeExtd::Infinity::NEGATIVE.infinity?)
|
838
|
+
assert (RangeExtd::Infinity::POSITIVE.infinity?)
|
839
|
+
assert !(RangeExtd::Infinity::NEGATIVE.positive?)
|
840
|
+
assert (RangeExtd::Infinity::POSITIVE.positive?)
|
841
|
+
assert (RangeExtd::Infinity::NEGATIVE.negative?)
|
842
|
+
assert !(RangeExtd::Infinity::POSITIVE.negative?)
|
843
|
+
assert_equal(-1, (RangeExtd::Infinity::NEGATIVE <=> -3))
|
844
|
+
assert_equal(nil,(RangeExtd::Infinity::NEGATIVE <=> Object.new))
|
845
|
+
assert_equal 0, (RangeExtd::Infinity::NEGATIVE <=> RangeExtd::Infinity::NEGATIVE)
|
846
|
+
assert_equal 1, (RangeExtd::Infinity::POSITIVE <=> -3)
|
847
|
+
assert_equal nil,(RangeExtd::Infinity::POSITIVE <=> Object.new)
|
848
|
+
assert_equal 0, (RangeExtd::Infinity::POSITIVE <=> RangeExtd::Infinity::POSITIVE)
|
849
|
+
assert_equal 1, (RangeExtd::Infinity::POSITIVE <=> RangeExtd::Infinity::NEGATIVE)
|
850
|
+
assert_equal(-1, (RangeExtd::Infinity::NEGATIVE <=> RangeExtd::Infinity::POSITIVE))
|
851
|
+
assert_equal RangeExtd::Infinity::NEGATIVE, RangeExtd::Infinity::NEGATIVE
|
852
|
+
assert_equal RangeExtd::Infinity::NEGATIVE, RangeExtd::Infinity::NEGATIVE
|
853
|
+
assert_equal RangeExtd::Infinity::POSITIVE, RangeExtd::Infinity::POSITIVE.succ
|
854
|
+
assert_equal RangeExtd::Infinity::NEGATIVE, RangeExtd::Infinity::NEGATIVE.succ
|
855
|
+
assert_equal(-Float::INFINITY, RangeExtd::Infinity::NEGATIVE)
|
856
|
+
assert_equal Float::INFINITY, RangeExtd::Infinity::POSITIVE
|
857
|
+
assert !(RangeExtd::Infinity::NEGATIVE > -Float::INFINITY)
|
858
|
+
assert !(RangeExtd::Infinity::NEGATIVE < -Float::INFINITY)
|
859
|
+
assert !(RangeExtd::Infinity::POSITIVE > Float::INFINITY)
|
860
|
+
assert !(RangeExtd::Infinity::POSITIVE < Float::INFINITY)
|
861
|
+
assert (RangeExtd::Infinity::POSITIVE > 0)
|
862
|
+
assert (RangeExtd::Infinity::POSITIVE > RangeExtd::Infinity::NEGATIVE)
|
863
|
+
assert (RangeExtd::Infinity::NEGATIVE < 0)
|
864
|
+
assert (RangeExtd::Infinity::NEGATIVE < RangeExtd::Infinity::POSITIVE)
|
865
|
+
assert !(RangeExtd::Infinity::POSITIVE === Object.new)
|
866
|
+
assert !(RangeExtd::Infinity::NEGATIVE === Object.new)
|
867
|
+
assert (RangeExtd::Infinity::POSITIVE === RangeExtd::Infinity::POSITIVE)
|
868
|
+
assert (RangeExtd::Infinity::NEGATIVE === RangeExtd::Infinity::NEGATIVE)
|
869
|
+
assert !(RangeExtd::Infinity::POSITIVE === RangeExtd::Infinity::NEGATIVE)
|
870
|
+
assert !(RangeExtd::Infinity::NEGATIVE === RangeExtd::Infinity::POSITIVE)
|
871
|
+
|
872
|
+
## This is the case so far. Rewrite Float/Fixnum/Bignum/Rational??
|
873
|
+
## It would get slow, though! It is a lot better to use Float::INFINITY, instead.
|
874
|
+
# assert_raises ArgumentError do
|
875
|
+
# Float::INFINITY == RangeExtd::Infinity::POSITIVE
|
876
|
+
# end
|
877
|
+
end
|
878
|
+
|
879
|
+
|
880
|
+
def test_Range_valid
|
881
|
+
assert RangeExtd::NONE.valid?
|
882
|
+
assert RangeExtd::EVERYTHING.valid?
|
883
|
+
assert (1..3).valid?
|
884
|
+
assert !(3..1).valid?
|
885
|
+
assert (?a..?a).valid? # single element
|
886
|
+
assert !(?a...?a).valid? # less than empty
|
887
|
+
assert (?a...?b).valid? # single element
|
888
|
+
assert !(nil..nil).valid?
|
889
|
+
assert !(true...true).valid?
|
890
|
+
assert RangeExtd(0..0).valid?
|
891
|
+
#assert !RangeExtd(0...0).valid?
|
892
|
+
assert RangeExtd(0...0, 7).valid?
|
893
|
+
#assert !RangeExtd(0...0, false).valid?
|
894
|
+
#assert RangeExtd(5..RangeExtd::Infinity::POSITIVE, nil, 7).valid? # => ArgumentError
|
895
|
+
#assert RangeExtd(5..RangeExtd::Infinity::POSITIVE).valid? # => ArgumentError "Float::INFINITY is not comparable with other Infinity."
|
896
|
+
#assert RangeExtd(RangeExtd::Infinity::NEGATIVE..5, true).valid?
|
897
|
+
#assert RangeExtd(RangeExtd::Infinity::NEGATIVE..5).valid?
|
898
|
+
assert RangeExtd(?b..RangeExtd::Infinity::POSITIVE, nil, 7).valid? # => ArgumentError
|
899
|
+
assert RangeExtd(?b..RangeExtd::Infinity::POSITIVE).valid? # => ArgumentError "Float::INFINITY is not comparable with other Infinity."
|
900
|
+
assert RangeExtd(RangeExtd::Infinity::NEGATIVE..?b, true).valid?
|
901
|
+
assert RangeExtd(RangeExtd::Infinity::NEGATIVE..?b).valid?
|
902
|
+
end # def test_Range_valid
|
903
|
+
|
904
|
+
|
905
|
+
def test_Range_empty
|
906
|
+
assert RangeExtd::NONE.empty?
|
907
|
+
assert !RangeExtd::EVERYTHING.empty?
|
908
|
+
assert !(1..3).empty?
|
909
|
+
assert_nil (3..1).empty?
|
910
|
+
assert !(?a..?a).empty? # single element
|
911
|
+
assert_nil (?a...?a).empty? # less than empty
|
912
|
+
assert !(?a...?b).empty? # single element
|
913
|
+
assert RangeExtd(?a...?b, :exclude_begin => true).empty? # empty
|
914
|
+
assert_nil (nil..nil).empty?
|
915
|
+
assert_nil (true...true).empty?
|
916
|
+
assert !RangeExtd(0..0).empty? # single element
|
917
|
+
assert_nil (0...0).empty?
|
918
|
+
assert RangeExtd(0...0, :exclude_begin => true).empty? # empty
|
919
|
+
assert RangeExtd(0...1, :exclude_begin => true).empty? # empty
|
920
|
+
assert RangeExtd(0.0...0, :exclude_begin => true).empty? # empty
|
921
|
+
assert !RangeExtd(0.0...1, :exclude_begin => true).empty?
|
922
|
+
#assert RangeExtd(0...0, false).empty? # => ArgumentError
|
923
|
+
assert !RangeExtd(-5, Float::INFINITY, true).empty?
|
924
|
+
assert !RangeExtd(-5, Float::INFINITY, nil).empty?
|
925
|
+
assert !RangeExtd(-Float::INFINITY, -5, nil, true).empty?
|
926
|
+
assert !RangeExtd(-Float::INFINITY, -5).empty?
|
927
|
+
assert !RangeExtd(?b, RangeExtd::Infinity::POSITIVE, true).empty?
|
928
|
+
assert !RangeExtd(?b, RangeExtd::Infinity::POSITIVE, nil).empty?
|
929
|
+
assert !RangeExtd(RangeExtd::Infinity::NEGATIVE, ?b, nil, true).empty?
|
930
|
+
assert !RangeExtd(RangeExtd::Infinity::NEGATIVE, ?b).empty?
|
931
|
+
end # def test_Range_empty
|
932
|
+
|
933
|
+
|
934
|
+
def test_Range_nullfunc
|
935
|
+
assert RangeExtd::NONE.null?
|
936
|
+
assert !RangeExtd::EVERYTHING.null?
|
937
|
+
assert !(1..3).null?
|
938
|
+
assert (3..1).null?
|
939
|
+
assert !(?a..?a).null? # single element
|
940
|
+
assert (?a...?a).null? # less than empty
|
941
|
+
assert !(?a...?b).null? # single element
|
942
|
+
assert RangeExtd(?a...?b, :exclude_begin => true).null? # empty
|
943
|
+
assert (nil..nil).null?
|
944
|
+
assert (true...true).null?
|
945
|
+
assert !RangeExtd(0..0).null? # single element
|
946
|
+
assert (0...0).null?
|
947
|
+
assert RangeExtd(0...0, :exclude_begin => true).null? # empty
|
948
|
+
assert RangeExtd(0...1, :exclude_begin => true).null? # empty
|
949
|
+
assert RangeExtd(0.0...0, :exclude_begin => true).null? # empty
|
950
|
+
assert !RangeExtd(0.0...1, :exclude_begin => true).null?
|
951
|
+
#assert RangeExtd(0...0, false).null? # => ArgumentError
|
952
|
+
assert !RangeExtd(-5, Float::INFINITY, true).empty?
|
953
|
+
assert !RangeExtd(-5, Float::INFINITY, nil).empty?
|
954
|
+
assert !RangeExtd(-Float::INFINITY, -5, nil, true).empty?
|
955
|
+
assert !RangeExtd(-Float::INFINITY, -5).empty?
|
956
|
+
assert !RangeExtd(?b, RangeExtd::Infinity::POSITIVE, true).empty?
|
957
|
+
assert !RangeExtd(?b, RangeExtd::Infinity::POSITIVE, nil).empty?
|
958
|
+
assert !RangeExtd(RangeExtd::Infinity::NEGATIVE, ?b, nil, true).empty?
|
959
|
+
assert !RangeExtd(RangeExtd::Infinity::NEGATIVE, ?b).empty?
|
960
|
+
end # def test_Range_nullfunc
|
961
|
+
|
962
|
+
|
963
|
+
def test_RangeExtd_none
|
964
|
+
assert RangeExtd::NONE.is_none?
|
965
|
+
assert RangeExtd::NONE.valid?
|
966
|
+
assert RangeExtd::NONE.null?
|
967
|
+
assert RangeExtd::NONE.empty?
|
968
|
+
assert !RangeExtd(0...0, true).is_none?
|
969
|
+
assert !(nil..nil).is_none?
|
970
|
+
assert !(nil...nil).is_none?
|
971
|
+
assert_equal RaE(0...1, true), RangeExtd::NONE
|
972
|
+
assert_equal RaE(0, 0, true, true), RangeExtd::NONE
|
973
|
+
assert_equal RaE(?a, ?a, true, true), RangeExtd::NONE
|
974
|
+
assert_equal RaE(?a, ?b, true, true), RangeExtd::NONE
|
975
|
+
assert !RaE(?a, ?b, true, true).is_none?
|
976
|
+
assert RaE(?a, ?b, true, true).empty?
|
977
|
+
assert RaE(?a, ?b, true, true).null?
|
978
|
+
assert_equal nil, RangeExtd::NONE.begin
|
979
|
+
assert_equal nil, RangeExtd::NONE.end
|
980
|
+
end
|
981
|
+
|
982
|
+
|
983
|
+
def test_RangeExtd_empty_equal
|
984
|
+
assert RaE(?a, ?b, 5, 5).empty?
|
985
|
+
assert RaE(1, 2, 5, 5).empty?
|
986
|
+
assert RaE(3.0, 3.0, 5, 5).empty?
|
987
|
+
assert RaE(?a, ?b, 5, 5) != RaE(1, 2, 5, 5)
|
988
|
+
assert RaE(?a, ?b, 5, 5) == RaE(?c, ?d, 5, 5)
|
989
|
+
assert RaE(11, 12, 5, 5) == RaE(11, 11, 5, 5)
|
990
|
+
assert RaE(11, 12, 5, 5) == RaE(1, 2, 5, 5)
|
991
|
+
assert RaE(11, 12, 5, 5).eql?( RaE(1, 2, 5, 5) )
|
992
|
+
assert RaE(11, 12, 5, 5) == RaE(3.0, 3.0, 5, 5)
|
993
|
+
assert !RaE(11, 12, 5, 5).eql?( RaE(3.0, 3.0, 5, 5) )
|
994
|
+
#assert_equal RangeExtd::NONE, RangeExtd(0...0, :exclude_begin => true) # => ArgumentError
|
995
|
+
#assert_equal RangeExtd(0...0, :exclude_begin => true), RangeExtd::NONE
|
996
|
+
end
|
997
|
+
|
998
|
+
|
999
|
+
def test_RangeExtd_everything
|
1000
|
+
assert !RangeExtd::EVERYTHING.is_none?
|
1001
|
+
assert RangeExtd::EVERYTHING.valid?
|
1002
|
+
assert !RangeExtd::EVERYTHING.null?
|
1003
|
+
assert !RangeExtd::EVERYTHING.empty?
|
1004
|
+
assert_equal (-Float::INFINITY..Float::INFINITY), RangeExtd::EVERYTHING
|
1005
|
+
assert_equal RangeExtd::EVERYTHING, (-Float::INFINITY..Float::INFINITY)
|
1006
|
+
assert_equal RangeExtd::Infinity::POSITIVE, RangeExtd::EVERYTHING.end
|
1007
|
+
assert_equal RangeExtd::Infinity::NEGATIVE, RangeExtd::EVERYTHING.begin
|
1008
|
+
end
|
1009
|
+
|
1010
|
+
def test_RangeExtd_num
|
1011
|
+
r = RangeExtd(5, Float::INFINITY, true)
|
1012
|
+
assert r.exclude_begin?
|
1013
|
+
assert_equal 5, r.begin
|
1014
|
+
assert_equal 5, r.first
|
1015
|
+
assert_equal [6,7,8], r.first(3)
|
1016
|
+
assert r.cover?(1e50)
|
1017
|
+
assert !r.cover?(4.9)
|
1018
|
+
assert !r.cover?(5)
|
1019
|
+
assert !(r === 5)
|
1020
|
+
assert_equal Float::INFINITY, r.end # It is exactly Float.
|
1021
|
+
assert (! defined? r.end.positive?)
|
1022
|
+
n = 0
|
1023
|
+
r.each{|ei| n+=ei;break if n > 20} # [6, 7, 8, ...]
|
1024
|
+
assert_equal 21, n
|
1025
|
+
n = 0
|
1026
|
+
r.step(2){|ei| n+=ei;break if n > 20} # [6, 7, 8, ...]
|
1027
|
+
assert_equal 24, n
|
1028
|
+
|
1029
|
+
assert_raises TypeError do
|
1030
|
+
dummy = r.first(?a)
|
1031
|
+
end
|
1032
|
+
assert_raises TypeError do
|
1033
|
+
dummy = r.last(3)
|
1034
|
+
end
|
1035
|
+
end
|
1036
|
+
|
1037
|
+
|
1038
|
+
def test_RangeExtd_eql
|
1039
|
+
infF = Float::INFINITY
|
1040
|
+
assert_equal RaE(-infF, 8, nil, nil), (-Float::INFINITY..8)
|
1041
|
+
assert_equal RaE(-infF, 8, nil, true), (-Float::INFINITY...8)
|
1042
|
+
assert_equal (-Float::INFINITY..8), RaE(-infF, 8, nil, nil)
|
1043
|
+
assert_equal (-Float::INFINITY...8), RaE(-infF, 8, nil, true)
|
1044
|
+
|
1045
|
+
assert(RaE(-infF, 8, nil, nil) != (-Float::INFINITY..9) )
|
1046
|
+
assert(RaE(-infF, 8, nil, nil) != (-Float::INFINITY...8))
|
1047
|
+
assert((-Float::INFINITY..8) != RaE(-infF, 8, nil, true) )
|
1048
|
+
assert((-Float::INFINITY...9)!= RaE(-infF, 8, nil, true) )
|
1049
|
+
|
1050
|
+
assert_equal RaE(8, infF, nil), (8..Float::INFINITY)
|
1051
|
+
assert_equal RaE(8, infF, true), RaE(8..Float::INFINITY, true)
|
1052
|
+
assert_equal (8..Float::INFINITY), RaE(8, infF, nil)
|
1053
|
+
assert_equal RaE(8..Float::INFINITY, true), RaE(8, infF, true)
|
1054
|
+
|
1055
|
+
assert(RaE(8, infF, true) != (8..Float::INFINITY))
|
1056
|
+
assert(RaE(8, infF, nil) != RaE(8..Float::INFINITY, true))
|
1057
|
+
assert((8..Float::INFINITY) != RaE(8, infF, true))
|
1058
|
+
assert(RaE(8..Float::INFINITY, true) != RaE(8, infF, nil))
|
1059
|
+
end
|
1060
|
+
|
1061
|
+
def test_RangeExtd_str
|
1062
|
+
# neg = RangeExtd::Infinity::NEGATIVE
|
1063
|
+
# pos = RangeExtd::Infinity::POSITIVE
|
1064
|
+
rs = RangeExtd(RangeExtd::Infinity::NEGATIVE, 'z', nil, true)
|
1065
|
+
assert rs.exclude_end?
|
1066
|
+
assert ! rs.begin.positive?
|
1067
|
+
assert rs.begin.negative?
|
1068
|
+
assert_equal 'z', rs.end
|
1069
|
+
assert_equal 'z', rs.last
|
1070
|
+
assert !rs.cover?(?z)
|
1071
|
+
assert rs.cover?(?x)
|
1072
|
+
assert_equal nil, (rs === ?x)
|
1073
|
+
assert_equal RangeExtd::Infinity::NEGATIVE, rs.begin # It is Infinity,
|
1074
|
+
assert_equal(-Float::INFINITY, rs.begin) # but still equal to Float.
|
1075
|
+
assert ! rs.begin.positive?
|
1076
|
+
assert_equal Float::INFINITY, rs.size
|
1077
|
+
assert_raises TypeError do
|
1078
|
+
dummy = rs.last(3)
|
1079
|
+
end
|
1080
|
+
end
|
1081
|
+
|
1082
|
+
|
1083
|
+
# Tests of all the examples in the document.
|
1084
|
+
def test_indocument
|
1085
|
+
# RangeExtd#initialize
|
1086
|
+
r = RangeExtd(5...8, true)
|
1087
|
+
assert r.exclude_begin? # => true
|
1088
|
+
|
1089
|
+
# RangeExtd#==
|
1090
|
+
assert_equal RangeExtd::NONE, RaE(1, 1, T, T) # (1<...1) == RangeExtd::NONE # => true
|
1091
|
+
assert_equal RangeExtd::NONE, RaE(?a, ?b, T, T) # (?a<...?b) == RangeExtd::NONE # => true
|
1092
|
+
assert_equal RaE(2, 2, T, T), RaE(1, 1, T, T) # (1<...1) == (2<...2) # => true
|
1093
|
+
assert_equal RaE(3, 4, T, T), RaE(1, 1, T, T) # (1<...1) == (3<...4) # => true
|
1094
|
+
assert_equal RaE(?c,?c,T, T), RaE(?a, ?b, T, T) # (?a<...?b) == (?c<...?c) # => true
|
1095
|
+
assert (RaE(?c,?c,T,T) != RaE(1, 1, T, T)) # (1<...1) != (?c<...?c) # - because of Fixnum and String
|
1096
|
+
assert_equal RaE(3, 4, T, T), RaE(1.0, 1.0, T, T) # (1.0<...1.0) == (3<...4) # => true
|
1097
|
+
|
1098
|
+
# RangeExtd#eql?
|
1099
|
+
assert_equal (1.0...5.0), (1...5) # (1...5) == (1.0...5.0) # => true
|
1100
|
+
assert !(1...5).eql?(1.0...5.0) # (1...5).eql?(1.0...5.0) # => false
|
1101
|
+
assert RaE(1, 1, T,T).eql?(RangeExtd::NONE) # (1<...1).eql?( RangeExtd::NONE) # => true
|
1102
|
+
assert RaE(?a, ?b, T,T).eql?(RangeExtd::NONE) # (?a<...?b).eql?(RangeExtd::NONE) # => true
|
1103
|
+
assert RaE(1, 1, T,T).eql?(RaE(3,4,T,T)) # (1<...1).eql?( 3<...4) # => true
|
1104
|
+
assert !RaE(1.0,1.0,T,T).eql?(RaE(3,4,T,T)) # (1.0<...1.0).eql?(3<...4) # => false
|
1105
|
+
|
1106
|
+
# RangeExtd#===
|
1107
|
+
assert ((?D..?z) === ?c)
|
1108
|
+
assert !((?a..?z) === "cc")
|
1109
|
+
assert !((?B..?z) === 'dd')
|
1110
|
+
|
1111
|
+
# RangeExtd#eql?bsearch
|
1112
|
+
ary = [0, 4, 7, 10, 12]
|
1113
|
+
assert_equal nil, (3...4).bsearch{ |i| ary[i] >= 11}
|
1114
|
+
assert_equal 4, (3...5).bsearch{ |i| ary[i] >= 11}
|
1115
|
+
assert_equal 4.0, (3..5.1).bsearch{ |i| ary[i] >= 11}
|
1116
|
+
assert_equal 4.0, (3.6..4).bsearch{ |i| ary[i] >= 11}
|
1117
|
+
assert_equal nil, (3.6...4).bsearch{ |i| ary[i] >= 11}
|
1118
|
+
assert_equal 4.0, (3.6...4.1).bsearch{|i| ary[i] >= 11}
|
1119
|
+
|
1120
|
+
sp = Special.new
|
1121
|
+
assert_equal nil, (3..4).bsearch{ |i| sp[i]}
|
1122
|
+
assert_equal nil, (3...4).bsearch{ |i| sp[i]}
|
1123
|
+
assert_equal 0,(((3.0...4).bsearch{|i| sp[i]}-3.5)*1e10.abs).to_i # => 3.5000000000000004
|
1124
|
+
assert_equal 0,(((3...4.0).bsearch{|i| sp[i]}-3.5)*1e10.abs).to_i # => 3.5000000000000004
|
1125
|
+
assert_equal 0,(((3.3..4).bsearch{ |i| sp[i]}-3.5)*1e10.abs).to_i # => 3.5000000000000004
|
1126
|
+
|
1127
|
+
assert_raises(TypeError){ (Rational(36,10)..5).bsearch{|i| ary[i] >= 11} } # (Rational(36,10)..5).bsearch{|i| ary[i] >= 11} => # TypeError: can't do binary search for Rational (Ruby 2.1)
|
1128
|
+
assert_raises(TypeError){ (3..Rational(61,10)).bsearch{|i| ary[i] >= 11} } # (3..Rational(61,10)).bsearch{|i| ary[i] >= 11} => # TypeError: can't do binary search for Fixnum (Ruby 2.1)
|
1129
|
+
|
1130
|
+
# RangeExtd#cover?(i)
|
1131
|
+
assert ("a".."z").cover?("cc") # => true
|
1132
|
+
assert (?B..?z).cover?('dd') # => true (though 'dd'.succ would never reach ?z)
|
1133
|
+
|
1134
|
+
# RangeExtd#each
|
1135
|
+
s = ''
|
1136
|
+
(1...3.5).each{|i| s+=i.to_s}
|
1137
|
+
assert_equal '123', s # (1...3.5).each{|i|print i} # => '123' to STDOUT
|
1138
|
+
assert_equal Enumerator, (1.3...3.5).each.class # (1.3...3.5).each # => #<Enumerator: 1.3...3.5:each>
|
1139
|
+
assert_raises(TypeError){ (1.3...3.5).each{|i|print i} } # => TypeError: can't iterate from Float
|
1140
|
+
|
1141
|
+
# RangeExtd#first
|
1142
|
+
assert_equal 3.1, (1...3.1).last
|
1143
|
+
assert_equal [3], (1...3.1).last(1)
|
1144
|
+
|
1145
|
+
# RangeExtd#minmax
|
1146
|
+
assert_equal [0, 3], (0...3.5).minmax
|
1147
|
+
assert_raises(TypeError){ (1.3...5).minmax } # => TypeError: can't iterate from Float
|
1148
|
+
|
1149
|
+
# RangeExtd#size
|
1150
|
+
assert_equal 5, (1..5).size
|
1151
|
+
assert_equal 4, (1...5).size
|
1152
|
+
assert_equal 5, (0.8...5).size # => 5 # Why???
|
1153
|
+
assert_equal 4, (1.2...5).size # => 4 # Why???
|
1154
|
+
assert_equal 4, (1.2..5).size # => 4 # Why???
|
1155
|
+
assert_equal 3, (Rational(3,2)...5).size # => 3
|
1156
|
+
assert_equal 4, (1.5...5).size # => 4 # Why not 3??
|
1157
|
+
assert_equal 4, (1.5...4.9).size # => 4 # Why not 3??
|
1158
|
+
assert_equal 3, (1.5...4.5).size # => 3
|
1159
|
+
assert_equal Float::INFINITY, (0...Float::INFINITY).size # => Infinity
|
1160
|
+
assert_equal 0, (Float::INFINITY..Float::INFINITY).size
|
1161
|
+
|
1162
|
+
# RangeExtd#step # => the same as each
|
1163
|
+
|
1164
|
+
# RangeExtd.valid?
|
1165
|
+
assert !RangeExtd.valid?(nil..nil) # => false
|
1166
|
+
assert !RangeExtd.valid?(nil...nil) # => false
|
1167
|
+
assert RangeExtd.valid?(0..0) # => true
|
1168
|
+
assert !RangeExtd.valid?(0...0) # => false
|
1169
|
+
assert !RangeExtd.valid?(0..0, true) # => false
|
1170
|
+
assert RangeExtd.valid?(0...0, true) # => true
|
1171
|
+
assert !RangeExtd.valid?(2..-1) # => false
|
1172
|
+
assert RangeExtd.valid?(RangeExtd::NONE) # => true
|
1173
|
+
assert RangeExtd.valid?(RangeExtd::EVERYTHING) # => true
|
1174
|
+
assert RangeExtd.valid?(3..Float::INFINITY) # => true
|
1175
|
+
assert RangeExtd.valid?(3..Float::INFINITY, true) # => true
|
1176
|
+
assert RangeExtd.valid?(RangeExtd::Infinity::NEGATIVE..?d) # => true
|
1177
|
+
assert RangeExtd.valid?(RangeExtd::Infinity::NEGATIVE..?d, true) # => false
|
1178
|
+
# Note the last example may change in the future release.
|
1179
|
+
|
1180
|
+
# Range.==
|
1181
|
+
assert !(1...1).valid?
|
1182
|
+
assert !(nil...nil).valid?
|
1183
|
+
assert !((1...1) == RangeExtd(1, 1, true, true)) # => false.
|
1184
|
+
|
1185
|
+
# Range.valid?
|
1186
|
+
assert !(nil..nil).valid? # => false
|
1187
|
+
assert (0..0).valid? # => true
|
1188
|
+
assert !(0...0).valid? # => false
|
1189
|
+
assert !(2..-1).valid? # => false
|
1190
|
+
assert RangeExtd(0...0, true) # => true
|
1191
|
+
assert (3..Float::INFINITY).valid? # => true
|
1192
|
+
assert RangeExtd::NONE.valid? # => true
|
1193
|
+
assert RangeExtd::EVERYTHING.valid? # => true
|
1194
|
+
|
1195
|
+
# Range.empty?
|
1196
|
+
assert_equal nil, (nil..nil).empty? # => nil
|
1197
|
+
assert_equal nil, (1...1).empty? # => nil
|
1198
|
+
assert !(1..1).empty? # => false
|
1199
|
+
assert RangeExtd(1...1, true).empty? # => true
|
1200
|
+
assert RangeExtd(1...2, true).empty? # => true
|
1201
|
+
assert !RangeExtd(1.0...2, true).empty? # => false
|
1202
|
+
assert RangeExtd(?a...?b, true).empty? # => true
|
1203
|
+
assert RangeExtd::NONE.empty? # => true
|
1204
|
+
|
1205
|
+
# class Infinity
|
1206
|
+
assert_equal -1, (?z <=> RangeExtd::Infinity::POSITIVE)
|
1207
|
+
assert_equal 1, (RangeExtd::Infinity::POSITIVE <=> ?z)
|
1208
|
+
assert_equal nil, (50 <=> RangeExtd::Infinity::POSITIVE)
|
1209
|
+
assert_equal 1, (RangeExtd::Infinity::POSITIVE <=> 50)
|
1210
|
+
end
|
1211
|
+
|
1212
|
+
# def test_RangeExtd_special
|
1213
|
+
# # Positive Infinity (== 'z')
|
1214
|
+
# rs = RangeExtd('w', :exclude => true, :positive => 1, :positive_infinity_object => 'z')
|
1215
|
+
# assert rs.exclude?
|
1216
|
+
# assert_equal 'z', rs.end
|
1217
|
+
# assert_equal 'w', rs.begin
|
1218
|
+
# assert_equal 'w<..z', rs.to_s
|
1219
|
+
# assert_equal '"w"<.."z"', rs.inspect
|
1220
|
+
# assert_equal Float::INFINITY, rs.size
|
1221
|
+
# n = ''
|
1222
|
+
# rs.step(2){|ei| n+=ei}
|
1223
|
+
# assert_equal 'xz', n # warning: RangeExtd#step(2) reached +Infinity.
|
1224
|
+
# n = ''
|
1225
|
+
# rs.each{ |ei| n+=ei} # warning: RangeExtd#each reached +Infinity.
|
1226
|
+
# assert_equal 'xyz', n
|
1227
|
+
#
|
1228
|
+
# # Negative Infinity (== 'a')
|
1229
|
+
# rs = RangeExtd('d', :exclude => true, :positive => nil, :negative_infinity_object => 'a')
|
1230
|
+
# assert rs.exclude?
|
1231
|
+
# assert_equal 'd', rs.end
|
1232
|
+
# assert_equal 'a', rs.begin
|
1233
|
+
# assert_equal 'a...d', rs.to_s
|
1234
|
+
# assert_equal '"a"..."d"', rs.inspect
|
1235
|
+
# assert_equal Float::INFINITY, rs.size
|
1236
|
+
# n = ''
|
1237
|
+
# assert_raises TypeError do
|
1238
|
+
# rs.step(2){|ei| n+=ei}
|
1239
|
+
# end
|
1240
|
+
# assert_raises TypeError do
|
1241
|
+
# rs.each{ |ei| n+=ei}
|
1242
|
+
# end
|
1243
|
+
# end
|
1244
|
+
|
1245
|
+
|
1246
|
+
end # class TestUnitFoo < MiniTest::Unit::TestCase
|
1247
|
+
|
1248
|
+
#end # if $0 == __FILE__
|
1249
|
+
|
1250
|
+
|
1251
|
+
# % ruby1.8 -rlib/range_extd/range_extd.rb -e 'p RangeExtd(2.3...7,:exclude_begin=>1).first==2.3'
|
1252
|
+
# ruby1.8 -rlib/range_extd/range_extd.rb -e 'i=0;p RangeExtd(1...4,:exclude_begin=>true).each{|j|i+=j};p i==5'
|
1253
|
+
# ruby1.8 -rlib/range_extd/range_extd.rb -e 'p RangeExtd(-1...7,:exclude_begin=>1).min==0'
|