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.
- checksums.yaml +4 -4
- data/ChangeLog +18 -0
- data/Makefile +2 -1
- data/News +4 -0
- data/README.ja.rdoc +461 -260
- data/lib/rangeary/util/hash_inf.rb +233 -0
- data/lib/rangeary/util.rb +727 -0
- data/lib/rangeary.rb +1420 -0
- data/rangeary.gemspec +51 -0
- data/test/tee_io.rb +111 -0
- data/test/test_rangeary.rb +400 -79
- metadata +25 -19
- data/lib/rangeary/rangeary.rb +0 -1643
data/test/test_rangeary.rb
CHANGED
@@ -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
|
-
|
6
|
-
arlibrelpath = []
|
8
|
+
print "$LOAD_PATH=#{$LOAD_PATH}" if $DEBUG
|
7
9
|
arlibbase = %w(rangeary)
|
8
10
|
|
9
|
-
arlibbase.
|
10
|
-
|
11
|
-
|
12
|
-
|
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
|
44
|
-
|
45
|
-
|
46
|
-
|
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{
|
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{
|
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{
|
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
|
-
|
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
|
-
|
196
|
-
|
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
|
-
#
|
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
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
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
|
-
|
528
|
-
|
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
|
-
|
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
|
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(
|
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..
|
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
|
-
|
616
|
-
|
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
|
-
|
895
|
+
assert_nil ra.infinities[:positive]
|
627
896
|
assert_equal ?a, rc.infinities[:negative]
|
628
|
-
|
897
|
+
assert_nil rc.infinities[:positive]
|
629
898
|
assert_equal ?a, rd.infinities[:negative]
|
630
|
-
|
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
|
|