range_extd 1.0 → 2.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 +4 -4
- data/ChangeLog +31 -10
- data/Makefile +7 -3
- data/News +8 -0
- data/README.en.rdoc +1163 -250
- data/README.ja.rdoc +1163 -250
- data/Rakefile +11 -5
- data/lib/range_extd/infinity.rb +426 -0
- data/lib/range_extd/load_all.rb +19 -0
- data/lib/range_extd/nil_class.rb +41 -0
- data/lib/range_extd/nowhere.rb +135 -0
- data/lib/range_extd/numeric.rb +160 -0
- data/lib/range_extd/object.rb +53 -0
- data/lib/range_extd/range.rb +401 -0
- data/lib/{range_extd/range_extd.rb → range_extd.rb} +440 -628
- data/range_extd.gemspec +50 -0
- data/test/all_required_test.rb +173 -0
- data/test/test_range_extd.rb +649 -157
- data/test/test_range_extd_nowhere.rb +84 -0
- metadata +29 -16
- data/lib/range_extd/infinity/infinity.rb +0 -392
data/test/test_range_extd.rb
CHANGED
@@ -2,46 +2,23 @@
|
|
2
2
|
|
3
3
|
$stdout.sync=true
|
4
4
|
$stderr.sync=true
|
5
|
+
|
5
6
|
# print '$LOAD_PATH=';p $LOAD_PATH
|
6
|
-
arlibrelpath = []
|
7
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
8
|
|
9
|
-
arlibbase.
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
(['../lib/', 'lib/', ''].map{|i| i+elibbase+'/'} + ['']).each do |dir|
|
14
|
-
# eg., pathcand = %w(../lib/rangesmaller/ lib/rangesmaller/ rangesmaller/) + ['']
|
15
|
-
begin
|
16
|
-
s = dir+File.basename(elibbase)
|
17
|
-
arAllPaths.push(s)
|
18
|
-
#print "Trying: "; puts s
|
19
|
-
require s
|
20
|
-
pathnow = s
|
21
|
-
break
|
22
|
-
rescue LoadError => er
|
23
|
-
end
|
24
|
-
end # (['../lib/', 'lib/', ''].map{|i| i+elibbase+'/'} + '').each do |dir|
|
25
|
-
|
26
|
-
if pathnow.nil?
|
27
|
-
warn "Warning: All the attempts to load the following files have failed. Abort..."
|
28
|
-
warn arAllPaths.inspect
|
29
|
-
warn " NOTE: It may be because a require statement in that file failed,
|
30
|
-
rather than requiring the file itself.
|
31
|
-
Check with % ruby -r#{File.basename(elibbase)} -e p
|
32
|
-
or maybe add env RUBYLIB=$RUBYLIB:`pwd`"
|
33
|
-
# p $LOADED_FEATURES.grep(/#{Regexp.quote(File.basename(elibbase)+'.rb')}$/)
|
34
|
-
raise er
|
35
|
-
else
|
36
|
-
#print pathnow," is loaded!\n"
|
37
|
-
arlibrelpath.push pathnow
|
38
|
-
end
|
9
|
+
arlibrelbase = arlibbase.map{|i| "../lib/"+i}
|
10
|
+
|
11
|
+
arlibrelbase.each do |elibbase|
|
12
|
+
require_relative elibbase
|
39
13
|
end # arlibbase.each do |elibbase|
|
40
14
|
|
41
|
-
print "NOTE:
|
42
|
-
print "NOTE: Library
|
43
|
-
arlibbase.
|
44
|
-
|
15
|
+
print "NOTE: Running: "; p File.basename(__FILE__)
|
16
|
+
print "NOTE: Library relative paths: "; p arlibrelbase
|
17
|
+
arlibbase4full = arlibbase.map{|i| i.sub(%r@^(../)+@, "")}+%w(range_extd)
|
18
|
+
puts "NOTE: Library full paths for #{arlibbase4full.inspect}: "
|
19
|
+
arlibbase4full.each do |elibbase|
|
20
|
+
ar = $LOADED_FEATURES.grep(/(^|\/)#{Regexp.quote(File.basename(elibbase))}(\.rb)?$/).uniq
|
21
|
+
print elibbase+": " if ar.empty?; p ar
|
45
22
|
end
|
46
23
|
|
47
24
|
|
@@ -49,6 +26,12 @@ end
|
|
49
26
|
# Unit Test
|
50
27
|
#################################################
|
51
28
|
|
29
|
+
begin
|
30
|
+
_ = Rational(2, 3)
|
31
|
+
rescue
|
32
|
+
require 'rational'
|
33
|
+
end
|
34
|
+
|
52
35
|
#if $0 == __FILE__
|
53
36
|
gem "minitest"
|
54
37
|
# require 'minitest/unit'
|
@@ -66,6 +49,8 @@ gem "minitest"
|
|
66
49
|
Xs.new(@length + 1)
|
67
50
|
end
|
68
51
|
def <=>(other)
|
52
|
+
# Apparently, this affects :== as well!!
|
53
|
+
# Therefore, (Xs.new(4) == Object.new) would raise NoMethodError, whereas (Object.new == Xs.new(4)) just returns false.
|
69
54
|
@length <=> other.length
|
70
55
|
end
|
71
56
|
def to_s
|
@@ -139,9 +124,14 @@ gem "minitest"
|
|
139
124
|
RangeExtd(*rest)
|
140
125
|
end
|
141
126
|
|
142
|
-
class TestUnitFoo < MiniTest::
|
127
|
+
class TestUnitFoo < MiniTest::Test
|
143
128
|
T = true
|
144
129
|
F = false
|
130
|
+
InfF = Float::INFINITY
|
131
|
+
InfP = RangeExtd::Infinity::POSITIVE
|
132
|
+
InfN = RangeExtd::Infinity::NEGATIVE
|
133
|
+
NOWHERE = RangeExtd::Nowhere::NOWHERE
|
134
|
+
|
145
135
|
def setup
|
146
136
|
@ib = 1
|
147
137
|
@ie = 6
|
@@ -157,6 +147,10 @@ gem "minitest"
|
|
157
147
|
@foo = nil
|
158
148
|
end
|
159
149
|
|
150
|
+
####################################
|
151
|
+
# Ruby behaviours (to check out)
|
152
|
+
####################################
|
153
|
+
|
160
154
|
def test_object_compare
|
161
155
|
assert_equal 0, (3 <=> 3)
|
162
156
|
assert_equal 1, (4 <=> 3)
|
@@ -166,6 +160,203 @@ gem "minitest"
|
|
166
160
|
assert_equal 0, (IO <=> IO)
|
167
161
|
end # def test_object_compare
|
168
162
|
|
163
|
+
# Ruby-2.7 (and 3.1) default behaviours.
|
164
|
+
def test_ruby27_range01
|
165
|
+
num1 = (5..InfF)
|
166
|
+
num2 = (5..)
|
167
|
+
assert( num1.end != num2.end )
|
168
|
+
assert_equal InfF, num1.size
|
169
|
+
assert_equal InfF, num2.size
|
170
|
+
|
171
|
+
str1 = (?a..)
|
172
|
+
assert( str1.end != num1.end )
|
173
|
+
assert( str1.end == num2.end )
|
174
|
+
assert_nil str1.size, "For some reason, this is nil in Ruby 3.1"
|
175
|
+
assert_equal InfF, (..?z).size
|
176
|
+
end # def test_ruby27_range
|
177
|
+
|
178
|
+
# Ruby-2.7 (and 3.1) default behaviours.
|
179
|
+
def test_ruby27_range_nil
|
180
|
+
assert_equal "..3", (..3).to_s
|
181
|
+
assert_equal "3..", (3..).to_s
|
182
|
+
assert_equal "3..", (3..nil).to_s
|
183
|
+
assert_equal "..3", (nil..3).to_s
|
184
|
+
|
185
|
+
assert( (nil..) == (..nil) ) #
|
186
|
+
assert( (nil..) != (...nil)) # (because (I guess) exclude_end? differ)
|
187
|
+
assert( (...nil).exclude_end? ) # (because (I guess) exclude_end? differ)
|
188
|
+
assert_equal "abcdef", "abcdef"[..nil] # (i.e., it is interpreted as (0..IntegerInfinity)
|
189
|
+
# (n.b., nil.to_i==0; Integer(nil) #=> TypeError))
|
190
|
+
assert_raises(TypeError){ "abcdef"[..?a] } # raise: no implicit conversion of String into Integer (TypeError)
|
191
|
+
assert_equal "abcdef", "abcdef"[0..100]
|
192
|
+
assert_nil "abcdef"[-100..100]
|
193
|
+
|
194
|
+
assert_equal InfF, (..nil).size
|
195
|
+
|
196
|
+
assert_nil (..nil).begin
|
197
|
+
assert_raises(RangeError){ (..nil).first} # raise: cannot get the first element of beginless range (RangeError)
|
198
|
+
assert_raises(RangeError){ (..nil).last } # raise: cannot get the last element of endless range (RangeError)
|
199
|
+
assert_nil (..nil).end
|
200
|
+
|
201
|
+
assert( (..nil).cover? 5 )
|
202
|
+
assert( (..nil).cover? ?a )
|
203
|
+
assert( (..nil).cover? [?a])
|
204
|
+
assert( (..nil).cover? nil )
|
205
|
+
end # def test_ruby27_range_nil
|
206
|
+
|
207
|
+
# Ruby-2.7 (and 3.1) default behaviours.
|
208
|
+
def test_ruby27_range_int
|
209
|
+
num1 = (5..Float::INFINITY)
|
210
|
+
num2 = (5..)
|
211
|
+
assert( num1.end != num2.end) # (because I guess (Float::INFINITY != nil))
|
212
|
+
assert_equal InfF, num1.size
|
213
|
+
assert_equal InfF, num2.size
|
214
|
+
|
215
|
+
assert (3...) == (3...nil)
|
216
|
+
assert (3..) != (3...nil) # (because I guess exclude_end? differ)
|
217
|
+
|
218
|
+
assert_equal InfF, (3..).size
|
219
|
+
assert_nil (..3).begin # => nil
|
220
|
+
assert_raises(RangeError){ (..3).first} # raise: cannot get the first element of beginless range (RangeError)
|
221
|
+
assert_raises(RangeError){ (3..).last } # raise: cannot get the last element of endless range (RangeError)
|
222
|
+
assert_nil (3..).end # => nil
|
223
|
+
assert_raises(TypeError){ (..3).each{}} # raise: `each': can't iterate from NilClass (TypeError)
|
224
|
+
assert_raises(TypeError){ (..3).to_a } # raise: `each': can't iterate from NilClass (TypeError)
|
225
|
+
assert_raises(RangeError){ (3..).to_a } # raise: `to_a': cannot convert endless range to an array (RangeError)
|
226
|
+
# (3..Float::INFINITY).to_a # => Infinite loop!
|
227
|
+
|
228
|
+
assert_equal(-InfF, (-Float::INFINITY..4).first)
|
229
|
+
assert_equal InfF, (4..Float::INFINITY).last
|
230
|
+
assert_raises(TypeError){ (-Float::INFINITY..4).first(2)} # raise: can't iterate from Float (TypeError)
|
231
|
+
# (4..Float::INFINITY).last(2) # Infinite loop!
|
232
|
+
end # def test_ruby27_range_int
|
233
|
+
|
234
|
+
# Ruby-2.7 (and 3.1) default behaviours.
|
235
|
+
def test_ruby27_range_string
|
236
|
+
assert((?a..).end == (5..).end) # (because both are nil)
|
237
|
+
assert((?a..).end != (5..Float::INFINITY).end)
|
238
|
+
assert((..?a).begin == (..5).begin) # (because both are nil)
|
239
|
+
assert((..?a).begin != ((-Float::INFINITY)..5).begin)
|
240
|
+
assert_nil (?a..?b).size # Range#size is nil except for Numeric Ranges (specification).
|
241
|
+
assert_equal InfF, (..?a).size # Therefore, this contradicts the specification.
|
242
|
+
assert_nil (?a..).size
|
243
|
+
|
244
|
+
assert_nil (..?a).begin
|
245
|
+
assert_raises(RangeError){ (..?a).first} # raise: cannot get the first element of beginless range (RangeError)
|
246
|
+
assert_raises(RangeError){ (?a..).last } # raise: cannot get the last element of endless range (RangeError)
|
247
|
+
assert_nil (?a..).end
|
248
|
+
assert_raises(TypeError){ (..?a).each{}} # raise: `each': can't iterate from NilClass (TypeError)
|
249
|
+
assert_raises(TypeError){ (..?a).to_a } # raise: `each': can't iterate from NilClass (TypeError)
|
250
|
+
assert_raises(RangeError){(?a..).to_a } # raise: `to_a': cannot convert endless range to an array (RangeError)
|
251
|
+
assert_raises(ArgumentError){ (?a..Float::INFINITY).to_a } # raise: bad value for range (ArgumentError) # b/c it is not String!
|
252
|
+
end # def test_ruby27_range_string
|
253
|
+
|
254
|
+
####################################
|
255
|
+
# RangeExtd behaviours
|
256
|
+
####################################
|
257
|
+
|
258
|
+
# Tests listed in the doc
|
259
|
+
def test_doc_first
|
260
|
+
assert_equal Float::INFINITY, RaE(..nil).size
|
261
|
+
assert_nil RaE(..nil).begin
|
262
|
+
assert_raises(RangeError){RaE(..nil).first} # raise: cannot get the first element of beginless range (RangeError)
|
263
|
+
assert_raises(RangeError){RaE(..nil).last} # raise: cannot get the last element of endless range (RangeError)
|
264
|
+
assert_nil RaE(..nil).end
|
265
|
+
assert RaE(..nil).cover? 5
|
266
|
+
assert RaE(..nil).cover? ?a
|
267
|
+
assert RaE(..nil).cover? [?a]
|
268
|
+
assert RaE(..nil).cover? nil
|
269
|
+
end
|
270
|
+
|
271
|
+
# Tests listed in the doc
|
272
|
+
def test_doc_integer
|
273
|
+
assert_equal((3...), RaE(3...nil))
|
274
|
+
refute_equal((3..), RaE(3...nil)) # (because exclude_end? differ))
|
275
|
+
assert_equal(RaE(3...nil), (3...))
|
276
|
+
refute_equal(RaE(3...nil), (3..) ) # (because exclude_end? differ))
|
277
|
+
assert_equal Float::INFINITY, RaE(3..).size
|
278
|
+
assert_nil RaE(..3).begin
|
279
|
+
assert_raises(RangeError, "first() should raise RangeError"){RaE(..3).first} # raise: cannot get the first element of beginless range (RangeError)
|
280
|
+
assert_raises(RangeError, "last() should raise RangeError"){RaE(3..).last} # raise: cannot get the last element of endless range (RangeError)
|
281
|
+
assert_nil RaE(3..).end
|
282
|
+
assert_raises(TypeError){RaE(..3).each{}} # raise: `each': can't iterate from NilClass (TypeError)
|
283
|
+
assert_raises(TypeError){RaE(..3).to_a} # raise: `each': can't iterate from NilClass (TypeError)
|
284
|
+
assert_raises(RangeError){RaE(3..).to_a} # raise: `to_a': cannot convert endless range to an array (RangeError)
|
285
|
+
# (3..Float::INFINITY).to_a # Infinite loop!
|
286
|
+
end
|
287
|
+
|
288
|
+
# Tests listed in the doc
|
289
|
+
def test_doc_string
|
290
|
+
assert( (5..).end == RaE(?a..).end) # for direct comparison, assert_nil is required!
|
291
|
+
assert( RaE(5..).end == (?a..).end)
|
292
|
+
assert( RaE(5..).end == RaE(?a..).end)
|
293
|
+
refute_equal( (5..Float::INFINITY).end, RaE(?a..).end)
|
294
|
+
refute_equal(RaE(5..Float::INFINITY).end, (?a..).end)
|
295
|
+
refute_equal(RaE(5..Float::INFINITY).end, RaE(?a..).end)
|
296
|
+
assert( (..5).begin == RaE(..?a).begin) # (because both are nil)
|
297
|
+
assert( RaE(..5).begin == (..?a).begin)
|
298
|
+
assert( RaE(..5).begin == RaE(..?a).begin)
|
299
|
+
refute_equal( ((-Float::INFINITY)..5).begin, RaE(..?a).begin)
|
300
|
+
refute_equal(RaE((-Float::INFINITY)..5).begin, (..?a).begin)
|
301
|
+
refute_equal(RaE((-Float::INFINITY)..5).begin, RaE(..?a).begin)
|
302
|
+
assert_equal Float::INFINITY, RaE(..?a).size
|
303
|
+
assert_nil RaE(?a..).size
|
304
|
+
|
305
|
+
assert_nil RaE(..?a).begin
|
306
|
+
assert_raises(RangeError){RaE(..?a).first} # raise: cannot get the first element of beginless range (RangeError)
|
307
|
+
assert_raises(RangeError){RaE(?a..).last} # raise: cannot get the last element of endless range (RangeError)
|
308
|
+
assert_nil RaE(?a..).end
|
309
|
+
assert_raises(TypeError){RaE(..?a).each{}} # raise: `each': can't iterate from NilClass (TypeError)
|
310
|
+
assert_raises(TypeError){RaE(..?a).to_a} # raise: `each': can't iterate from NilClass (TypeError)
|
311
|
+
assert_raises(RangeError){RaE(?a..).to_a} # raise: `to_a': cannot convert endless range to an array (RangeError)
|
312
|
+
assert_raises(ArgumentError){RaE(?a..Float::INFINITY).to_a} # raise: bad value for range (ArgumentError) # b/c it is not String!
|
313
|
+
end
|
314
|
+
|
315
|
+
# IF and only if "range_extd/numeric" is required,
|
316
|
+
# InfP (RangeExtd::Infinity::POSITIVE) and InfN (RangeExtd::Infinity::NEGATIVE)
|
317
|
+
# are always comparable with any comparable objects except for
|
318
|
+
# Float::INFINITY, in which case ArgumentError is raised.
|
319
|
+
#
|
320
|
+
# In this case, the file is not required.
|
321
|
+
def test_infinity_compare
|
322
|
+
assert_operator 7.7, '<', InfF
|
323
|
+
assert_raises(ArgumentError){ 7.7 < InfP }
|
324
|
+
assert_raises(ArgumentError){ 7.7 > InfN }
|
325
|
+
assert_operator InfP, '>', 7.7
|
326
|
+
assert_operator InfN, '<', 7.7
|
327
|
+
assert_operator 8, '<', InfF
|
328
|
+
assert_raises(ArgumentError){ 8 < InfP }
|
329
|
+
assert_operator Rational(2, 3), '<', InfF
|
330
|
+
assert_raises(ArgumentError){ Rational(2, 3) < InfP }
|
331
|
+
assert_operator InfP, '>', Rational(2, 3)
|
332
|
+
assert_operator InfN, '<', Rational(2, 3)
|
333
|
+
assert_operator 'h', '<', InfP
|
334
|
+
assert_operator 'h', '>', InfN
|
335
|
+
assert_raises(ArgumentError) { InfF < InfP }
|
336
|
+
assert_raises(ArgumentError) { InfP < InfF }
|
337
|
+
assert_raises(ArgumentError) { InfP < -InfF }
|
338
|
+
assert_raises(ArgumentError) { InfP > InfF }
|
339
|
+
assert_raises(ArgumentError) { InfP > -InfF }
|
340
|
+
assert_raises(ArgumentError) { InfN < InfF }
|
341
|
+
assert_raises(ArgumentError) { InfN < -InfF }
|
342
|
+
assert_raises(ArgumentError) { InfF < Object.new }
|
343
|
+
assert_raises(ArgumentError) { InfP < Object.new }
|
344
|
+
assert_nil (InfF <=> InfP)
|
345
|
+
assert_nil (InfP <=> InfF)
|
346
|
+
assert_nil( 7.7 <=> InfP)
|
347
|
+
assert_nil( 7.7 <=> InfN)
|
348
|
+
assert_equal( 1, InfP <=> 7.7)
|
349
|
+
assert_equal(-1, InfN <=> 7.7)
|
350
|
+
assert_nil( 5 <=> InfP)
|
351
|
+
assert_nil( 5 <=> InfN)
|
352
|
+
assert_equal( 1, InfP <=> 5)
|
353
|
+
assert_equal(-1, InfN <=> 5)
|
354
|
+
assert_equal(-1, 'h' <=> InfP)
|
355
|
+
assert_equal(-1, InfN <=> 'h')
|
356
|
+
#assert_raises(ArgumentError) { puts "########## #{(InfP > InfF).inspect}";InfP < InfF }
|
357
|
+
#puts "########## #{(InfP <=> InfF).inspect}"
|
358
|
+
end
|
359
|
+
|
169
360
|
def test_overwrite_compare
|
170
361
|
assert_nil (Float::INFINITY <=> RangeExtd::Infinity::POSITIVE)
|
171
362
|
assert_nil RangeExtd::Infinity.overwrite_compare(Numeric)
|
@@ -210,11 +401,10 @@ gem "minitest"
|
|
210
401
|
def test_rangeextd_new_infinity_c2
|
211
402
|
c2 = CLC2.new
|
212
403
|
assert_nil (c2 <=> 1) # Object#<=>
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
r=(RangeExtd::Infinity::NEGATIVE..c2)
|
404
|
+
assert_nil(c2 <=> RangeExtd::Infinity::POSITIVE)
|
405
|
+
assert_nil(c2 <=> RangeExtd::Infinity::NEGATIVE)
|
406
|
+
assert_raises(ArgumentError, '"bad value for range" should be raised when object.rb is not required'){ (c2..RangeExtd::Infinity::POSITIVE) }
|
407
|
+
r=(RangeExtd::Infinity::NEGATIVE..c2) # This is OK at least in Ruby-3.1 because (RangeExtd::Infinity::NEGATIVE <=> c2) is valid.
|
218
408
|
assert_equal RangeExtd::Infinity::NEGATIVE, r.begin
|
219
409
|
|
220
410
|
assert_raises(ArgumentError){ (true..RangeExtd::Infinity::POSITIVE) } # => bad value for range
|
@@ -241,12 +431,11 @@ gem "minitest"
|
|
241
431
|
|
242
432
|
def test_rangeextd_new_infinity_c3
|
243
433
|
c3 = CLC3.new
|
244
|
-
|
245
|
-
|
434
|
+
assert_nil(c3 <=> RangeExtd::Infinity::POSITIVE)
|
435
|
+
assert_nil(c3 <=> RangeExtd::Infinity::NEGATIVE)
|
246
436
|
|
247
|
-
|
248
|
-
|
249
|
-
r=(RangeExtd::Infinity::NEGATIVE..c3)
|
437
|
+
assert_raises(ArgumentError, '"bad value for range" should be raised when object.rb is not required'){(c3..RangeExtd::Infinity::POSITIVE) }
|
438
|
+
r=(RangeExtd::Infinity::NEGATIVE..c3) # This is OK at least in Ruby-3.1 because (RangeExtd::Infinity::NEGATIVE <=> c3) is valid.
|
250
439
|
assert_equal RangeExtd::Infinity::NEGATIVE, r.begin
|
251
440
|
end # def test_rangeextd_new_infinity_c3
|
252
441
|
|
@@ -259,7 +448,7 @@ gem "minitest"
|
|
259
448
|
arout = RangeExtd.class_eval{ _get_init_args(3, nil) } # class_eval from Ruby 1.8.7 (?)
|
260
449
|
assert_equal [3, nil, F, F], arout
|
261
450
|
arout = RangeExtd.class_eval{ _get_init_args(3, nil, F, T) } # true == exclude_end?
|
262
|
-
assert_equal [3, nil,
|
451
|
+
assert_equal [3, nil, F, T], arout
|
263
452
|
end
|
264
453
|
|
265
454
|
def test_new
|
@@ -295,7 +484,16 @@ gem "minitest"
|
|
295
484
|
end
|
296
485
|
|
297
486
|
def test_new_endless_range01
|
298
|
-
|
487
|
+
begin
|
488
|
+
_ = (0..nil)
|
489
|
+
rescue ArgumentError
|
490
|
+
# Before Ruby 2.6
|
491
|
+
assert_raises(ArgumentError) {RangeExtd.new(-2, nil)}
|
492
|
+
return # Before Ruby 2.6
|
493
|
+
end
|
494
|
+
|
495
|
+
# Ruby 2.6 upwards
|
496
|
+
ra00 = (-2..) # This raises the uncapturable SyntaxError for Ruby 2.5 and before anyway.
|
299
497
|
rae0 = RangeExtd.new(ra00)
|
300
498
|
assert rae0.valid?
|
301
499
|
assert_equal(-2, rae0.begin)
|
@@ -303,10 +501,27 @@ gem "minitest"
|
|
303
501
|
assert_equal Float::INFINITY, rae0.size
|
304
502
|
assert_equal ra00.exclude_end?, rae0.exclude_end?
|
305
503
|
refute rae0.exclude_begin?
|
504
|
+
|
505
|
+
rae0 = RangeExtd.new(-2, nil)
|
506
|
+
assert rae0.valid?
|
507
|
+
assert_equal(-2, rae0.begin)
|
508
|
+
assert_nil rae0.end
|
509
|
+
assert_equal Float::INFINITY, rae0.size
|
510
|
+
assert_equal ra00.exclude_end?, rae0.exclude_end?
|
511
|
+
refute rae0.exclude_begin?
|
306
512
|
end
|
307
513
|
|
308
514
|
def test_new_endless_range02
|
309
|
-
|
515
|
+
begin
|
516
|
+
_ = (?d...nil)
|
517
|
+
rescue ArgumentError
|
518
|
+
# Before Ruby 2.6
|
519
|
+
assert_raises(ArgumentError) {RangeExtd.new(?d, nil)}
|
520
|
+
return # Before Ruby 2.6
|
521
|
+
end
|
522
|
+
|
523
|
+
# Ruby 2.6 upwards
|
524
|
+
ra00 = (Float::INFINITY...) # This raises the uncapturable SyntaxError for Ruby 2.5 and before anyway.
|
310
525
|
rae0 = RangeExtd.new(ra00)
|
311
526
|
assert rae0.valid?
|
312
527
|
assert_equal Float::INFINITY, rae0.begin
|
@@ -314,6 +529,66 @@ gem "minitest"
|
|
314
529
|
assert_equal Float::INFINITY, rae0.size
|
315
530
|
assert_equal ra00.exclude_end?, rae0.exclude_end?
|
316
531
|
refute rae0.exclude_begin?
|
532
|
+
|
533
|
+
# https://ruby-doc.org/core-3.1.2/Range.html#method-i-size],
|
534
|
+
# > Returns the count of elements in self if both begin and end values are numeric; otherwise, returns nil
|
535
|
+
assert( (?d..).size == RangeExtd.new(?d, RangeExtd::Infinity::POSITIVE).size )
|
536
|
+
assert( (..?d).size == RangeExtd.new(RangeExtd::Infinity::NEGATIVE, ?d).size )
|
537
|
+
|
538
|
+
rae0 = RangeExtd.new(?d, nil, false, true)
|
539
|
+
assert rae0.valid?
|
540
|
+
assert_equal(?d, rae0.begin)
|
541
|
+
assert_nil rae0.end
|
542
|
+
# assert_equal (?d..nil).size, rae0.size # assert_nil warning!
|
543
|
+
assert_nil (?d..nil).size
|
544
|
+
assert_nil rae0.size
|
545
|
+
assert_equal true, rae0.exclude_end?
|
546
|
+
refute rae0.exclude_begin?
|
547
|
+
end
|
548
|
+
|
549
|
+
def test_new_endless_range03
|
550
|
+
begin
|
551
|
+
_ = (?d...nil)
|
552
|
+
rescue ArgumentError
|
553
|
+
# Before Ruby 2.6
|
554
|
+
assert_raises(ArgumentError) {RangeExtd.new(?d, nil)}
|
555
|
+
return # Before Ruby 2.6
|
556
|
+
end
|
557
|
+
|
558
|
+
ra00 = (-Float::INFINITY...) # This raises the uncapturable SyntaxError for Ruby 2.5 and before anyway.
|
559
|
+
rae0 = RangeExtd.new(ra00)
|
560
|
+
assert rae0.valid?
|
561
|
+
assert_equal(-Float::INFINITY, rae0.begin)
|
562
|
+
assert_nil rae0.end
|
563
|
+
assert_equal Float::INFINITY, rae0.size
|
564
|
+
assert_equal ra00.exclude_end?, rae0.exclude_end?
|
565
|
+
refute rae0.exclude_begin?
|
566
|
+
end
|
567
|
+
|
568
|
+
def test_new_endless_range04
|
569
|
+
# Ruby 2.7 and later
|
570
|
+
#
|
571
|
+
# Note this would raise a SytaxError for the versions before 2.7.
|
572
|
+
|
573
|
+
assert_equal 9, RangeExtd(..9).end
|
574
|
+
assert_equal ?d, RangeExtd(..?d).end
|
575
|
+
assert_equal ?d, RangeExtd(..?d).last
|
576
|
+
assert_equal ?d, RangeExtd(..?d, true).last
|
577
|
+
assert_nil RangeExtd(..9).begin
|
578
|
+
assert_raises(RangeError){ RangeExtd(..9).first} # raise: cannot get the first element of beginless range (RangeError)
|
579
|
+
assert_nil RangeExtd(..?d).begin
|
580
|
+
assert_raises(RangeError){ (..?d).first} # raise: cannot get the first element of beginless range (RangeError)
|
581
|
+
|
582
|
+
# (nil..nil).size is Infininty, even thouth it does not agree with Ruby's doc's specification.
|
583
|
+
assert_equal (nil..).size, RaE(InfN...InfP, true).size
|
584
|
+
assert_equal (nil..).size, (InfN..InfP).size
|
585
|
+
assert_equal (nil..).size, (InfN...InfP).size
|
586
|
+
assert_equal (-InfF..InfF).size, RaE(-InfF..InfF, true).size
|
587
|
+
assert_equal 0, (InfP..InfN).size
|
588
|
+
assert_raises(FloatDomainError){ (InfP..InfP).size} # NaN
|
589
|
+
assert_raises(FloatDomainError){ (InfN..InfN).size} # NaN
|
590
|
+
assert( (nil..?a).size == (InfN..?a).size )
|
591
|
+
assert( (?a..nil).size == (?a..InfP).size )
|
317
592
|
end
|
318
593
|
|
319
594
|
def test_new_middle_strings
|
@@ -409,7 +684,8 @@ gem "minitest"
|
|
409
684
|
|
410
685
|
# Wrong range (Object input)
|
411
686
|
assert_raises(re){ RaE(2, -1) }
|
412
|
-
|
687
|
+
assert( RaE(nil, nil).valid?, 'RangeExtd(nil,nil) should be valid now, but..' )
|
688
|
+
assert( RaE(nil..nil).valid?, 'RangeExtd(nil..nil) should be valid now, but..' )
|
413
689
|
assert_raises(re){ RaE(nil, false) }
|
414
690
|
assert_raises(re){ RaE(?d..?a) }
|
415
691
|
assert_raises(re){ RaE(?a, 5) }
|
@@ -419,19 +695,26 @@ gem "minitest"
|
|
419
695
|
assert_equal RangeExtd::NONE, RaE(?a, ?a, true, true)
|
420
696
|
assert_equal (0..0), RaE(0, 0, false, false)
|
421
697
|
|
698
|
+
# The following used to raise RangeError (Ver.0.4 and 1.0) or ArgumentError (<= Ver.0.4.0)
|
699
|
+
assert_output('', /Infinity/i){RaE(RangeExtd::Infinity::NEGATIVE, Float::INFINITY)} # Warning = "RangeExtd component of the RangeExtd::Infinity object replaced with Float::INFINITY"
|
700
|
+
capture_io{
|
701
|
+
ra_b = RaE(InfN, InfF).begin # RangeExtd::Infinity::NEGATIVE replaced with -Float::INFINITY
|
702
|
+
assert_equal( -InfF, ra_b)
|
703
|
+
assert_operator Float, '===', ra_b
|
704
|
+
}
|
705
|
+
|
422
706
|
# Wrong range (Infinity input)
|
423
707
|
assert_raises(re){ RaE(?a, RangeExtd::Infinity::NEGATIVE) }
|
424
708
|
assert_equal (RangeExtd::Infinity::NEGATIVE..?a), RaE(RangeExtd::Infinity::NEGATIVE, ?a)
|
425
709
|
assert_equal (RangeExtd::Infinity::NEGATIVE...?a), RaE(RangeExtd::Infinity::NEGATIVE, ?a, nil, 3)
|
426
710
|
assert_equal (?a..RangeExtd::Infinity::POSITIVE), RaE(?a, RangeExtd::Infinity::POSITIVE)
|
427
711
|
assert_equal RangeExtd, RaE(?a, RangeExtd::Infinity::POSITIVE, 1).class
|
428
|
-
|
429
|
-
assert_raises(re){ RaE(-Float::INFINITY, RangeExtd::Infinity::POSITIVE) } # Float::INFINITY is an exception - you should not mix it up.
|
712
|
+
|
430
713
|
assert_raises(re){ RaE(RangeExtd::Infinity::POSITIVE, ?a) }
|
431
714
|
assert_raises(re){ RaE(RangeExtd::Infinity::POSITIVE, RangeExtd::Infinity::NEGATIVE) }
|
432
715
|
assert_equal RangeExtd, RaE(RangeExtd::Infinity::NEGATIVE, RangeExtd::Infinity::POSITIVE).class
|
433
|
-
assert_raises(re){ RaE(RangeExtd::Infinity::NEGATIVE, 0, false, false) } # For Numeric, you should use -Float::INFINITY
|
434
|
-
assert_raises(re){ RaE(0, RangeExtd::Infinity::POSITIVE, false, false) } # For Numeric, you should use Float::INFINITY
|
716
|
+
# assert_raises(re){ RaE(RangeExtd::Infinity::NEGATIVE, 0, false, false) } # For Numeric, you should use -Float::INFINITY
|
717
|
+
# assert_raises(re){ RaE(0, RangeExtd::Infinity::POSITIVE, false, false) } # For Numeric, you should use Float::INFINITY
|
435
718
|
assert_equal RangeExtd, RaE(RangeExtd::Infinity::NEGATIVE, ?a, false, false).class
|
436
719
|
assert_equal RangeExtd, RaE(?a, RangeExtd::Infinity::POSITIVE, false, false).class
|
437
720
|
# assert_raises(ae){ RaE(RangeExtd::Infinity::NEGATIVE, ?a, true) } #### No exception. Is it OK???
|
@@ -439,7 +722,6 @@ gem "minitest"
|
|
439
722
|
|
440
723
|
# Wrong range (Range input)
|
441
724
|
assert_raises(re){ RangeExtd(2..-1) }
|
442
|
-
assert_raises(re){ RangeExtd(nil..nil) }
|
443
725
|
assert_raises(re){ RangeExtd(?d..?a) }
|
444
726
|
|
445
727
|
# Range with contradictory boundary
|
@@ -453,13 +735,22 @@ gem "minitest"
|
|
453
735
|
end
|
454
736
|
|
455
737
|
def test_new_invalid_endless_range01
|
456
|
-
ra00 = (nil..)
|
457
|
-
refute RangeExtd.valid?(ra00)
|
458
|
-
assert_raises(RangeError){ RangeExtd.new(ra00) }
|
459
|
-
|
460
738
|
ra01 = (true..)
|
461
739
|
refute RangeExtd.valid?(ra01)
|
462
|
-
assert_raises(RangeError){ RangeExtd.new(ra01)
|
740
|
+
assert_raises(RangeError){ RangeExtd.new(ra01)} # the combination of the arguments does not constitute a valid RangeExtd instance.
|
741
|
+
ra02 = (..true)
|
742
|
+
refute RangeExtd.valid?(ra02)
|
743
|
+
assert_raises(RangeError){ RangeExtd.new(ra02)} # the combination of the arguments does not constitute a valid RangeExtd instance.
|
744
|
+
end
|
745
|
+
|
746
|
+
def test_new_valid_endless_range02
|
747
|
+
ras = [(nil..nil), (nil...nil), RangeExtd((..nil), true), RangeExtd((...nil), true)]
|
748
|
+
# These raise the uncapturable SyntaxError for Ruby 2.5 and earlier.
|
749
|
+
# However, the former two are a meaningful expression in Ruby-2.7+
|
750
|
+
ras.each do |er|
|
751
|
+
assert RangeExtd.valid?(er), er.inspect+" should be valid now."
|
752
|
+
RangeExtd.new(er) # Nothing should be raised
|
753
|
+
end
|
463
754
|
end
|
464
755
|
|
465
756
|
def test_new_exclude_begin_end
|
@@ -557,32 +848,50 @@ gem "minitest"
|
|
557
848
|
assert_raises ArgumentError do
|
558
849
|
RangeExtd.new(5)
|
559
850
|
end
|
560
|
-
assert_raises RangeError do
|
561
|
-
RangeExtd.new(nil,5)
|
562
|
-
end
|
563
|
-
assert_raises RangeError do
|
564
|
-
RangeExtd.new(nil,5,true)
|
565
|
-
end
|
566
|
-
end # def test_exclude_begin
|
567
851
|
|
852
|
+
RangeExtd.new(nil,5) # used to be RangeError (in RangeExtd Ver.1), but nothing should be raised now.
|
853
|
+
RangeExtd.new(nil,5,true) # used to be RangeError (in RangeExtd Ver.1), but nothing should be raised now.
|
854
|
+
end # def test_exclude_begin
|
568
855
|
|
569
|
-
# Test of Range(Extd)#is_none?
|
570
|
-
def test_is_none
|
571
|
-
assert (RangeExtd::NONE.is_none?)
|
572
|
-
assert !(RangeExtd( 1, 1,true,true).is_none?)
|
573
|
-
assert !(RangeExtd(?a,?a,true,true).is_none?)
|
574
|
-
assert !((1...1).is_none?)
|
575
|
-
end
|
576
856
|
|
577
|
-
# Test of Range(Extd)#is_all?
|
857
|
+
# Test of Range(Extd)#is_all? and Range#equiv_all?
|
578
858
|
def test_is_all
|
579
859
|
assert (RangeExtd::ALL.is_all?)
|
860
|
+
refute (RangeExtd::NONE.is_all?)
|
580
861
|
assert (RangeExtd(RangeExtd::Infinity::NEGATIVE, RangeExtd::Infinity::POSITIVE).is_all?) # You can create it, if you want.
|
581
|
-
assert
|
582
|
-
|
862
|
+
assert (RangeExtd(RangeExtd::Infinity::NEGATIVE, RangeExtd::Infinity::POSITIVE).equiv_all?)
|
863
|
+
refute (RangeExtd::Infinity::NEGATIVE..RangeExtd::Infinity::POSITIVE).is_all? # Not the standard Range, though.
|
864
|
+
assert (RangeExtd::Infinity::NEGATIVE..RangeExtd::Infinity::POSITIVE).equiv_all?
|
865
|
+
refute (-Float::INFINITY..Float::INFINITY).is_all?
|
866
|
+
refute (RangeExtd(-Float::INFINITY, Float::INFINITY).is_all?) # Different from Numeric, though.
|
867
|
+
assert (RangeExtd(-Float::INFINITY, Float::INFINITY).equiv_all?)
|
868
|
+
assert (-Float::INFINITY..Float::INFINITY).equiv_all?
|
869
|
+
assert (nil..).equiv_all?, '(nil..) should not be *equivalent* to RangeExtd::ALL.'
|
870
|
+
assert ((..nil).equiv_all?)
|
871
|
+
assert ((nil..nil).equiv_all?)
|
872
|
+
refute ((nil...).equiv_all?) # because of exclude_end
|
873
|
+
refute (nil..).is_all?, '(nil..) should not be *identical* to RangeExtd::ALL.'
|
874
|
+
refute ((..nil).is_all?)
|
875
|
+
refute ((nil..nil).is_all?)
|
876
|
+
refute ((nil...).is_all?)
|
877
|
+
assert (nil..nil).equiv?( RangeExtd::ALL)
|
878
|
+
refute (nil...nil).equiv?(RangeExtd::ALL)
|
879
|
+
assert_equal (nil..), (..nil)
|
880
|
+
assert_operator (nil..), :eql?, (..nil)
|
881
|
+
assert_equal (nil..), (RangeExtd::Infinity::NEGATIVE..RangeExtd::Infinity::POSITIVE)
|
882
|
+
assert_equal (RangeExtd::Infinity::NEGATIVE..RangeExtd::Infinity::POSITIVE), (nil..)
|
883
|
+
assert_equal RangeExtd::ALL, (nil..)
|
884
|
+
refute_equal RangeExtd::ALL, (nil...)
|
885
|
+
assert_equal((nil..), RangeExtd::ALL)
|
886
|
+
refute_equal((nil...), RangeExtd::ALL)
|
887
|
+
assert_equal RangeExtd::ALL, RaE((nil..))
|
888
|
+
refute_equal RangeExtd::ALL, RaE((nil...))
|
889
|
+
assert_equal RaE(nil..), RangeExtd::ALL
|
890
|
+
refute_equal RaE((nil..), true), RangeExtd::ALL
|
891
|
+
refute_operator RangeExtd::ALL, :eql?, (nil..) # They are NOT eql? (but :==)
|
892
|
+
refute_operator (nil..), :eql?, RangeExtd::ALL
|
583
893
|
end
|
584
894
|
|
585
|
-
|
586
895
|
# Test of Range#== because it has changed first!
|
587
896
|
def test_eql_range
|
588
897
|
assert (@r11 == (@ib..@ie))
|
@@ -659,6 +968,21 @@ gem "minitest"
|
|
659
968
|
assert_equal false, ((?a...?a) == RangeExtd(?a...?b, true))
|
660
969
|
end
|
661
970
|
|
971
|
+
def test_eql4
|
972
|
+
assert_equal((NOWHERE..nil), (NOWHERE..))
|
973
|
+
refute_equal((..nil), (..NOWHERE))
|
974
|
+
refute_equal((..nil), (NOWHERE..))
|
975
|
+
|
976
|
+
# The following is in fact unexpected...
|
977
|
+
# NOWHERE behaves like nil, and so I would expect it would be the same as (nil..?a).
|
978
|
+
# Note RangeExtd::Infinity::NEGATIVE is accepted. It seems that
|
979
|
+
# the begin object must have <=> method, unless it is *literally* NilClass nil.
|
980
|
+
#
|
981
|
+
# In this particular case, this is not a problem, because
|
982
|
+
# NOWHERE desirably should not be used in conjunction with other objects
|
983
|
+
# in the first place.
|
984
|
+
assert_raises(ArgumentError, '"bad value for range" would be raised'){(NOWHERE..?a)}
|
985
|
+
end
|
662
986
|
|
663
987
|
def test_begin
|
664
988
|
assert_equal(@ib, @s11.begin)
|
@@ -684,7 +1008,6 @@ gem "minitest"
|
|
684
1008
|
# irb> (5.2...9).first(1) # => TypeError: can't iterate from Float
|
685
1009
|
# irb> RangeExtd(5.2,9,:exclude_begin=>true).first(1) # => [6] # Not right!
|
686
1010
|
#
|
687
|
-
|
688
1011
|
assert_equal(@ib, @s11.first)
|
689
1012
|
assert_equal(@ib, @s12.first)
|
690
1013
|
assert_equal(@ib, @s21.first)
|
@@ -696,9 +1019,6 @@ gem "minitest"
|
|
696
1019
|
assert_raises RangeError do
|
697
1020
|
RangeExtd(9, 3, true)
|
698
1021
|
end
|
699
|
-
assert_raises ArgumentError do
|
700
|
-
@s22.first(1, 3)
|
701
|
-
end
|
702
1022
|
|
703
1023
|
## String
|
704
1024
|
sc1 = RangeExtd.new("D".."F", false)
|
@@ -724,10 +1044,17 @@ gem "minitest"
|
|
724
1044
|
sf2.first(1)
|
725
1045
|
end
|
726
1046
|
|
727
|
-
##
|
728
|
-
|
729
|
-
|
730
|
-
end
|
1047
|
+
## Infinity
|
1048
|
+
rain = RaE(InfN, InfP, true)
|
1049
|
+
assert( rain.begin.eql?(InfN) )
|
1050
|
+
assert( rain.end.eql?( InfP) )
|
1051
|
+
assert( rain.first.eql?(InfN) )
|
1052
|
+
assert( rain.last.eql?( InfP) )
|
1053
|
+
assert_raises(TypeError){ rain.first(1) }
|
1054
|
+
# assert_raises(TypeError){ rain.last(1) } # => infinite loop!
|
1055
|
+
|
1056
|
+
## beginless/endless
|
1057
|
+
RangeExtd.new(nil..nil, true) # used to be RangeError (in RangeExtd Ver.1), but nothing should be raised now.
|
731
1058
|
|
732
1059
|
assert_raises ArgumentError do
|
733
1060
|
@s22.first(-7) # "negative array size (or size too big)"
|
@@ -738,6 +1065,18 @@ gem "minitest"
|
|
738
1065
|
assert_raises TypeError do
|
739
1066
|
@s22.first(nil)
|
740
1067
|
end
|
1068
|
+
|
1069
|
+
# (..nil).first : cannot get the first element of beginless range (RangeError)
|
1070
|
+
# (2..2).first(-1) : negative array size (or size too big) (ArgumentError)
|
1071
|
+
# (2..2).first(1,2) : wrong number of arguments (given 2, expected 1) (ArgumentError)
|
1072
|
+
# (2..2).first(?a) : no implicit conversion of String into Integer (TypeError)
|
1073
|
+
# (true..true).first(1) : can't iterate from TrueClass (TypeError)
|
1074
|
+
assert_raises(RangeError){ RangeExtd::NONE.first }
|
1075
|
+
assert_equal RangeExtd::NONE, RaE(3...3, true)
|
1076
|
+
assert_equal 3, RaE(3...3, true).first, 'Alghough (3<...3) == NONE, (3<...3).first should return a value (in the same way as (-Float::INFINITY..5).first returns -Infinity)'
|
1077
|
+
assert_raises(RangeError){ RangeExtd::NONE.first(2) }
|
1078
|
+
assert_raises(ArgumentError){ RaE(2,3,true).first(1,2) } # Wrong number of arguments
|
1079
|
+
assert_raises(ArgumentError){ RaE(2,3,true).first(-1) } # Negative index
|
741
1080
|
end # def test_first
|
742
1081
|
|
743
1082
|
|
@@ -768,6 +1107,7 @@ gem "minitest"
|
|
768
1107
|
end
|
769
1108
|
|
770
1109
|
|
1110
|
+
# alias to :===, :member?
|
771
1111
|
def test_include
|
772
1112
|
assert @s11.include?(@ib)
|
773
1113
|
assert @s11.include?(@ie)
|
@@ -792,6 +1132,13 @@ gem "minitest"
|
|
792
1132
|
assert !(RangeExtd.new("a", "z", 777) === "a")
|
793
1133
|
assert (RangeExtd.new("a", "z", nil) === "a")
|
794
1134
|
assert (RangeExtd.new("a", "z", 777) === "b")
|
1135
|
+
|
1136
|
+
assert (RaE(..nil, true) === "b")
|
1137
|
+
assert (RaE(..nil, true) === nil)
|
1138
|
+
assert (RangeExtd::ALL === ?b)
|
1139
|
+
refute (RangeExtd::NONE === ?b)
|
1140
|
+
refute (RangeExtd::NONE === nil) # NONE includes nothing
|
1141
|
+
refute (RangeExtd::NONE === NOWHERE) # NONE includes nothing, even NOWHERE (because of exclude_begin/end)
|
795
1142
|
end # def test_include
|
796
1143
|
|
797
1144
|
|
@@ -860,10 +1207,41 @@ gem "minitest"
|
|
860
1207
|
end # def test_cover
|
861
1208
|
|
862
1209
|
|
1210
|
+
# No redefinition of the method, because super() works fine!
|
1211
|
+
def test_count
|
1212
|
+
assert_equal 5, RaE(1..5).count
|
1213
|
+
assert_equal 4, RaE(1...5).count
|
1214
|
+
assert_equal 3, RaE(1...5, true).count
|
1215
|
+
assert_equal 5, RaE(1...5.1).count
|
1216
|
+
assert_equal 4, RaE(1...5.1, true).count
|
1217
|
+
assert_raises(TypeError){ RaE(1.0..5).count } # can't iterate from Float
|
1218
|
+
assert_equal 0, RaE(1..5.1).count(5.1)
|
1219
|
+
assert_equal 1, RaE(1..5.1).count(1)
|
1220
|
+
assert_equal 0, RaE(1..5.1, true).count(1)
|
1221
|
+
assert_equal 2, RaE(1..5.1).count{|i| i<3}
|
1222
|
+
assert_equal 1, RaE(1..5.1, true).count{|i| i<3}
|
1223
|
+
assert_raises(TypeError){ (..5).count{|i| i<3} } # can't iterate from NilClass
|
1224
|
+
assert_raises(TypeError){ RaE(..5).count{|i| i<3} }
|
1225
|
+
# (1..).count{|i| i<3} # => infinite loop
|
1226
|
+
assert_equal InfF, RaE(5..).count
|
1227
|
+
assert_equal InfF, RaE(..5).count
|
1228
|
+
assert_equal InfF, (..nil).count
|
1229
|
+
assert_raises(TypeError){ (..nil).count(3) } # can't iterate from NilClass
|
1230
|
+
assert_raises(TypeError){ (..nil).count{|i| i<3} }
|
1231
|
+
assert_equal InfF, (-Float::INFINITY..nil).count
|
1232
|
+
assert_equal InfF, RaE(-Float::INFINITY..nil, true).count
|
1233
|
+
assert_raises(TypeError){ (-Float::INFINITY..Float::INFINITY).count } # can't iterate from Float (TypeError)
|
1234
|
+
assert_raises(TypeError){ RaE(-Float::INFINITY..Float::INFINITY).count }
|
1235
|
+
assert_equal InfF, RangeExtd::ALL.count # A special case, like (..nil).
|
1236
|
+
end
|
1237
|
+
|
1238
|
+
|
863
1239
|
def test_hash
|
864
1240
|
assert_equal(@r11.hash, @s11.hash)
|
865
1241
|
assert_equal(@r12.hash, @s12.hash)
|
866
|
-
|
1242
|
+
refute_equal(@r12.hash, @s22.hash)
|
1243
|
+
refute_equal RangeExtd::NONE.hash, (...nil).hash
|
1244
|
+
refute_equal RangeExtd::NONE.hash, RaE((...nil), true).hash
|
867
1245
|
end # def test_hash
|
868
1246
|
|
869
1247
|
def test_min
|
@@ -874,17 +1252,25 @@ gem "minitest"
|
|
874
1252
|
|
875
1253
|
assert_equal(@ie-1, @s22.min{|a,b| -a <=> -b})
|
876
1254
|
|
877
|
-
assert_raises
|
878
|
-
|
879
|
-
|
1255
|
+
assert_raises(TypeError){ RangeExtd.new(1.0, 5, :exclude_begin => true).min }
|
1256
|
+
assert_raises(RangeError){ (..3).min } # cannot get the minimum of beginless range
|
1257
|
+
|
1258
|
+
assert_equal(?b, (?b...).min)
|
1259
|
+
assert_equal(?b, (?b...InfP).min)
|
1260
|
+
assert_equal(?b, RaE(?b...InfP).min)
|
1261
|
+
assert_equal(?c, RaE(?b...InfP, true).min)
|
1262
|
+
assert_raises(RangeError){ RaE(..?z).min }
|
1263
|
+
assert_equal(-InfF, RaE(-InfF..9.2).min)
|
1264
|
+
assert_equal InfN, RaE(InfN..?z).min
|
880
1265
|
end # def test_min
|
881
1266
|
|
882
1267
|
def test_min_by
|
883
1268
|
assert_equal(@ib+1, @s22.min_by.each{|i| i})
|
884
1269
|
|
885
|
-
|
886
|
-
|
887
|
-
|
1270
|
+
assert_equal Enumerator, RangeExtd.new(1.0, 5, true).min_by.class
|
1271
|
+
assert_raises(TypeError){ RangeExtd.new(1.0, 5, true).min_by{|i|} }
|
1272
|
+
assert_raises(TypeError){ RangeExtd.new(1.0, 5, true).min_by.each{|i| i} } # can't iterate from Float (TypeError)
|
1273
|
+
assert_equal 2, RangeExtd.new(1..5, exclude_begin: true).min_by.each{|i| i}
|
888
1274
|
|
889
1275
|
assert_equal(@ie-1, @s22.min_by{|a| -a })
|
890
1276
|
end # def test_min_by
|
@@ -898,24 +1284,26 @@ gem "minitest"
|
|
898
1284
|
|
899
1285
|
assert_equal([@ie-1,@ib+1], @s22.minmax{|a,b| -a <=> -b}) # Not the best test...
|
900
1286
|
|
901
|
-
assert_raises
|
902
|
-
|
903
|
-
|
1287
|
+
assert_raises(TypeError){ RangeExtd.new(1.0, 5, true).minmax }
|
1288
|
+
assert_raises(RangeError){ (?b...).minmax } # cannot get the maximum of endless range
|
1289
|
+
assert_raises(RangeError){ RaE(?b...).minmax }
|
904
1290
|
end # def test_minmax
|
905
1291
|
|
906
1292
|
|
907
1293
|
def test_minmax_by
|
908
1294
|
assert_equal([@ib+1,@ie-1], @s22.minmax_by.each{|i| i})
|
909
1295
|
|
910
|
-
assert_raises
|
911
|
-
|
912
|
-
|
1296
|
+
assert_raises(TypeError){ (1.0...5).minmax_by{|i| } }
|
1297
|
+
assert_raises(TypeError){ RangeExtd.new(1.0, 5, true).minmax_by{|i| } }
|
1298
|
+
assert_equal Enumerator, RangeExtd.new(1.0, 5, true).minmax_by.class
|
913
1299
|
|
914
1300
|
assert_equal([@ie-1,@ib+1], @s22.minmax_by{|a| -a })
|
915
1301
|
end # def test_minmax_by
|
916
1302
|
|
917
1303
|
|
918
1304
|
def test_max
|
1305
|
+
assert_raises(TypeError){ (2.0...4.9).max } # cannot exclude non Integer end value
|
1306
|
+
assert_raises(TypeError){ (1.3...5).max } # cannot exclude end value with non Integer begin value
|
919
1307
|
assert_equal(@ie, @s11.max)
|
920
1308
|
assert_equal(@ie-1, @s12.max)
|
921
1309
|
assert_equal(@ie, @s21.max)
|
@@ -923,20 +1311,22 @@ gem "minitest"
|
|
923
1311
|
|
924
1312
|
assert_equal(@ib+1, @s22.max{|a,b| -a <=> -b}) # Not the best test...
|
925
1313
|
|
926
|
-
|
927
|
-
|
928
|
-
|
1314
|
+
assert_equal 5, RaE(1.0, 5, true).max
|
1315
|
+
|
1316
|
+
assert_raises(RangeError){ (...?z).max } # cannot get the maximum of beginless range with custom comparison method
|
1317
|
+
assert_raises(RangeError){ RaE(...?z, true).max }
|
1318
|
+
assert_equal(?z, RaE(InfN..?z).max)
|
1319
|
+
assert_nil RaE(5...6, true).max
|
929
1320
|
end # def test_max
|
930
1321
|
|
931
1322
|
|
932
1323
|
def test_max_by
|
933
1324
|
assert_equal(@ie-1, @s22.max_by.each{|i| i})
|
934
|
-
|
935
|
-
assert_raises
|
936
|
-
RangeExtd.new(1.0, 5, true).max_by
|
937
|
-
end
|
1325
|
+
assert_equal Enumerator, RaE(1.0, 5, true).max_by.class
|
1326
|
+
assert_raises(TypeError){ RaE(1.0, 5, true).max_by{|i|} } # can't iterate from Float
|
938
1327
|
|
939
1328
|
assert_equal(@ib+1, @s22.max_by{|a| -a })
|
1329
|
+
assert_equal(3, RaE(3...6).max_by{|a| -a })
|
940
1330
|
end # def test_max_by
|
941
1331
|
|
942
1332
|
|
@@ -1004,6 +1394,28 @@ gem "minitest"
|
|
1004
1394
|
end
|
1005
1395
|
end # def test_size
|
1006
1396
|
|
1397
|
+
# Following the main doc...
|
1398
|
+
def test_size2
|
1399
|
+
assert_equal InfF, RaE(5..InfF).size
|
1400
|
+
assert_equal InfF, RaE(..?z).size # This contradicts the specification. Should be nil.
|
1401
|
+
assert_equal InfF, RaE(...?z, true).size
|
1402
|
+
assert_equal InfF, RaE(..nil).size # This may contradict the specification?
|
1403
|
+
assert_equal InfF, RaE(...nil, true).size
|
1404
|
+
assert_equal InfF, RaE(3.., true).size
|
1405
|
+
assert_equal InfF, RaE(..?a, true).size # This contradicts the specification. Should be nil.
|
1406
|
+
assert_equal InfF, RaE(InfN...?a, true).size
|
1407
|
+
assert_nil RaE(?a.., true).size
|
1408
|
+
assert_nil RaE(?a...InfP, true).size
|
1409
|
+
assert_equal 0, RangeExtd::NONE.size # This specification may change.
|
1410
|
+
assert_nil RaE(?a...?a, true).size # Any size with non-Numeric Range is nil.
|
1411
|
+
|
1412
|
+
# More perplexing standard Ruby behaviours.
|
1413
|
+
# Bug #18993: https://bugs.ruby-lang.org/issues/18993
|
1414
|
+
assert_equal 3, (5.quo(3)...5).size # => 3
|
1415
|
+
assert_equal 4, (5.quo(3).to_f...5).size # => 4
|
1416
|
+
assert_equal 4, (5.quo(3)..5).size # => 4
|
1417
|
+
assert_equal 4, (5.quo(3).to_f..5).size # => 4
|
1418
|
+
end # def test_size2
|
1007
1419
|
|
1008
1420
|
def test_step
|
1009
1421
|
ns=0; @s11.step(2){|i| ns+=i}
|
@@ -1049,14 +1461,22 @@ gem "minitest"
|
|
1049
1461
|
assert_equal(-1, (RangeExtd::Infinity::NEGATIVE <=> RangeExtd::Infinity::POSITIVE))
|
1050
1462
|
assert_equal RangeExtd::Infinity::NEGATIVE, RangeExtd::Infinity::NEGATIVE
|
1051
1463
|
assert_equal RangeExtd::Infinity::NEGATIVE, RangeExtd::Infinity::NEGATIVE
|
1052
|
-
|
1053
|
-
|
1054
|
-
|
1055
|
-
|
1056
|
-
|
1057
|
-
|
1058
|
-
|
1059
|
-
|
1464
|
+
refute RangeExtd::Infinity::POSITIVE.respond_to? :succ
|
1465
|
+
refute RangeExtd::Infinity::NEGATIVE.respond_to? :succ
|
1466
|
+
refute_equal(-Float::INFINITY, RangeExtd::Infinity::NEGATIVE)
|
1467
|
+
refute_equal Float::INFINITY, RangeExtd::Infinity::POSITIVE
|
1468
|
+
assert_raises(ArgumentError) { Float::INFINITY < RangeExtd::Infinity::POSITIVE }
|
1469
|
+
assert_raises(ArgumentError) { Float::INFINITY > RangeExtd::Infinity::POSITIVE }
|
1470
|
+
assert_raises(ArgumentError) { Float::INFINITY > RangeExtd::Infinity::NEGATIVE }
|
1471
|
+
assert_raises(ArgumentError) { RangeExtd::Infinity::NEGATIVE > -Float::INFINITY }
|
1472
|
+
assert_raises(ArgumentError) { RangeExtd::Infinity::NEGATIVE > Float::INFINITY }
|
1473
|
+
assert_raises(ArgumentError) { RangeExtd::Infinity::NEGATIVE < -Float::INFINITY }
|
1474
|
+
assert_raises(ArgumentError) { RangeExtd::Infinity::POSITIVE > Float::INFINITY }
|
1475
|
+
assert_raises(ArgumentError) { RangeExtd::Infinity::POSITIVE < -Float::INFINITY }
|
1476
|
+
#assert !(RangeExtd::Infinity::POSITIVE > Float::INFINITY) # Before Ver.1.1
|
1477
|
+
#assert !(RangeExtd::Infinity::NEGATIVE > -Float::INFINITY) # Before Ver.1.1
|
1478
|
+
#assert !(RangeExtd::Infinity::POSITIVE > Float::INFINITY) # Before Ver.1.1
|
1479
|
+
#assert !(RangeExtd::Infinity::POSITIVE < Float::INFINITY) # Before Ver.1.1
|
1060
1480
|
assert (RangeExtd::Infinity::POSITIVE > 0)
|
1061
1481
|
assert (RangeExtd::Infinity::POSITIVE > RangeExtd::Infinity::NEGATIVE)
|
1062
1482
|
assert (RangeExtd::Infinity::NEGATIVE < 0)
|
@@ -1068,6 +1488,8 @@ gem "minitest"
|
|
1068
1488
|
assert !(RangeExtd::Infinity::POSITIVE === RangeExtd::Infinity::NEGATIVE)
|
1069
1489
|
assert !(RangeExtd::Infinity::NEGATIVE === RangeExtd::Infinity::POSITIVE)
|
1070
1490
|
|
1491
|
+
#### Comment valid up to Ver.1.0 (changed in Ver.1.1)
|
1492
|
+
#
|
1071
1493
|
## This is the case so far. Rewrite Float/Fixnum/Bignum/Rational??
|
1072
1494
|
## It would get slow, though! It is a lot better to use Float::INFINITY, instead.
|
1073
1495
|
# assert_raises ArgumentError do
|
@@ -1082,11 +1504,26 @@ gem "minitest"
|
|
1082
1504
|
assert_equal(-1, (Time.now <=> RangeExtd::Infinity::POSITIVE))
|
1083
1505
|
end
|
1084
1506
|
|
1507
|
+
def test_is_infinities
|
1508
|
+
# infinity?
|
1509
|
+
refute RangeExtd::Infinity.infinity? 5
|
1510
|
+
refute RangeExtd::Infinity.infinity? InfF
|
1511
|
+
assert RangeExtd::Infinity.infinity? InfP
|
1512
|
+
assert RangeExtd::Infinity.infinity? InfN
|
1513
|
+
assert RangeExtd::Infinity.infinity? RangeExtd::ALL.begin
|
1514
|
+
|
1515
|
+
# infinite? (similar but different!)
|
1516
|
+
refute RangeExtd::Infinity.infinite? 5
|
1517
|
+
assert RangeExtd::Infinity.infinite? InfF
|
1518
|
+
assert RangeExtd::Infinity.infinite? InfP
|
1519
|
+
assert RangeExtd::Infinity.infinite? InfN
|
1520
|
+
assert RangeExtd::Infinity.infinite? RangeExtd::ALL.begin
|
1521
|
+
end
|
1085
1522
|
|
1086
1523
|
def test_RangeExtdClass_valid
|
1087
|
-
assert
|
1088
|
-
assert
|
1089
|
-
assert
|
1524
|
+
assert RangeExtd.valid?(nil, nil, 9,9) # All 3 were true up to Version 0.1.0 and at 2.0+
|
1525
|
+
assert RangeExtd.valid?(nil...nil,9,9)
|
1526
|
+
assert RangeExtd.valid?(nil..nil, 9,9)
|
1090
1527
|
end # def test_RangeExtdClass_valid
|
1091
1528
|
|
1092
1529
|
def test_Range_valid
|
@@ -1097,7 +1534,7 @@ gem "minitest"
|
|
1097
1534
|
assert (?a..?a).valid? # single element
|
1098
1535
|
assert !(?a...?a).valid? # less than empty
|
1099
1536
|
assert (?a...?b).valid? # single element
|
1100
|
-
assert
|
1537
|
+
assert (nil..nil).valid?
|
1101
1538
|
assert !(true...true).valid?
|
1102
1539
|
assert RangeExtd(0..0).valid?
|
1103
1540
|
#assert !RangeExtd(0...0).valid?
|
@@ -1115,11 +1552,11 @@ gem "minitest"
|
|
1115
1552
|
|
1116
1553
|
# For Ruby 2.6 and onwards
|
1117
1554
|
def test_endlessRange_valid
|
1118
|
-
assert (0..).valid?
|
1555
|
+
assert (0..).valid? # This raises the uncapturable SyntaxError for Ruby 2.5 and before anyway.
|
1119
1556
|
assert (0...).valid?
|
1120
1557
|
refute (true..).valid?
|
1121
|
-
|
1122
|
-
|
1558
|
+
assert (nil...).valid? # false in Ver.1 (Ruby 2.6)
|
1559
|
+
assert (nil..nil).valid? # false in Ver.1 (Ruby 2.6)
|
1123
1560
|
assert (Float::INFINITY..Float::INFINITY).valid?
|
1124
1561
|
assert (-Float::INFINITY..Float::INFINITY).valid?
|
1125
1562
|
assert (-Float::INFINITY...Float::INFINITY).valid?
|
@@ -1134,7 +1571,8 @@ gem "minitest"
|
|
1134
1571
|
assert_nil (?a...?a).empty? # less than empty
|
1135
1572
|
assert !(?a...?b).empty? # single element
|
1136
1573
|
assert RangeExtd(?a...?b, :exclude_begin => true).empty? # empty
|
1137
|
-
|
1574
|
+
refute (nil..nil).empty?
|
1575
|
+
refute (nil..3).empty?
|
1138
1576
|
assert_nil (true...true).empty?
|
1139
1577
|
assert !RangeExtd(0..0).empty? # single element
|
1140
1578
|
assert_nil (0...0).empty?
|
@@ -1163,7 +1601,7 @@ gem "minitest"
|
|
1163
1601
|
assert (?a...?a).null? # less than empty
|
1164
1602
|
assert !(?a...?b).null? # single element
|
1165
1603
|
assert RangeExtd(?a...?b, :exclude_begin => true).null? # empty
|
1166
|
-
|
1604
|
+
refute (nil..nil).null?
|
1167
1605
|
assert (true...true).null?
|
1168
1606
|
assert !RangeExtd(0..0).null? # single element
|
1169
1607
|
assert (0...0).null?
|
@@ -1262,23 +1700,64 @@ gem "minitest"
|
|
1262
1700
|
end # def test_RangeExtd_equiv
|
1263
1701
|
|
1264
1702
|
|
1703
|
+
# Test of Range(Extd)#is_none? and RangeExtd::NONE
|
1265
1704
|
def test_RangeExtd_none
|
1705
|
+
# From examples in RangeExtd#is_none?
|
1706
|
+
assert RaE(0,0,true,true).valid?
|
1707
|
+
assert (RaE(0,0,true,true) == RangeExtd::NONE)
|
1708
|
+
assert RaE(0,0,true,true).empty?
|
1709
|
+
refute RaE(0,0,true,true).is_none?
|
1710
|
+
|
1711
|
+
refute (RangeExtd( 1, 1,true,true).is_none?)
|
1712
|
+
refute (RangeExtd(?a,?a,true,true).is_none?)
|
1713
|
+
refute ((1...1).is_none?)
|
1714
|
+
|
1266
1715
|
assert RangeExtd::NONE.is_none?
|
1267
1716
|
assert RangeExtd::NONE.valid?
|
1268
1717
|
assert RangeExtd::NONE.null?
|
1269
1718
|
assert RangeExtd::NONE.empty?
|
1270
|
-
|
1271
|
-
|
1272
|
-
|
1273
|
-
|
1719
|
+
assert_raises(RangeError){ RaE(NOWHERE...NOWHERE, true) }
|
1720
|
+
refute((NOWHERE...NOWHERE).valid?, "RangeExtd::Nowhere::NOWHERE should not reside anywhere but in RangeExtd::NONE")
|
1721
|
+
#assert_equal RaE(NOWHERE...NOWHERE, true), RangeExtd::NONE
|
1722
|
+
#refute RaE(NOWHERE...NOWHERE, true).is_none?, "Even an equivalent RangeExtd to NONE should NOT be true==is_none?"
|
1723
|
+
|
1724
|
+
assert_nil RangeExtd::NONE.begin
|
1725
|
+
assert RangeExtd::NONE.begin.nowhere?, "RangeExtd::NONE.begin should be RangeExtd::Nowhere::NOWHERE"
|
1726
|
+
assert_nil RangeExtd::NONE.end
|
1727
|
+
assert RangeExtd::NONE.end.nowhere?
|
1728
|
+
|
1729
|
+
refute RaE(0...0, true).is_none?
|
1730
|
+
refute (nil..nil).is_none?
|
1731
|
+
refute (nil...nil).is_none?
|
1732
|
+
assert RaE(...nil, true).valid?
|
1733
|
+
refute RaE(...nil, true).null?
|
1734
|
+
refute RaE(...nil, true).empty?
|
1735
|
+
|
1736
|
+
refute_equal RaE(0...0, true), RaE(?a...?a, true)
|
1737
|
+
assert_equal RaE(0...1, true), RaE(5...6, true)
|
1738
|
+
refute (RaE(0...1, true).eql?(RaE(5...6, true)))
|
1739
|
+
assert_equal RaE(0...1, true), RaE(1...1, true)
|
1740
|
+
assert_equal RaE(0...1, true), RangeExtd::NONE
|
1741
|
+
assert_equal RaE(?a...?b, true), RangeExtd::NONE
|
1742
|
+
refute_equal((1...1), RangeExtd::NONE, "comparison with invalid Range should return false")
|
1274
1743
|
assert_equal RaE(0, 0, true, true), RangeExtd::NONE
|
1275
1744
|
assert_equal RaE(?a, ?a, true, true), RangeExtd::NONE
|
1276
1745
|
assert_equal RaE(?a, ?b, true, true), RangeExtd::NONE
|
1277
1746
|
assert !RaE(?a, ?b, true, true).is_none?
|
1278
1747
|
assert RaE(?a, ?b, true, true).empty?
|
1279
1748
|
assert RaE(?a, ?b, true, true).null?
|
1280
|
-
|
1281
|
-
|
1749
|
+
|
1750
|
+
assert( RangeExtd::NONE == RangeExtd::NONE )
|
1751
|
+
refute( RangeExtd::NONE === RangeExtd::NONE )
|
1752
|
+
refute_equal( (..nil), RangeExtd::NONE)
|
1753
|
+
refute (RaE(...nil, true).eql?(RangeExtd::NONE))
|
1754
|
+
refute_equal(RaE(...nil, true), RangeExtd::NONE)
|
1755
|
+
refute_equal RangeExtd::NONE, (..nil)
|
1756
|
+
refute_equal RangeExtd::NONE, RaE(...nil, true)
|
1757
|
+
refute_equal RangeExtd::NONE, RangeExtd::ALL
|
1758
|
+
refute_equal RangeExtd::ALL, RangeExtd::NONE
|
1759
|
+
assert_equal RangeExtd::ALL, (..nil)
|
1760
|
+
assert_equal((..nil), RangeExtd::ALL)
|
1282
1761
|
end
|
1283
1762
|
|
1284
1763
|
|
@@ -1290,9 +1769,9 @@ gem "minitest"
|
|
1290
1769
|
assert RaE(?a, ?b, 5, 5) == RaE(?c, ?d, 5, 5)
|
1291
1770
|
assert RaE(11, 12, 5, 5) == RaE(11, 11, 5, 5)
|
1292
1771
|
assert RaE(11, 12, 5, 5) == RaE(1, 2, 5, 5)
|
1293
|
-
|
1772
|
+
refute RaE(11, 12, 5, 5).eql?( RaE(1, 2, 5, 5) )
|
1294
1773
|
assert RaE(11, 12, 5, 5) == RaE(3.0, 3.0, 5, 5)
|
1295
|
-
|
1774
|
+
refute RaE(11, 12, 5, 5).eql?( RaE(3.0, 3.0, 5, 5) )
|
1296
1775
|
#assert_equal RangeExtd::NONE, RangeExtd(0...0, :exclude_begin => true) # => ArgumentError
|
1297
1776
|
#assert_equal RangeExtd(0...0, :exclude_begin => true), RangeExtd::NONE
|
1298
1777
|
end
|
@@ -1303,8 +1782,8 @@ gem "minitest"
|
|
1303
1782
|
assert RangeExtd::ALL.valid?
|
1304
1783
|
assert !RangeExtd::ALL.null?
|
1305
1784
|
assert !RangeExtd::ALL.empty?
|
1306
|
-
|
1307
|
-
|
1785
|
+
refute_equal (-Float::INFINITY..Float::INFINITY), RangeExtd::ALL
|
1786
|
+
refute_equal RangeExtd::ALL, (-Float::INFINITY..Float::INFINITY)
|
1308
1787
|
assert_equal RangeExtd::Infinity::POSITIVE, RangeExtd::ALL.end
|
1309
1788
|
assert_equal RangeExtd::Infinity::NEGATIVE, RangeExtd::ALL.begin
|
1310
1789
|
end
|
@@ -1335,9 +1814,8 @@ gem "minitest"
|
|
1335
1814
|
assert_raises TypeError do
|
1336
1815
|
r.first(?a)
|
1337
1816
|
end
|
1338
|
-
|
1339
|
-
|
1340
|
-
end
|
1817
|
+
|
1818
|
+
# r.last(3) # goes into an infinite loop!
|
1341
1819
|
end
|
1342
1820
|
|
1343
1821
|
|
@@ -1375,16 +1853,20 @@ gem "minitest"
|
|
1375
1853
|
assert_equal 'z', rs.last
|
1376
1854
|
assert !rs.cover?(?z)
|
1377
1855
|
assert rs.cover?(?x)
|
1378
|
-
|
1856
|
+
assert (rs === ?x) # This used to be nil.
|
1379
1857
|
assert_equal RangeExtd::Infinity::NEGATIVE, rs.begin # It is Infinity,
|
1380
|
-
|
1858
|
+
refute_equal(-Float::INFINITY, rs.begin)
|
1381
1859
|
assert ! rs.begin.positive?
|
1382
|
-
|
1383
|
-
assert_raises
|
1384
|
-
rs.last(3)
|
1385
|
-
end
|
1860
|
+
assert( (..?z).size == rs.size )
|
1861
|
+
#assert_raises(TypeError){ rs.last(3) } # => infiite loop
|
1386
1862
|
end
|
1387
1863
|
|
1864
|
+
def test_infinity_unary_operators
|
1865
|
+
assert_equal RangeExtd::Infinity::POSITIVE, +RangeExtd::Infinity::POSITIVE
|
1866
|
+
assert_equal RangeExtd::Infinity::NEGATIVE, -RangeExtd::Infinity::POSITIVE
|
1867
|
+
assert_equal RangeExtd::Infinity::NEGATIVE, +RangeExtd::Infinity::NEGATIVE
|
1868
|
+
assert_equal RangeExtd::Infinity::POSITIVE, -RangeExtd::Infinity::NEGATIVE
|
1869
|
+
end
|
1388
1870
|
|
1389
1871
|
# Tests of all the examples in the document.
|
1390
1872
|
def test_in_document
|
@@ -1401,18 +1883,24 @@ gem "minitest"
|
|
1401
1883
|
assert (RaE(?c,?c,T,T) != RaE(1, 1, T, T)) # (1<...1) != (?c<...?c) # - because of Fixnum and String
|
1402
1884
|
assert_equal RaE(3, 4, T, T), RaE(1.0, 1.0, T, T) # (1.0<...1.0) == (3<...4) # => true
|
1403
1885
|
|
1404
|
-
# RangeExtd#eql?
|
1886
|
+
# RangeExtd#eql? (removed from doc)
|
1405
1887
|
assert_equal (1.0...5.0), (1...5) # (1...5) == (1.0...5.0) # => true
|
1406
|
-
|
1407
|
-
|
1408
|
-
|
1409
|
-
|
1410
|
-
|
1888
|
+
refute (1...5).eql?(1.0...5.0) # (1...5).eql?(1.0...5.0) # => false
|
1889
|
+
refute RaE(1, 1, T,T).eql?(RangeExtd::NONE) # (1<...1).eql?( RangeExtd::NONE) # => true
|
1890
|
+
refute RaE(?a, ?b, T,T).eql?(RangeExtd::NONE) # (?a<...?b).eql?(RangeExtd::NONE) # => true
|
1891
|
+
refute RaE(1, 1, T,T).eql?(RaE(3,4,T,T)) # (1<...1).eql?( 3<...4) # => true
|
1892
|
+
refute RaE(1.0,1.0,T,T).eql?(RaE(3,4,T,T)) # (1.0<...1.0).eql?(3<...4) # => false
|
1411
1893
|
|
1412
1894
|
# RangeExtd#===
|
1413
1895
|
assert ((?D..?z) === ?c)
|
1414
|
-
|
1415
|
-
|
1896
|
+
|
1897
|
+
if RUBY_VERSION < '2.7'
|
1898
|
+
assert !((?a..?z) === "cc")
|
1899
|
+
assert !((?B..?z) === 'dd')
|
1900
|
+
else
|
1901
|
+
assert ((?a..?z) === "cc")
|
1902
|
+
assert ((?B..?z) === 'dd')
|
1903
|
+
end
|
1416
1904
|
|
1417
1905
|
# RangeExtd#equiv?
|
1418
1906
|
assert RangeExtd(2...7,true).equiv?(3..6) # => true
|
@@ -1457,7 +1945,11 @@ gem "minitest"
|
|
1457
1945
|
assert_equal [3], (1...3.1).last(1)
|
1458
1946
|
|
1459
1947
|
# RangeExtd#minmax
|
1460
|
-
|
1948
|
+
if RUBY_VERSION < '2.7'
|
1949
|
+
assert_equal [0, 3], (0...3.5).minmax
|
1950
|
+
else
|
1951
|
+
assert_raises(TypeError){ (0...3.5).minmax } # => TypeError: cannot exclude non Integer end value
|
1952
|
+
end
|
1461
1953
|
assert_raises(TypeError){ (1.3...5).minmax } # => TypeError: can't iterate from Float
|
1462
1954
|
|
1463
1955
|
# RangeExtd#size
|
@@ -1498,8 +1990,8 @@ gem "minitest"
|
|
1498
1990
|
# RangeExtd#step # => the same as each
|
1499
1991
|
|
1500
1992
|
# RangeExtd.valid?
|
1501
|
-
assert
|
1502
|
-
assert
|
1993
|
+
assert RangeExtd.valid?(nil..nil)
|
1994
|
+
assert RangeExtd.valid?(nil...nil)
|
1503
1995
|
assert RangeExtd.valid?(0..0) # => true
|
1504
1996
|
assert !RangeExtd.valid?(0...0) # => false
|
1505
1997
|
assert !RangeExtd.valid?(0..0, true) # => false
|
@@ -1544,11 +2036,11 @@ gem "minitest"
|
|
1544
2036
|
|
1545
2037
|
# Range#==
|
1546
2038
|
assert !(1...1).valid?
|
1547
|
-
assert
|
2039
|
+
assert (nil...nil).valid?
|
1548
2040
|
assert !((1...1) == RangeExtd(1, 1, true, true)) # => false.
|
1549
2041
|
|
1550
2042
|
# Range#valid?
|
1551
|
-
assert
|
2043
|
+
assert (nil..nil).valid?
|
1552
2044
|
assert (0..0).valid? # => true
|
1553
2045
|
assert !(0...0).valid? # => false
|
1554
2046
|
assert !(2..-1).valid? # => false
|
@@ -1558,7 +2050,7 @@ gem "minitest"
|
|
1558
2050
|
assert RangeExtd::ALL.valid? # => true
|
1559
2051
|
|
1560
2052
|
# Range#empty?
|
1561
|
-
|
2053
|
+
refute (nil..nil).empty?
|
1562
2054
|
assert_nil (1...1).empty? # => nil
|
1563
2055
|
assert !(1..1).empty? # => false
|
1564
2056
|
assert RangeExtd(1...1, true).empty? # => true
|
@@ -1579,7 +2071,7 @@ gem "minitest"
|
|
1579
2071
|
# class Infinity
|
1580
2072
|
assert_equal( -1, (?z <=> RangeExtd::Infinity::POSITIVE))
|
1581
2073
|
assert_equal 1, (RangeExtd::Infinity::POSITIVE <=> ?z)
|
1582
|
-
assert_nil
|
2074
|
+
assert_nil( (50 <=> RangeExtd::Infinity::POSITIVE), 'When "range_extd/numeric" is NOT required, 50 is not comparable with POSITIVE-infinity.')
|
1583
2075
|
assert_equal 1, (RangeExtd::Infinity::POSITIVE <=> 50)
|
1584
2076
|
end # def test_in_document
|
1585
2077
|
|