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.
@@ -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.each do |elibbase|
10
- arAllPaths = []
11
- er=nil
12
- pathnow = nil
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: Library relative paths: "; p arlibrelpath
42
- print "NOTE: Library full paths:\n"
43
- arlibbase.each do |elibbase|
44
- p $LOADED_FEATURES.grep(/#{Regexp.quote(File.basename(elibbase)+'.rb')}$/)
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::Unit::TestCase
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
- assert_equal(-1, (c2 <=> RangeExtd::Infinity::POSITIVE))
214
- assert_equal 1, (c2 <=> RangeExtd::Infinity::NEGATIVE)
215
- r=(c2..RangeExtd::Infinity::POSITIVE)
216
- assert_equal RangeExtd::Infinity::POSITIVE, r.end
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
- assert_equal(-1, (c3 <=> RangeExtd::Infinity::POSITIVE))
245
- assert_equal 1, (c3 <=> RangeExtd::Infinity::NEGATIVE)
434
+ assert_nil(c3 <=> RangeExtd::Infinity::POSITIVE)
435
+ assert_nil(c3 <=> RangeExtd::Infinity::NEGATIVE)
246
436
 
247
- r=(c3..RangeExtd::Infinity::POSITIVE)
248
- assert_equal RangeExtd::Infinity::POSITIVE, r.end
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, T, F], arout
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
- ra00 = (-2..)
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
- ra00 = (Float::INFINITY...)
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
- assert_raises(re){ RaE(nil, nil) }
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
- assert_raises(re){ RaE(RangeExtd::Infinity::NEGATIVE, Float::INFINITY) } # Float::INFINITY is an exception - you should not mix it up.
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 !((RangeExtd::Infinity::NEGATIVE..RangeExtd::Infinity::POSITIVE).is_all?) # Not the standard Range, though.
582
- assert !(RangeExtd(-Float::INFINITY, Float::INFINITY).is_all?) # Different from Numeric, though.
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
- ## Else
728
- assert_raises RangeError do
729
- RangeExtd.new(nil..nil, true)
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
- assert (@r12.hash != @s22.hash)
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 TypeError do
878
- RangeExtd.new(1.0, 5, :exclude_begin => true).min
879
- end
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
- assert_raises TypeError do
886
- RangeExtd.new(1.0, 5, :exclude_begin => true).min_by
887
- end
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 TypeError do
902
- RangeExtd.new(1.0, 5, true).minmax
903
- end
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 TypeError do
911
- RangeExtd.new(1.0, 5, true).minmax_by
912
- end
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
- assert_raises TypeError do
927
- RangeExtd.new(1.0, 5, true).max
928
- end
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 TypeError do
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
- assert_equal RangeExtd::Infinity::POSITIVE, RangeExtd::Infinity::POSITIVE.succ
1053
- assert_equal RangeExtd::Infinity::NEGATIVE, RangeExtd::Infinity::NEGATIVE.succ
1054
- assert_equal(-Float::INFINITY, RangeExtd::Infinity::NEGATIVE)
1055
- assert_equal Float::INFINITY, RangeExtd::Infinity::POSITIVE
1056
- assert !(RangeExtd::Infinity::NEGATIVE > -Float::INFINITY)
1057
- assert !(RangeExtd::Infinity::NEGATIVE < -Float::INFINITY)
1058
- assert !(RangeExtd::Infinity::POSITIVE > Float::INFINITY)
1059
- assert !(RangeExtd::Infinity::POSITIVE < Float::INFINITY)
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 !RangeExtd.valid?(nil, nil, 9,9) # All 3 were true up to Version 0.1.0
1088
- assert !RangeExtd.valid?(nil...nil,9,9)
1089
- assert !RangeExtd.valid?(nil..nil, 9,9)
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 !(nil..nil).valid?
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
- refute (nil...).valid?
1122
- refute (nil..nil).valid?
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
- assert_nil (nil..nil).empty?
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
- assert (nil..nil).null?
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
- assert !RangeExtd(0...0, true).is_none?
1271
- assert !(nil..nil).is_none?
1272
- assert !(nil...nil).is_none?
1273
- assert_equal RaE(0...1, true), RangeExtd::NONE
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
- assert_nil RangeExtd::NONE.begin
1281
- assert_nil RangeExtd::NONE.end
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
- assert RaE(11, 12, 5, 5).eql?( RaE(1, 2, 5, 5) )
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
- assert !RaE(11, 12, 5, 5).eql?( RaE(3.0, 3.0, 5, 5) )
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
- assert_equal (-Float::INFINITY..Float::INFINITY), RangeExtd::ALL
1307
- assert_equal RangeExtd::ALL, (-Float::INFINITY..Float::INFINITY)
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
- assert_raises TypeError do
1339
- r.last(3)
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
- assert_nil (rs === ?x)
1856
+ assert (rs === ?x) # This used to be nil.
1379
1857
  assert_equal RangeExtd::Infinity::NEGATIVE, rs.begin # It is Infinity,
1380
- assert_equal(-Float::INFINITY, rs.begin) # but still equal to Float.
1858
+ refute_equal(-Float::INFINITY, rs.begin)
1381
1859
  assert ! rs.begin.positive?
1382
- assert_equal Float::INFINITY, rs.size
1383
- assert_raises TypeError do
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
- assert !(1...5).eql?(1.0...5.0) # (1...5).eql?(1.0...5.0) # => false
1407
- assert RaE(1, 1, T,T).eql?(RangeExtd::NONE) # (1<...1).eql?( RangeExtd::NONE) # => true
1408
- assert RaE(?a, ?b, T,T).eql?(RangeExtd::NONE) # (?a<...?b).eql?(RangeExtd::NONE) # => true
1409
- assert RaE(1, 1, T,T).eql?(RaE(3,4,T,T)) # (1<...1).eql?( 3<...4) # => true
1410
- assert !RaE(1.0,1.0,T,T).eql?(RaE(3,4,T,T)) # (1.0<...1.0).eql?(3<...4) # => false
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
- assert !((?a..?z) === "cc")
1415
- assert !((?B..?z) === 'dd')
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
- assert_equal [0, 3], (0...3.5).minmax
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 !RangeExtd.valid?(nil..nil) # => false
1502
- assert !RangeExtd.valid?(nil...nil) # => false
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 !(nil...nil).valid?
2039
+ assert (nil...nil).valid?
1548
2040
  assert !((1...1) == RangeExtd(1, 1, true, true)) # => false.
1549
2041
 
1550
2042
  # Range#valid?
1551
- assert !(nil..nil).valid? # => false
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
- assert_nil (nil..nil).empty? # => nil
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 (50 <=> RangeExtd::Infinity::POSITIVE)
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