rangeary 1.0.1 → 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.
@@ -1,52 +1,27 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
+ require 'tempfile'
4
+ require_relative "tee_io.rb" # Library to suppress STDERR/STDOUT <https://gist.github.com/masasakano/789030a7dc5313bd343b2de967a93200>
5
+
3
6
  $stdout.sync=true
4
7
  $stderr.sync=true
5
- # print '$LOAD_PATH=';p $LOAD_PATH
6
- arlibrelpath = []
8
+ print "$LOAD_PATH=#{$LOAD_PATH}" if $DEBUG
7
9
  arlibbase = %w(rangeary)
8
10
 
9
- arlibbase.each do |elibbase|
10
- #elibbase
11
-
12
- arAllPaths = []
13
- er=nil
14
- pathnow = nil
15
- (['../lib/', 'lib/', ''].map{|i| i+elibbase+'/'} + ['']).each do |dir|
16
- # eg., pathcand = %w(../lib/rangesmaller/ lib/rangesmaller/ rangesmaller/) + ['']
17
- begin
18
- s = dir+File.basename(elibbase)
19
- arAllPaths.push(s)
20
- #print "Trying: "; puts s
21
- require s
22
- pathnow = s
23
- break
24
- rescue LoadError => er
25
- end
26
- end # (['../lib/', 'lib/', ''].map{|i| i+elibbase+'/'} + '').each do |dir|
27
-
28
- if pathnow.nil?
29
- warn "Warning: All the attempts to load the following files have failed. Abort..."
30
- warn arAllPaths.inspect
31
- warn " NOTE: It may be because a require statement in that file failed,
32
- rather than requiring the file itself.
33
- Check with % ruby -r#{File.basename(elibbase)} -e p
34
- or maybe add env RUBYLIB=$RUBYLIB:`pwd`"
35
- # p $LOADED_FEATURES.grep(/#{Regexp.quote(File.basename(elibbase)+'.rb')}$/)
36
- raise er
37
- else
38
- #print pathnow," is loaded!\n"
39
- arlibrelpath.push pathnow
40
- end
11
+ arlibrelbase = arlibbase.map{|i| "../lib/"+i}
12
+
13
+ arlibrelbase.each do |elibbase|
14
+ require_relative elibbase
41
15
  end # arlibbase.each do |elibbase|
42
16
 
43
- print "NOTE: Library relative paths: "; p arlibrelpath
44
- print "NOTE: Library full paths:\n"
45
- arlibbase.each do |elibbase|
46
- p $LOADED_FEATURES.grep(/#{Regexp.quote(File.basename(elibbase)+'.rb')}$/)
17
+ print "NOTE: Library relative paths: "; p arlibrelbase
18
+ arlibbase4full = arlibbase.map{|i| i.sub(%r@^(../)+@, "")}+%w(range_extd)
19
+ puts "NOTE: Library full paths for #{arlibbase4full.inspect}: "
20
+ arlibbase4full.each do |elibbase|
21
+ ar = $LOADED_FEATURES.grep(/(^|\/)#{Regexp.quote(File.basename(elibbase))}(\.rb)?$/).uniq
22
+ print elibbase+": " if ar.empty?; p ar
47
23
  end
48
24
 
49
-
50
25
  #################################################
51
26
  # Unit Test
52
27
  #################################################
@@ -172,18 +147,18 @@ end
172
147
 
173
148
  def test__get_infinities
174
149
  rn = Rangeary.new
175
- hs = rn.instance_eval{_get_infinities [(77..78)], guess_strict: false}
150
+ hs = rn.instance_eval{_build_infinities({}, [(77..78)])}
176
151
  assert_equal(-InfF, hs[:negative])
177
152
  assert_equal( InfF, hs[:positive])
178
- hs = rn.instance_eval{_get_infinities [(77...InfF)], guess_strict: false}
153
+ hs = rn.instance_eval{_build_infinities({}, [(77...InfF)])}
179
154
  assert_equal(-InfF, hs[:negative])
180
155
  assert_equal( InfF, hs[:positive])
181
- hs = rn.instance_eval{_get_infinities [(-InfF..78)], guess_strict: false}
156
+ hs = rn.instance_eval{_build_infinities({}, [(-InfF..78)])}
182
157
  assert_equal(-InfF, hs[:negative])
183
158
  assert_equal( InfF, hs[:positive])
184
- hs = rn.instance_eval{_get_infinities [(77...InfF)], guess_strict: true}
185
- assert_nil hs[:negative]
186
- assert_equal( InfF, hs[:positive])
159
+ #hs = rn.instance_eval{_get_infinities [(77...InfF)], guess_strict: true}
160
+ #assert_equal false, hs[:negative]
161
+ #assert_equal( InfF, hs[:positive])
187
162
  end
188
163
 
189
164
  def test_comparable_end
@@ -191,9 +166,48 @@ end
191
166
  assert_equal InfF, Rangeary.comparable_end(0...Float::INFINITY)
192
167
  assert_nil Rangeary.comparable_end(RangeExtd::NONE)
193
168
  _ = nil..nil rescue return # nil..nil may raise Exception in some Ruby versions
194
- assert_nil Rangeary.comparable_end(nil..nil)
195
- _ = nil...nil rescue return # nil..nil may raise Exception in some Ruby versions
196
- assert_nil Rangeary.comparable_end(nil...nil)
169
+ #assert_nil Rangeary.comparable_end(nil..nil) # Ruby-2.6
170
+ assert_equal InfP, Rangeary.comparable_end(nil..nil)
171
+ assert_equal InfP, Rangeary.comparable_end(nil...nil)
172
+ end
173
+
174
+ # Since Ruby-2.7
175
+ def test_comparable_beginend
176
+ assert_raises(RangeError){Rangeary.comparable_beginend(RangeExtd::Nowhere::NOWHERE..RangeExtd::Nowhere::NOWHERE) } # ! Range#valid?
177
+ assert_raises(RangeError){Rangeary.comparable_beginend(?a...?a) } # because !Range#valid?
178
+ assert_equal RaE(5...9), Rangeary.comparable_beginend(5...9)
179
+ assert_equal RaE(?a..?b, true), Rangeary.comparable_beginend(RaE(?a, ?b, true))
180
+ assert_equal RaE(?a..?b, true), Rangeary.comparable_beginend(RaE(?a, ?b, true))
181
+ assert_equal RaE(InfN...InfP), Rangeary.comparable_beginend(...nil)
182
+ assert_equal RaE(-InfF...9.3, T), Rangeary.comparable_beginend(RaE(...9.3, true))
183
+ assert_equal RaE(9.3..InfF), Rangeary.comparable_beginend(9.3..)
184
+ assert_equal RaE(?a...InfP), Rangeary.comparable_beginend(?a...)
185
+
186
+ # infinities are given.
187
+ hsinf = {negative: ?a, positive: ?z}
188
+ assert_equal RangeExtd(?b...?z), Rangeary.comparable_beginend(?b..., infinities: hsinf)
189
+ assert_equal RangeExtd(?a..?d, T), Rangeary.comparable_beginend(RaE(..?d, T), infinities: hsinf)
190
+ ran = RaE(?c.., T)
191
+ hsinf = {positive: InfP}
192
+ assert_equal RaE(?c..InfP, T), Rangeary.comparable_beginend(ran, infinities: hsinf)
193
+ assert_equal RaE(?c..InfP, T), Rangeary.comparable_beginend(ran, infinities: {positive: nil}), "nil in infinities should be ignored in Rangeary.comparable_beginend()"
194
+
195
+ # instance-method version
196
+ hsinf = {negative: ?a, positive: ?z}
197
+ ran = RaE(..?d, T)
198
+ assert_raises(ArgumentError){ Rangeary(ran, **hsinf) } # raise: specified/inherited negative infinity ("a") is not small enough or inconsistent: (<=> nil)
199
+ ran = RaE(?a..?d, T)
200
+ rangy = Rangeary(ran, **hsinf)
201
+ assert_equal RaE(?a..?d, T), rangy.send(:_comparable_beginend, ran)
202
+
203
+ ran = RaE(?c.., T)
204
+ assert_raises(ArgumentError){ Rangeary(ran, **hsinf) } # raise: specified/inherited negative infinity ("z") is not large enough or inconsistent: (<=> nil)
205
+ rangy = Rangeary(ran)
206
+ assert_equal RaE(?c..InfP, T), rangy.send(:_comparable_beginend, ran)
207
+
208
+ ran = RaE(?c..?z, T)
209
+ rangy = Rangeary(ran, **hsinf)
210
+ assert_equal ran, rangy.send(:_comparable_beginend, ran)
197
211
  end
198
212
 
199
213
  def test_sort_ranges
@@ -212,6 +226,15 @@ end
212
226
  # Ruby 2.6 Endless Range
213
227
  assert_equal [(5..9), (5...nil), (5..nil)], Rangeary.sort_ranges((5..nil), (5...nil), (5..9))
214
228
  assert_equal [(?a..?d), (?a...nil), (?a..nil)], Rangeary.sort_ranges((?a..nil), (?a...nil), (?a..?d))
229
+
230
+ # Ruby 2.7 Beginless Range
231
+ ran = RangeExtd(nil...5, T)
232
+ assert_equal [(nil..5), ran, (1..5) ], Rangeary.sort_ranges((1..5), ran, (..5))
233
+ ran = RangeExtd(nil...?d, T)
234
+ assert_equal [(nil..?d), ran, (?b..?d)], Rangeary.sort_ranges(ran, (?b..?d), (..?d))
235
+ assert_equal [(nil..?d), ran, (?b..?d)], Rangeary.sort_ranges(ran, (?b..?d), (..?d))
236
+ ran = RangeExtd(..9, T)
237
+ assert_equal RangeExtd::NONE, Rangeary.sort_ranges(RaA, ran, RaN)[0]
215
238
  end # def test_sort_ranges
216
239
 
217
240
  def test_new
@@ -222,9 +245,28 @@ end
222
245
 
223
246
  assert_raises(NoMethodError){ Rangeary.new(3..5).reverse } # => undefined method `reverse' for <Rangeary:[3..5]>:Rangeary
224
247
  assert_raises(RuntimeError){ Rangeary.new(3..5).reverse! } # => can't modify frozen Rangeary
225
- assert_raises(ArgumentError){ Rangeary.new(3..5, nil..nil) } # => invalid parameter for RangeExtd, hence for Rangeary (nil..nil).
248
+ #assert_raises(ArgumentError){ Rangeary.new(3..5, nil..nil) } # => invalid parameter for RangeExtd, hence for Rangeary (nil..nil).
249
+ assert_equal([..nil], Rangeary.new(3..5, RangeExtd::NONE, RangeExtd::NONE, nil..nil).to_a) # nil..nil used to be an invalid parameter for RangeExtd, hence for Rangeary, too, before Ruby-2.7 (or 2.6?).
250
+ ran = [..6, 9..InfF]
251
+ rang = Rangeary(*ran)
252
+ hsinf = {negative: nil, positive: InfF}
253
+ assert_equal ran, rang
254
+ assert_equal hsinf, rang.infinities # Hash == HashInf
255
+
256
+ rang2 = Rangeary(11..13, Rangeary(*rang), 15..16)
257
+ assert_equal ran, rang2
258
+ assert_equal hsinf, rang2.infinities
259
+
260
+ assert_raises(ArgumentError, "this should fail because whereas the guessed positive infinity from the first one is Float:INFINITY, the second given infinity is +RangeExtd::Infinity::POSITIVE+, which is not comparable with +Float:INFINITY+ (although it is comparable with general Float)."
261
+ ){ Rangeary(..6, 9..InfP) } # => "comparison of Float with RangeExtd::Infinity failed"
226
262
  assert_raises(ArgumentError){ Rangeary.new(3..5, 3..1) } # => invalid parameter for RangeExtd
227
263
  assert_raises(ArgumentError){ Rangeary.new(3..5, 4...4) } # => invalid parameter for RangeExtd
264
+ assert_raises(ArgumentError){ Rangeary(?d..?f, negative: ?a, positive: ?b) } # => negative-infinity is larger than ?d
265
+ assert_raises(ArgumentError){ Rangeary(?d..?f, negative: ?e, positive: ?z) } # => negative-infinity is larger than ?d
266
+ assert_raises(ArgumentError){ Rangeary(?b..?d, ?f...?h, ?g...?j, negative: ?b, positive: ?i) }
267
+ assert_equal [?b..?d, ?f...?j], Rangeary(?b..?d, ?f...?h, ?g...?j, negative: ?b, positive: ?j).to_a
268
+ assert_raises(ArgumentError){ Rangeary(RangeExtd::NONE, negative: ?c, positive: ?a) } # negative is smaller than positive infinities
269
+ assert_raises(ArgumentError){ Rangeary(?a..?d, negative: -InfF) } # contradictory infinities.
228
270
  end # def test_new
229
271
 
230
272
  def test_new_infinity
@@ -243,10 +285,129 @@ end
243
285
  r5 = RangeExtd(?c, InfP, T)
244
286
  assert_equal [RangeExtd::ALL], Rangeary(r4,r5).to_a
245
287
 
288
+ r6 = Rangeary(InfF..InfF)
289
+ assert_equal [RangeExtd::NONE], r6 # Strange zero-sized one, handled by _replace_inf_inf(arin) # Note that irb displays [RangeExtd::NONE] as [nil...nil]
290
+ assert r6.infinities.status_is_nil?(:positive), "confidence of the infinities of the meaningless Range should be nil: infinities=#{r6.infinities.inspect}"
291
+ assert r6.infinities.status_is_nil?(:negative)
292
+ assert_equal false, r6.infinities[:positive]
293
+ assert_equal false, r6.infinities[:negative]
294
+
246
295
  assert_equal [r1], Rangeary(r1,(-InfF..-InfF))
247
- assert_equal [r1], Rangeary(r1,(InfF..InfF))
296
+ assert_equal [r1], Rangeary(r1,( InfF..InfF))
297
+
298
+ r11 = Rangeary(?f..)
299
+ err = assert_raises(ArgumentError){ Rangeary(r11, positive: ?t) }
300
+ assert_match(/positive .+ not large enough or inconsistent\b/, err.message) # (_validate_infinities) => specified positive infinities ("t") are not small enough or inconsistent: (<=> nil)
301
+ assert_raises(ArgumentError){ Rangeary(?f.., positive: ?t) }
302
+ assert_raises(ArgumentError){ Rangeary(..?f, negative: ?a) }
303
+ assert_raises(ArgumentError){ Rangeary(3.., positive: 99) }
304
+ assert_raises(ArgumentError){ Rangeary(3..InfF, positive: 99) }
305
+ assert_raises(ArgumentError){ Rangeary(-InfF..99, negative: -6) }
306
+ r12 = Rangeary(-InfF..99, negative: InfN, positive: InfP)
307
+ assert_equal InfP, r12.infinities[:positive]
308
+ assert r12.infinities.definite? :negative
309
+
310
+ ## The following used to be the case?
311
+ #err = assert_raises(ArgumentError){ Rangeary(r1,(InfF..InfF)) }
312
+ #assert_match(/not small enough or inconsistent\b/, err.message) # (_validate_infinities) => specified negative infinities (Infinity) are not small enough or inconsistent.
248
313
  end # def test_new_infinity
249
314
 
315
+ def test_new_infinity2
316
+ ## doc inside the code (Rangeary#initialize)
317
+ ran2 = ("f".."k")
318
+ rae1 = RaE("k"..nil, true)
319
+ r3 = ~(Rangeary(ran2, negative: "d"))
320
+ assert_equal Rangeary("d"..."f", rae1), r3
321
+ assert_equal "d", r3.infinities[:negative]
322
+ r4 = Rangeary(r3, negative: "a")
323
+ assert_equal "b", Rangeary(r4, negative: "b").infinities[:negative]
324
+ r5 = ~Rangeary(r4)
325
+ assert_equal Rangeary("a"..."d", "f".."k"), r5
326
+
327
+ r6 = r3 + Rangeary("c".."d", negative: "a")
328
+ assert_equal Rangeary("c"..."f", rae1), r6
329
+
330
+ assert_equal r3, r3*(..nil), "conjunction with (..nil) should never raise an Exception, because nil has a lower priority than other infinities."
331
+
332
+ r7 = nil
333
+ ################# puts "\nNOTE: A warning is suppressed during this testing. To display it, set DISPLAY_STDERR=1" if !ENV['DISPLAY_STDERR'] || ENV['DISPLAY_STDERR'].empty? ### This statement is removed because there are no warnings displayed in the end!
334
+ #TeeIO.suppress_io{|iorw|
335
+ r7 = r3*Rangeary("c".."d", negative: "a")
336
+ #iorw.rewind
337
+ #assert_match(/Inconsistent negative infinities are found\b/, iorw.read) # util.rb: _validate_select_infinities()
338
+ #}
339
+ assert_equal Rangeary("d".."d"), r7
340
+ assert_equal "a", r7.infinities[:negative]
341
+ r8 = (r3 ^ (?e..?h))
342
+ assert_equal Rangeary("d"..."e", "f".."h", rae1), r8
343
+ end # def test_new_infinity2
344
+
345
+ def test_user_infinity
346
+ # @infinities are inherited but maybe partially overwritten in initialization
347
+ ray1 = Rangeary(?h...?m, negative: ?a, positive: ?z)
348
+ assert_equal [?a...?h, ?m..?z], ~ray1
349
+ assert_equal [?b...?h, ?m..?z], ~Rangeary(ray1, negative: ?b)
350
+ assert_equal [?a...?h, ?m..?y], ~Rangeary(ray1, positive: ?y)
351
+ assert_equal [?b...?h, ?m..?y], ~Rangeary(ray1, negative: ?b, positive: ?y)
352
+ ray3 = ray1 + Rangeary(?i..?j, positive: "k")
353
+ assert_equal [?h...?m], ray3
354
+ assert_equal({positive: ?z, negative: ?a}, ray3.infinities) # Hash-extended-with-HashInf
355
+ assert_equal({positive: ?z, negative: ?a}, ray3.infinities(convert: false)) # Hash == Hash
356
+ assert ray3.infinities.definite?(:positive)
357
+ assert ray3.infinities.definite?(:negative)
358
+ ray4 = Rangeary(ray3, positive: ?m)
359
+ assert_equal ?m, ray4.infinities[:positive]
360
+ assert ray4.infinities.definite?(:positive)
361
+ err = assert_raises(ArgumentError){ ray4 + [?m..?t] } # specified/inherited positive infinity ("k") is not large enough or inconsistent: (<=> "m")
362
+ assert_match(%r@specified/inherited positive infinit.+"m".+\bnot large enough\b.+"t"@, err.message) # specified/inherited positive infinity ("m") is not large enough or inconsistent: (<=> "t")
363
+ end
364
+
365
+ def test_custom_infinity1
366
+ infend = "w"
367
+ def infend.infinite?
368
+ true
369
+ end
370
+ assert infend.infinite?
371
+
372
+ rang = Rangeary(?d..infend)
373
+ hsinf = {negative: nil, positive: "w"}
374
+ assert_equal hsinf, rang.infinities # Hash == HashInf
375
+ assert_equal [...?d], ~rang
376
+ rang = Rangeary(Rangeary(?a...?b), ?b...?c, ?d..infend, ?f..?j)
377
+ assert_equal hsinf, rang.infinities
378
+ assert_equal [?a...?c, ?d..infend], rang
379
+
380
+ # If (?f..?z) is given, which contradicts the positive infinity "w",
381
+ # what will happen?
382
+ err = assert_raises(ArgumentError, "specifying a positive infinity, InfP, as a negative infinity should raises an Exception."){
383
+ Rangeary(?b...?c, ?d..infend, Rangeary(?f..?z, negative: InfP)) } # 'specified/inherited negative infinity (INFINITY) is not small enough or inconsistent: (<=> "f")'; b/c
384
+ assert_match(%r@negative infinity\b.+ is not small enough@, err.message)
385
+ r3 = Rangeary(?b...?c, ?d..infend)
386
+ assert_equal hsinf, r3.infinities
387
+ assert r3.infinities.definite?(:positive)
388
+ r4 = Rangeary(?b...?c, ?d..infend, Rangeary(?f..?z, positive: InfP))
389
+ hsinf4 = hsinf.merge({positive: InfP})
390
+ assert_equal hsinf4, r4.infinities
391
+ assert r4.infinities.definite?(:positive)
392
+ end
393
+
394
+ def test_custom_infinity2
395
+ infend = "w"
396
+ def infend.infinite?
397
+ true
398
+ end
399
+ hsinf = {negative: nil, positive: "w"}
400
+
401
+ ra1 = Rangeary(?b...?c, ?d..infend)
402
+ ra2 = Rangeary(ra1, positive: InfP)
403
+ assert_equal hsinf.merge({positive: InfP}), ra2.infinities # Hash == HashInf
404
+ assert_equal [?b..?z], Rangeary(ra2, ?c..?z)
405
+
406
+ rang = Rangeary(?b...?c, ?d..infend, Rangeary(?f..?w, negative: InfN))
407
+ assert_equal hsinf.merge({negative: InfN}), rang.infinities
408
+ assert_equal [?b...?c, ?d..infend], rang
409
+ end
410
+
250
411
  def test_endless_range
251
412
  begin
252
413
  _ = 7..nil
@@ -260,6 +421,27 @@ end
260
421
  assert_equal [2...nil], Rangeary(8...nil, 2...4, 4..9)
261
422
  end
262
423
 
424
+ def test_beginless_range
425
+ # This would raise Syntax Error in earlier versions (2.6 or earlier?) of Ruby
426
+ assert_equal [(-Float::INFINITY)...9], Rangeary((-Float::INFINITY)..7, 3...9).to_a
427
+ assert_equal [nil..8], Rangeary(2..8, RaE(nil..3)).to_a
428
+ assert_equal [nil..8], Rangeary(2..8, nil..3).to_a
429
+ assert_equal [nil...9], Rangeary(nil...8, ...9, 4...9).to_a
430
+ assert_equal [nil..9], Rangeary(nil...8, ...9, 4..9).to_a
431
+ assert_equal [nil...9], Rangeary(nil...8, 2...4, 4...9).to_a
432
+ assert_equal [nil...9], Rangeary( 2...4, 4...9, nil...8)
433
+ assert_equal [nil...8], Rangeary(nil...8, 2...4, nil..7)
434
+ assert_equal [nil...], Rangeary( 8..., nil...8)
435
+ assert_equal [nil...8, 10...], Rangeary( 10..., nil...8)
436
+ assert_equal [nil...8, RaE(8.., true)], Rangeary(RaE(8.., true), nil...8)
437
+
438
+ ran = Rangeary(...8, RaE(8.., true))
439
+ assert_raises(RangeError ){ ran.last.last }
440
+ assert_raises(RangeError, "for RAN=#{ran.inspect}"){ ran.last_element }
441
+ assert_nil ran.last.end
442
+ assert_raises(RangeError, "for RAN=#{ran.inspect}"){ ran.last_element }
443
+ end
444
+
263
445
  def test_new_none # Essentially, the tests of compact()
264
446
  ra = Rangeary(RangeExtd::NONE, RangeExtd::NONE, RangeExtd::NONE)
265
447
  assert_equal 1, ra.size
@@ -317,10 +499,14 @@ end
317
499
  assert_equal RaA, RaA + RaN
318
500
  assert_equal RaA, RaN + RaA
319
501
 
320
- # Eendless Range since Ruby 2.6
502
+ # Endless Range since Ruby 2.6
321
503
  _ = 7..nil rescue return # before Ruby 2.6
322
504
  assert_equal [-6..-1, 2..5, 8...nil], rs+(8...nil)
323
505
  assert_equal [-6..-1, 2..5, 8..nil], Rangeary(8..nil)+rs
506
+
507
+ # Begindless Range since Ruby 2.7
508
+ assert_equal [..-1, 2..5, 8..8], rs+(...(-6))
509
+ assert_equal [..-1, 2..5, 8..8], Rangeary(..(-6))+rs
324
510
  end # def test_disjunction
325
511
 
326
512
  def test_minus
@@ -359,10 +545,18 @@ end
359
545
  _ = 7..nil rescue return # before Ruby 2.6
360
546
  assert_equal [-6..-1, 2...4], rs-(4...nil)
361
547
  rr = Rangeary(6..nil)
548
+ assert rr.infinities.definite?(:positive)
549
+ assert_nil rr.infinities[:positive]
550
+ r2 = rr-(6...8)
551
+ assert_nil r2.infinities[:positive], "positive should be nil with :definite: "+r2.infinities.inspect
552
+ assert_nil r2.infinities[:positive]
362
553
  assert_equal [8..nil], rr-(6...8)
363
554
  assert_equal [6...7], rr-(7...nil)
364
555
  rr = Rangeary(6..9, 8..nil)
365
556
  assert_equal [8..nil], rr-(6...8)
557
+
558
+ # Begindless Range since Ruby 2.7
559
+ assert_equal [3..5, 8..9], rs-(...3)
366
560
  end # def test_minus
367
561
 
368
562
  # Array#equal overwritten.
@@ -384,14 +578,18 @@ end
384
578
  refute_equal rany, []
385
579
  refute_equal [], rany
386
580
 
387
- assert_equal rany, [4..InfF]
388
- assert_equal rany, [4...InfF]
389
- assert_equal [4...InfF], rany
390
- assert_equal rany2, Rangeary(1..2, 4..InfF)
391
- assert_equal rany2, [1..2, 4..InfF]
392
- assert_equal [1..2, 4..InfF], rany2
393
- assert_equal Rangeary(?a..), [?a..InfP] # This raises the uncapturable SyntaxError for Ruby 2.5 and before anyway.
394
- assert_equal [?a..InfP], Rangeary(?a..)
581
+ ## The following used to be all true up to Rangeary Ver.1 before Ver.2
582
+ refute_equal rany, [4..InfF]
583
+ refute_equal rany, [4...InfF]
584
+ refute_equal [4...InfF], rany
585
+ refute_equal rany2, Rangeary(1..2, 4..InfF)
586
+ refute_equal rany2, [1..2, 4..InfF]
587
+ refute_equal [1..2, 4..InfF], rany2
588
+ refute_equal Rangeary(?a..), [?a..InfP] # This raises the uncapturable SyntaxError for Ruby 2.5 and before anyway.
589
+ refute_equal [?a..InfP], Rangeary(?a..)
590
+
591
+ # Ruby 2.7 Beginless Range
592
+ refute_equal [..?z], Rangeary(InfN..?z)
395
593
  end
396
594
 
397
595
  def test_brackets
@@ -524,11 +722,23 @@ end
524
722
  assert rcab.null_element?
525
723
  assert rcab.null?
526
724
 
527
- assert_equal r1, r1 * Rangeary(RangeExtd::ALL)
528
- assert_equal r1, Rangeary(RangeExtd::ALL) * r1
725
+ hsinff = {negative: -InfF, positive: InfF}
726
+ assert_raises(ArgumentError){ r1 * Rangeary(RangeExtd::ALL) } # Inconsistent given infinities: comparison of Float with RangeExtd::Infinity failed # used to be fine up to Rangeary Ver.1
727
+ r2 = r1 * Rangeary(-inf..nil) # Positive infinity (=Float::INFINITY) is inherited and preserved from r1
728
+ assert_equal r1, r2
729
+ assert_equal hsinff, r2.infinities # Hash == HashInf
730
+ # reverse
731
+ r2 = Rangeary(-inf..nil) * r1
732
+ assert_equal r1, r2
733
+ assert_equal hsinff, r2.infinities
734
+
735
+ r4 = r1 * Rangeary(..nil)
736
+ assert_equal r1, r4
737
+ assert_equal hsinff.merge({negative: nil}), r4.infinities
529
738
 
530
739
  assert_equal RaN, r1 * RaN
531
740
  assert_equal RaN, r1 * RaN
741
+ assert_equal RaN, RaA * RaN
532
742
  assert_equal RaN, RaN * r1
533
743
  assert_equal RaN, RaN * RaN
534
744
  assert_equal RaA, RaA * RaA
@@ -537,6 +747,17 @@ end
537
747
  _ = 7..nil rescue return # before Ruby 2.6
538
748
  r3 = Rangeary(1...9, 12..nil)
539
749
  assert_equal [8...9, 12...13], r3 * Rangeary(8...13)
750
+
751
+ # Begindless Range since Ruby 2.7
752
+ r4 = Rangeary(nil..?e, ?t..?y)
753
+ assert_equal [?d..?e, ?t..?t], r4 * Rangeary(?d..?t)
754
+
755
+ # preserves infinities?
756
+ assert_equal([nil..], ~(RaA * RaN))
757
+ hsinf = {negative: ?d, positive: ?q}
758
+ r5 = Rangeary(?d..?g, **hsinf) * RaN
759
+ assert_equal hsinf, r5.infinities
760
+ assert_equal([hsinf[:negative]..hsinf[:positive]], ~r5)
540
761
  end # def test_conjunctionRangeary
541
762
 
542
763
 
@@ -561,7 +782,13 @@ end
561
782
  _ = 7..nil rescue return # before Ruby 2.6
562
783
  r3 = Rangeary(9..11)
563
784
  assert_equal [8..nil], r3 + Rangeary(8..nil)
564
- assert_equal [8..InfF], r3 + Rangeary(8..nil)
785
+ refute_equal [8..InfF], r3 + Rangeary(8..nil)
786
+
787
+ # Begindless Range since Ruby 2.7
788
+ r4 = Rangeary(9..11)
789
+ assert_equal [nil..12], r4 + Rangeary(nil..12)
790
+ assert_equal [nil..12], Rangeary(nil..12) + r4
791
+ assert_equal [nil..11], Rangeary(nil..9) + r4
565
792
  end
566
793
 
567
794
 
@@ -581,7 +808,8 @@ end
581
808
 
582
809
  assert_equal r1, r1.disjunction(RaN)
583
810
  assert_equal true, r1.conjunction(RaN).null?
584
- assert_equal Rangeary(RangeExtd::ALL), r1.conjunction(RaN).negation
811
+ #assert_equal Rangeary(RangeExtd::ALL), r1.conjunction(RaN).negation # this used to be the case in up to Rangeary Ver.1
812
+ assert_equal [-InfF..InfF], r1.conjunction(RaN).negation
585
813
  assert_equal r1, r1 * (r1.conjunction(RaN).negation)
586
814
  assert_equal r1, r1 ^ RaN
587
815
  assert_equal r1, RaN ^ r1
@@ -597,24 +825,64 @@ end
597
825
  assert_equal Rangeary(-inf...3,RangeExtd(8..inf,1)), Rangeary(3..8).negation
598
826
  assert_equal Rangeary(-inf...12, RangeExtd(12...14,T), RangeExtd(15,inf,T)), ~Rangeary(12..12, 14..15)
599
827
 
600
- assert_equal Rangeary(RangeExtd::ALL), ~RaN
828
+ assert_equal([..nil], ~RaN)
829
+ # assert_equal Rangeary(RangeExtd::ALL), ~RaN # used to be the case up to Rangeary Ver.1
601
830
 
602
- # Eendless Range since Ruby 2.6
831
+ # Eendless Range since Ruby 2.6 plus Beginless Range since Ruby 2.7
603
832
  _ = 7..nil rescue return # before Ruby 2.6
604
833
  assert_equal Rangeary(-InfF...8), ~Rangeary(8...nil)
605
834
  assert_equal Rangeary(-InfF..8), ~Rangeary(RangeExtd(8..nil, exclude_begin: true))
606
- assert_equal Rangeary(InfN...?a), ~Rangeary(?a..nil)
835
+ assert_equal Rangeary(nil...?a), ~Rangeary(?a..nil)
836
+ assert_equal Rangeary(RangeExtd(7..InfF, T)), ~Rangeary(-InfF..7)
837
+ assert_equal Rangeary(RangeExtd(7..InfF, T)), ~Rangeary(..7)
838
+ assert_equal Rangeary(?c..nil), ~Rangeary(...?c)
839
+ assert_equal Rangeary(RangeExtd::NONE), ~Rangeary(RangeExtd::ALL)
840
+ assert_equal Rangeary(RangeExtd::NONE), ~Rangeary(InfN...InfP)
841
+ assert_equal Rangeary(RangeExtd::NONE), ~Rangeary(..nil)
842
+ assert_equal Rangeary(RangeExtd::NONE), ~Rangeary(...nil)
843
+ assert_equal Rangeary(RangeExtd::NONE), ~Rangeary(RangeExtd(...nil, true))
844
+
845
+ assert_equal [nil..], ~Rangeary(RangeExtd::NONE)
846
+ assert (~Rangeary(RangeExtd::NONE)).infinities.status_is_nil?(:positive)
847
+ assert (~~Rangeary(RangeExtd::NONE)).infinities.status_is_nil?(:positive)
848
+ assert (~~Rangeary(RangeExtd::NONE)).infinities.status_is_nil?(:negative)
849
+
850
+ r3 = ~Rangeary(RangeExtd(6...6, true))
851
+ assert_equal [-InfF..InfF], r3
852
+ assert r3.infinities.guessed?(:positive), "Status should be guessed for #{r3.infinities.inspect}"
853
+ r4 = ~Rangeary(InfF..InfF) # meaningless Range
854
+ assert_equal [nil..], r4 # Because Float information is lost for the meaningless Rnage
855
+ assert r4.infinities.status_is_nil?(:positive)
856
+ r5 = ~Rangeary(RangeExtd(?g...?g, true))
857
+ assert_equal [nil..], r5
858
+ # assert_equal RangeExtd::ALL, r5, "At the moment, (nil..)==RangeExtd::ALL (which is subject to change in the future?)"
859
+ assert r5.infinities.guessed?(:positive)
860
+
861
+ assert_equal Rangeary(?a...?d, ?f..?z), ~Rangeary(?d...?f, negative: ?a, positive: ?z)
862
+ assert_equal Rangeary(?d...?f), ~~Rangeary(?d...?f, negative: ?a, positive: ?z)
863
+ assert_equal Rangeary(?a...?d, ?f..?z), ~~~Rangeary(?d...?f, negative: ?a, positive: ?z)
864
+
865
+ r2 = Rangeary(6...8)
866
+ r2n = ~r2
867
+ assert r2.infinities.status_is_a?(:guessed, :positive)
868
+ assert r2.infinities.guessed?(:positive)
869
+ refute r2n.infinities.definite?(:positive)
870
+ assert r2n.infinities.guessed?(:positive), "Negated Range without an explicit infinity should have a status of :guessed"
607
871
  end # def test_negation
608
872
 
609
873
 
610
874
  def test_posinega
611
875
  inf = RangeExtd::Infinity::POSITIVE
612
876
  assert_equal Rangeary(?a...?d, ?x..?z), ~Rangeary(?d...?x, :negative => ?a, :positive => ?z)
613
- assert_equal Rangeary(?a...?d, ?x..inf), ~Rangeary(?d...?x, :negative => ?a)
877
+ assert_equal Rangeary(?a...?d, ?x..nil), ~Rangeary(?d...?x, :negative => ?a)
614
878
  assert_raises(ArgumentError){ Rangeary(?t..?z, :negative => -Float::INFINITY) }
615
- assert_raises(ArgumentError){ Rangeary(1...8.5, :negative => ?a) }
616
- _ = Rangeary(1...8.5, :positive => inf) # => No error.
879
+ #TeeIO.suppress_io{|iorw| # Inconsistent negative infinities are found: ["a", -Infinity] (=> a is used)
880
+ assert_raises(ArgumentError){ Rangeary(1...8.5, :negative => ?a) }
881
+ #}
882
+ assert_raises(ArgumentError){ Rangeary(1...8.5, negative: InfP, positive: -InfF) }
883
+ assert_raises(ArgumentError){ Rangeary(1...8.5, positive: inf) }
617
884
 
885
+ ra = rb = rc = rd = re = rf = rg = nil
618
886
  ra = Rangeary(?d...?f, :negative => ?a)
619
887
  rb = Rangeary(?g..?h, ?j...?m)
620
888
  rc = ra + rb
@@ -622,16 +890,32 @@ end
622
890
  re = Rangeary(?e...?k, :positive => ?z)
623
891
  rf = rd & re
624
892
  rg = re & rd
893
+
625
894
  assert_equal ?a, ra.infinities[:negative]
626
- assert_equal inf, ra.infinities[:positive]
895
+ assert_nil ra.infinities[:positive]
627
896
  assert_equal ?a, rc.infinities[:negative]
628
- assert_equal inf, rc.infinities[:positive]
897
+ assert_nil rc.infinities[:positive]
629
898
  assert_equal ?a, rd.infinities[:negative]
630
- assert_equal inf, rd.infinities[:positive]
899
+ assert_nil rd.infinities[:positive]
631
900
  assert_equal ?a, rf.infinities[:negative]
632
901
  assert_equal ?z, rf.infinities[:positive]
633
902
  assert_equal ?a, rg.infinities[:negative]
634
903
  assert_equal ?z, rg.infinities[:positive]
904
+
905
+ # Demonstrations of how to change infinities.
906
+ rn = Rangeary(5...9, negative: 1, positive: nil) # Without positive, it becomes +Infinity
907
+ ran1 = Rangeary(1...5, 9..)
908
+ rn_inv = ~rn
909
+ assert_equal ran1, rn_inv
910
+
911
+ # The way to change only the infinity; basically, just Rangeary.new is suffice
912
+ # because the option has always the priority.
913
+ ri = Rangeary(rn_inv, negative: -InfF)
914
+ hsinf = {:negative=>-InfF, :positive=>nil}
915
+ assert_equal hsinf, ri.infinities # Hash == HashInf
916
+ ran2 = Rangeary(-InfF...1, 5...9)
917
+ ri_inv = ~ri
918
+ assert_equal ran2, ri_inv
635
919
  end # def test_posinega
636
920
 
637
921
 
@@ -709,6 +993,14 @@ end
709
993
  end # def test_hash
710
994
 
711
995
 
996
+ def test_flatten_no_rangeary
997
+ assert_equal [RaN], Rangeary.flatten_no_rangeary(RaN)
998
+ assert_equal [RaN, RaN], Rangeary.flatten_no_rangeary(RaN, RaN)
999
+ assert_equal [RaN, RaN], Rangeary.flatten_no_rangeary([[RaN, RaN]])
1000
+ rang = Rangeary(1..2, 5...6)
1001
+ assert_equal [RaN, (2..4), RaN, RaE(5..9), rang], Rangeary.flatten_no_rangeary([[RaN, (2..4), RaN], [[RaE(5..9)], rang]])
1002
+ end
1003
+
712
1004
  def test_in_document
713
1005
  assert Rangeary(RangeExtd(1,"<...",4), 5...8).equiv?(Rangeary(2..3, 5..7)) # => true
714
1006
  assert_equal 33, Rangeary(2...4, 5..6, 8..9).flatten_element.reduce(:+) # => 33
@@ -765,15 +1057,44 @@ end
765
1057
 
766
1058
  assert_equal 2, Rangeary(1..3, 5..8).size # => 2
767
1059
  assert_equal 7, Rangeary(1..3, 5..8).size_element # => 7
768
- end # def test_in_document
769
1060
 
1061
+ ### section of Infinities (main doc)
1062
+ ran1 = nil..Float::INFINITY
1063
+ r1 = Rangeary(ran1).conjunction( RangeExtd::NONE )
1064
+ assert_equal RaN, r1
1065
+ r2 = r1.negation
1066
+ assert_equal Rangeary(ran1), r2
1067
+ assert_equal Rangeary(ran1), ~(Rangeary(nil..Float::INFINITY) * RangeExtd::NONE)
1068
+
1069
+ ran2 = ("f".."k")
1070
+ rae1 = RaE("k"..nil, true)
1071
+ assert_equal Rangeary("d"..."f", rae1), Rangeary(ran2, negative: "d").negation
1072
+
1073
+ r3 = Rangeary(ran2, negative: "d")
1074
+ r4 = ~r3
1075
+ assert_equal Rangeary("d"..."f", rae1), r4
1076
+ assert_equal "d", r4.infinities[:negative]
1077
+ assert r4.infinities.definite?(:negative)
1078
+ assert_nil r4.infinities[:positive]
1079
+ assert r4.infinities.guessed?(:positive)
1080
+ err = assert_raises(ArgumentError){ Rangeary(r4, positive: "t") } # => specified/inherited positive infinity ("t") is not large enough or inconsistent: (<=> nil)
1081
+ assert_match(/not large enough or inconsistent\b/, err.message)
1082
+ r6 = Rangeary(r3, positive: "t") # OK: positive infinity is set.
1083
+ assert_equal "d", r6.infinities[:negative]
1084
+ assert r6.infinities.definite?(:negative)
1085
+ r7 = ~r6
1086
+ assert_equal Rangeary("d"..."f", RangeExtd("k".."t", true)), r7
1087
+ assert_equal r4[0], r7[0]
1088
+ refute_equal r4[1], r7[1]
1089
+
1090
+ assert_equal Rangeary(-InfF...7), Rangeary(7..).negation
1091
+ assert_equal Rangeary(7..), Rangeary(7..).negation.negation
1092
+ assert_equal Rangeary(...7), Rangeary(7.., negative: nil).negation
1093
+ assert_equal Rangeary(...7), Rangeary(..nil).conjunction(Rangeary(7..)).negation
1094
+ assert_equal Rangeary(...7), ~(Rangeary(..nil) * Rangeary(7..))
1095
+
1096
+ end # def test_in_document
770
1097
 
771
- ### All false, well, and they should be.
772
- # def test_equal
773
- # # Plus
774
- # assert_equal RangeExtd(1..3), RangeExtd(1...4)
775
- # assert_equal Rangeary(1..3), Rangeary(1...4)
776
- # end
777
1098
 
778
1099
  end # class TestUnitFoo < MiniTest::Unit::TestCase
779
1100