range_extd 0.1.0

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