rangeary 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.
data/rangeary.gemspec ADDED
@@ -0,0 +1,47 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{rangeary}
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-05-09}
11
+ s.summary = %q{Rangeary - class to represent any 1-dimensional multiple-range}
12
+ s.description = %q{Rangeary is a sub-class of Array and represents any 1-dimensional multiple-range. For example, (x<3 and 7<x<=9). All the standard logical operations, such as negation and conjunction, are supported and can be used with conventional Ruby-style operators. Each range is represented as RangeExtd class (Extended Range), which is a sub-class of Range and supports exclude-begin and open-ended (to Infinity) ranges, and is downloadable from https://rubygems.org/gems/range_extd}
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
+ "News",
25
+ "ChangeLog",
26
+ #"README.en.rdoc",
27
+ "README.ja.rdoc",
28
+ "Rakefile",
29
+ "rangeary.gemspec",
30
+ "lib/rangeary/rangeary.rb",
31
+ "test/test_rangeary.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_rangeary.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,601 @@
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(rangeary)
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
+ # User method
162
+ def conjRE(r1, r2)
163
+ Rangeary.class_eval{ conjunctionRangeExtd(r1, r2) }
164
+ end
165
+
166
+
167
+ def test_sort_ranges
168
+ assert_equal [RangeExtd::NONE, 2..5, RangeExtd(2..5,9), 3..5, 3...6, 3..6], Rangeary.sort_ranges(RangeExtd(2..5,9), 2..5,3..6,3...6,3..5,RangeExtd::NONE)
169
+ end # def test_sort_ranges
170
+
171
+ def test_new
172
+ assert_equal [2..5, 8..8], Rangeary.new(RangeExtd(8..8), 2..5).to_a
173
+ assert_equal [2..5, 8..8], Rangeary(RangeExtd(8..8), 2..5).to_a
174
+ rs = Rangeary.new([3..5, -6..-1, -4..-3, 2..4, 8..8])
175
+ assert_equal [-6..-1, 2..5, 8..8], rs.to_a
176
+
177
+ assert_raises(NoMethodError){ Rangeary.new(3..5).reverse } # => undefined method `reverse' for <Rangeary:[3..5]>:Rangeary
178
+ assert_raises(RuntimeError){ Rangeary.new(3..5).reverse! } # => can't modify frozen Rangeary
179
+ assert_raises(ArgumentError){ Rangeary.new(3..5, nil..nil) } # => invalid parameter for RangeExtd, hence for Rangeary (nil..nil).
180
+ assert_raises(ArgumentError){ Rangeary.new(3..5, 3..1) } # => invalid parameter
181
+ assert_raises(ArgumentError){ Rangeary.new(3..5, 4...4) } # => invalid parameter
182
+ end # def test_new
183
+
184
+ def test_new_infinity
185
+ #assert_equal [RangeExtd::NONE], Rangeary.new(RangeExtd::NONE).to_a
186
+ assert_equal [-Float::INFINITY..4], Rangeary(-Float::INFINITY..4).to_a
187
+ assert_equal [-Float::INFINITY...4], Rangeary(-Float::INFINITY...4).to_a
188
+ r1 = RangeExtd(-Float::INFINITY...6)
189
+ r2 = RangeExtd(2,Float::INFINITY,9)
190
+ r3 = RangeExtd(18,Float::INFINITY,9)
191
+ assert_equal [RangeExtd::ALL], Rangeary(r1,r2).to_a
192
+ assert ! Rangeary(r1,r2).to_a[0].is_all?
193
+ assert_equal [-Float::INFINITY...8, RangeExtd(8..10,9), r3], Rangeary(r1,5...8,RangeExtd(8..9,9),9..10,r3).to_a
194
+ end # def test_new_infinity
195
+
196
+ def test_new_none # Essentially, the tests of compact()
197
+ ra = Rangeary(RangeExtd::NONE, RangeExtd::NONE, RangeExtd::NONE)
198
+ assert_equal 1, ra.size
199
+ assert_equal RangeExtd::NONE, ra[0]
200
+ assert ra[0].is_none?
201
+ re = RangeExtd(0,0,9,9)
202
+ ra = Rangeary(RangeExtd::NONE, re)
203
+ assert_equal 1, ra.size
204
+ assert_equal re, ra[0]
205
+ rs = RangeExtd(?a,?a,9,9)
206
+ ra = Rangeary(RangeExtd::NONE, rs)
207
+ assert_equal [rs], ra.to_a
208
+ ra = Rangeary(RangeExtd::NONE, re, 1..8)
209
+ assert_equal [1..8], ra # Comparable with an Array of Range(Extd)
210
+ end
211
+
212
+ def test_begin_end
213
+ ra = Rangeary(-6..-1, 2..5, 8..8)
214
+ assert_equal(-6, ra.begin)
215
+ assert_equal 8, ra.end
216
+ ra = Rangeary(RangeExtd(-6..-1,9), 2..5, 7...8)
217
+ assert_equal(-6, ra.begin_element)
218
+ assert_equal 8, ra.end_element
219
+ ra = Rangeary(-6.3..-1, 2..5, 8..8)
220
+ assert_equal(-6.3, ra.begin)
221
+ ra = Rangeary(RangeExtd::NONE)
222
+ assert_equal nil, ra.begin
223
+ assert_equal nil, ra.end
224
+ ra = Rangeary(RangeExtd::ALL)
225
+ assert_equal RangeExtd::Infinity::NEGATIVE, ra.begin
226
+ assert_equal RangeExtd::Infinity::POSITIVE, ra.end
227
+ end
228
+
229
+ def test_first_last_element
230
+ # First/Last element
231
+ rs = Rangeary.new(-6..-5, 2..5, 8..8)
232
+ assert_equal(-6, rs.first_element)
233
+ assert_equal([-6,-5, 2], rs.first_element(3))
234
+ assert_equal [ 4, 5, 8], rs.last_element(3)
235
+ end # def test_first_last_element
236
+
237
+
238
+ def test_disjunction
239
+ # Plus
240
+ rs = Rangeary.new([3..5, -6..-1, -4..-3, 2..4, 8..8])
241
+ assert_equal [-6..-1, 2..5, 8..8], (rs+rs).to_a
242
+ assert_equal rs, rs+rs
243
+ assert_equal [-6..-1, 2..5, 8..9], (rs+(8..9)).to_a
244
+ assert (rs != (rs+(8..9)))
245
+ end # def test_disjunction
246
+
247
+ def test_minus
248
+ t = true
249
+ # Minus
250
+ rs = Rangeary.new(-6..-1, 2..5, 8..9)
251
+ assert_equal rs, rs-( 89..95)
252
+ assert_equal [-6..-1, 2...4, 8..9], (rs-(4..6)).to_a
253
+ #assert_equal [-6..-1, 2..3, 8..9], (rs-(4..6)).to_a # <= Rangeary.subtractRange()
254
+ assert_equal [-6...-2,RangeExtd(2..5,t), 8..9], (rs-(-2..2)).to_a
255
+ #assert_equal [-6..-3, 3..5, 8..9], (rs-(-2..2)).to_a # <= Rangeary.subtractRange()
256
+ assert_equal [RangeExtd(-5..-1,t), 2..5, 8..9], (rs-(-9..-5)).to_a
257
+ #assert_equal [-4..-1, 2..5, 8..9], (rs-(-9..-5)).to_a
258
+ assert_equal [2..5, 8..9], (rs-(-9..0)).to_a
259
+
260
+ # assert_equal Rangeary(-Float::INFINITY...-9, RangeExtd(3..Float::INFINITY,t)), Rangeary(-9..3).negation
261
+ # assert_equal Rangeary(RangeExtd(3..5,t), 8..9), Rangeary.conjunction(Rangeary(-6..-1, 2..5, 8..9), Rangeary(-9..3).negation) # This fails in def self.conjunction_orig(r1, r2)
262
+
263
+ assert_equal [RangeExtd(3..5,t), 8..9], (rs-(-9..3)).to_a
264
+ #assert_equal [4..5, 8..9], (rs-(-9..3)).to_a
265
+ assert_equal [-6..-1, 2..5, 8...9], (rs-(9..11)).to_a
266
+ #assert_equal [-6..-1, 2..5, 8..8], (rs-(9..11)).to_a
267
+ assert_equal [-6..-1, 2..5], (rs-(8..11)).to_a
268
+ assert_equal [-6..-1, 2..5], (rs-(7..11)).to_a
269
+ assert_equal [-6..-1, 2...5], (rs-(5..11)).to_a
270
+ #assert_equal [-6..-1, 2..4], (rs-(5..11)).to_a
271
+ assert_equal [-6..-1, 2...4], (rs-(4..11)).to_a
272
+ #assert_equal [-6..-1, 2..3], (rs-(4..11)).to_a
273
+ assert_equal rs, rs-(-99..-95)
274
+ end # def test_minus
275
+
276
+
277
+ def test_brackets
278
+ # Square Brackets
279
+ ar = [-6..-1, 2..5, 8..9]
280
+ rs = Rangeary.new(*ar)
281
+ assert_equal ar[-1], rs[-1]
282
+ assert_equal ar[1..2], rs[1..2]
283
+ assert_equal ar[0,2], rs[0,2]
284
+ end
285
+
286
+
287
+ def test_conjunctionRangeExtd
288
+ t = true
289
+ r38 = RangeExtd(3..8, :exclude_begin => 1)
290
+ r38e = RangeExtd(3...8, :exclude_begin => 1)
291
+ r39 = RangeExtd(3..9, :exclude_begin => 1)
292
+ r39e = RangeExtd(3...9, :exclude_begin => 1)
293
+ r58 = RangeExtd(5..8, :exclude_begin => 1)
294
+ r58e = RangeExtd(5...8, :exclude_begin => 1)
295
+ r59 = RangeExtd(5..9, :exclude_begin => 1)
296
+ r59e = RangeExtd(5...9, :exclude_begin => 1)
297
+
298
+ # Lower exclusive
299
+ assert_equal nil, conjRE(1..3, 5..9).begin
300
+ assert_equal nil, conjRE(1...5, 5..9).begin
301
+ assert_equal nil, conjRE(1..5, r59).begin
302
+ assert_equal nil, conjRE(1...5, r59).begin
303
+ assert_equal (5..5), conjRE(1..5, 5..9)
304
+
305
+ # Lower overlap
306
+ assert_equal (5..8), conjRE(3..8, 5..9)
307
+ assert_equal (5...8),conjRE(3...8, 5..9)
308
+ assert_equal r58, conjRE(3..8, r59)
309
+ assert_equal r58e, conjRE(3...8, r59)
310
+
311
+ assert_equal (5..9), conjRE(3..9, 5..9)
312
+ assert_equal (5...9),conjRE(3...9, 5..9)
313
+ assert_equal (5...9),conjRE(3..9, 5...9)
314
+ assert_equal (5...9),conjRE(3...9, 5...9)
315
+
316
+ # Inclusive
317
+ assert_equal (3..8), conjRE(3..8, 2..9)
318
+ assert_equal (3...8),conjRE(3...8, 2..9)
319
+ assert_equal r38, conjRE(r38, 2..9)
320
+ assert_equal r38e, conjRE(r38e, 2..9)
321
+
322
+ # Identical but boundaries
323
+ assert_equal (3..8), conjRE(3..8, 3..8)
324
+ assert_equal (3...8),conjRE(3...8, 3..8)
325
+ assert_equal r38, conjRE(r38, 3..8)
326
+ assert_equal r38e, conjRE(r38e, 3..8)
327
+ assert_equal (3...8),conjRE(3..8, 3...8)
328
+ assert_equal (3...8),conjRE(3...8, 3...8)
329
+ assert_equal r38e, conjRE(r38, 3...8)
330
+ assert_equal r38e, conjRE(r38e, 3...8)
331
+ assert_equal r38, conjRE(3..8, r38)
332
+ assert_equal r38e, conjRE(3...8, r38)
333
+ assert_equal r38, conjRE(r38, r38)
334
+ assert_equal r38e, conjRE(r38e, r38)
335
+ assert_equal r38e, conjRE(3..8, r38e)
336
+ assert_equal r38e, conjRE(3...8, r38e)
337
+ assert_equal r38e, conjRE(r38, r38e)
338
+ assert_equal r38e, conjRE(r38e, r38e)
339
+
340
+ # Higher overlap
341
+ assert_equal (5..8), conjRE(5..9, 3..8)
342
+ assert_equal (5...8),conjRE(5..9, 3...8)
343
+ assert_equal r58, conjRE(r59, r38)
344
+ assert_equal r58e, conjRE(r59e, r38e)
345
+ assert_equal r58, conjRE(r59e, r38)
346
+
347
+ assert_equal (3..8), conjRE(3..9, 3..8)
348
+ assert_equal (3..8), conjRE(3...9, 3..8)
349
+ assert_equal (3...8),conjRE(3..9, 3...8)
350
+ assert_equal (3...8),conjRE(3...9, 3...8)
351
+ assert_equal r38, conjRE(r39, 3..8)
352
+ assert_equal r38, conjRE(r39e, 3..8)
353
+ assert_equal r38e, conjRE(r39, 3...8)
354
+ assert_equal r38e, conjRE(r39e, 3...8)
355
+ assert_equal r38, conjRE(r38, 3..9)
356
+ assert_equal r38e, conjRE(r38e, 3..9)
357
+ assert_equal r38, conjRE(r38, 3...9)
358
+ assert_equal r38e, conjRE(r38e, 3...9)
359
+
360
+ # Higher exclusive (almost)
361
+ assert_equal (5..5), conjRE(5..9, 1..5)
362
+ assert_equal nil, conjRE(5..9, 1...5).begin
363
+ assert_equal nil, conjRE(r59, 1..5).begin
364
+ assert_equal nil, conjRE(r59, 1...5).begin
365
+
366
+ # Higher exclusive (almost)
367
+ assert_equal nil, conjRE(5..9, 1..3).begin
368
+ assert_equal nil, conjRE(r59, 1...4).begin
369
+
370
+ # String
371
+ assert_equal (?d..?f), conjRE(?a..?f, ?d..?z)
372
+
373
+ # Empty
374
+ assert_equal RangeExtd::NONE, conjRE(RangeExtd(1,1,t,t), 0..8)
375
+ assert_equal RangeExtd::NONE, conjRE(0..8, RangeExtd(1,1,t,t))
376
+ assert_equal RangeExtd::NONE, conjRE(RangeExtd::NONE, ?a..?d)
377
+ assert_equal RangeExtd::NONE, conjRE(?a..?d, RangeExtd::NONE)
378
+
379
+ # Invalid
380
+ assert_raises(ArgumentError){ conjRE(true..true, true..true) }
381
+ assert_raises(TypeError){ conjRE(1..5, ?a..?d) }
382
+
383
+ assert_equal RangeExtd(24...25,t), conjRE(RangeExtd(24..26,t), 24...25)
384
+ end
385
+
386
+
387
+ def test_conjunctionRangeary
388
+ inf = Float::INFINITY
389
+
390
+ r21e = RangeExtd(21...22, :exclude_begin => 1)
391
+ r24e25e = RangeExtd(24...25, :exclude_begin => 1)
392
+ r24e_26 = RangeExtd(24..26, :exclude_begin => 1)
393
+ r1 = Rangeary.new( 3..8, 12...15,17...19, 20..22, r24e_26,28..32, 33..inf)
394
+ r2 = Rangeary.new(-inf..1, 4..6,8..12, 14..18, 19...20,r21e, 24...25)
395
+ rc12 = Rangeary.conjunction(r1, r2)
396
+ rc12tobe = Rangeary( 4..6,8..8, 12..12,14...15,17..18,r21e,r24e25e)
397
+ assert_equal (?d..?f), conjRE(?a..?f, ?d..?z)
398
+ assert_equal rc12tobe, rc12
399
+ rcab = Rangeary(?x..?z).conjunction(?a..?c)
400
+ assert_equal RangeExtd::NONE, rcab[0]
401
+ assert_equal 1, rcab.size
402
+ assert rcab.empty_element?
403
+ assert rcab.null_element?
404
+ assert rcab.null?
405
+ end # def test_conjunctionRangeary
406
+
407
+
408
+ def test_combinations
409
+ t = true
410
+ inf = Float::INFINITY
411
+
412
+ assert_equal Rangeary(12..12), Rangeary.conjunction(8..12, 12..15)
413
+ assert_equal Rangeary(-inf...12, RangeExtd(12,inf,t)), Rangeary.conjunction(8..12, 12..15).negation
414
+ assert_equal Rangeary(8..15), Rangeary.disjunction(8..12, 12..15)
415
+ assert_equal Rangeary(8...12, RangeExtd(12,15,t)), Rangeary.disjunction(8..12, 12..15).conjunction( Rangeary.conjunction(8..12, 12..15).negation )
416
+ assert_equal Rangeary(8...12, RangeExtd(12,15,t)), Rangeary.exclusive_disjunction(8..12, 12..15)
417
+ assert_equal Rangeary(8...12, RangeExtd(12..15,t)), Rangeary(8..12).xor(12..15)
418
+
419
+ assert_equal Rangeary(12..12, 14..15), Rangeary.conjunction(Rangeary(8..12, 14..15), 12..15)
420
+ assert_equal Rangeary(-inf...12, RangeExtd(12...14,t), RangeExtd(15,inf,t)), Rangeary(12..12, 14..15).negation
421
+ assert_equal Rangeary(-inf...12, RangeExtd(12...14,t), RangeExtd(15,inf,t)), Rangeary.conjunction(Rangeary(8..12, 14..15), 12..15).negation
422
+ assert_equal Rangeary(8...12, RangeExtd(12...14,t)), Rangeary(8..12,14..15).xor(12..15)
423
+ assert_equal Rangeary(RangeExtd::NONE), Rangeary.conjunction(RangeExtd(24..26,t), 24...25)
424
+ end
425
+
426
+
427
+ def test_xor
428
+ t = true
429
+ inf = Float::INFINITY
430
+ r21e22e = RangeExtd(21...22, :exclude_begin => 1)
431
+ #r24e25e = RangeExtd(24...25, :exclude_begin => 1)
432
+ r24e_26 = RangeExtd(24..26, :exclude_begin => 1)
433
+
434
+ r1 = Rangeary.new( 3..8, 12...15,17...19, 20..22, r24e_26,28..32, 33..inf)
435
+ r2 = Rangeary.new(-inf..1, 4..6,8..12, 14..18, 19...20,r21e22e,24...25)
436
+ rc12 = Rangeary.exclusive_disjunction(r1, r2)
437
+ rc12tobe = Rangeary(-inf..1, 3...4, RangeExtd(6...8,t), RangeExtd(8...12,t), RangeExtd(12...14,t), RangeExtd(15...17), RangeExtd(18..22,t), 24..26, 28..32, 33..inf)
438
+ assert_equal rc12tobe, rc12
439
+ # Actual: <Rangeary:[-Infinity..1, 3...4, 6<...8, 8<...12, 12<...14, 15...17, 18<..22, 24..26, 28..32, 33..Infinity]>
440
+
441
+ end # def test_xor
442
+
443
+
444
+ def test_negation
445
+ inf = Float::INFINITY
446
+ assert_equal Rangeary(-inf...3,RangeExtd(8..inf,1)), Rangeary(3..8).negation
447
+ assert_equal Rangeary(-inf...12, RangeExtd(12...14,T), RangeExtd(15,inf,T)), ~Rangeary(12..12, 14..15)
448
+
449
+ end # def test_negation
450
+
451
+
452
+ def test_posinega
453
+ inf = RangeExtd::Infinity::POSITIVE
454
+ assert_equal Rangeary(?a...?d, ?x..?z), ~Rangeary(?d...?x, :negative => ?a, :positive => ?z)
455
+ assert_equal Rangeary(?a...?d, ?x..inf), ~Rangeary(?d...?x, :negative => ?a)
456
+ assert_raises(ArgumentError){ Rangeary(?a..?z, :negative => -Float::INFINITY) }
457
+ assert_raises(ArgumentError){ Rangeary(1...8.5, :negative => ?a) }
458
+ _ = Rangeary(1...8.5, :positive => inf) # => No error.
459
+
460
+ ra = Rangeary(?d...?f, :negative => ?a)
461
+ rb = Rangeary(?g..?h, ?j...?m)
462
+ rc = ra + rb
463
+ rd = rb | ra
464
+ re = Rangeary(?e...?k, :positive => ?z)
465
+ rf = rd & re
466
+ assert_equal ?a, ra.infinities[:negative]
467
+ assert_equal inf, ra.infinities[:positive]
468
+ assert_equal ?a, rc.infinities[:negative]
469
+ assert_equal inf, rc.infinities[:positive]
470
+ assert_equal ?a, rd.infinities[:negative]
471
+ assert_equal inf, rd.infinities[:positive]
472
+ assert_equal ?a, rf.infinities[:negative]
473
+ assert_equal ?z, rf.infinities[:positive]
474
+ end # def test_posinega
475
+
476
+
477
+ def test_cover
478
+ r1 = Rangeary(?a..?g, ?m..?z)
479
+ assert r1.cover?('pp')
480
+ assert !(r1 === 'pp')
481
+ assert !(r1.include_element?('pp'))
482
+ assert !(r1.member_element?('pp'))
483
+
484
+ assert ! Rangeary(?a..?g, ?m..?o, ?r..?z).cover?(?h)
485
+ assert !(r1 === RangeExtd(?a..?g))
486
+ end
487
+
488
+ def test_each
489
+ # Each
490
+ rs = Rangeary.new(-6..-1, 2..5, 8..9)
491
+ rs.each do |i|
492
+ assert_equal (-6..-1), i
493
+ break
494
+ end
495
+ end # def test_each
496
+
497
+ def test_each_element
498
+ # Each_Element
499
+ rs = Rangeary.new(-6..-1, 2..5, 8..9)
500
+ rs.each_element do |i|
501
+ assert_equal(-6, i)
502
+ break
503
+ end
504
+ end # def test_each_element
505
+
506
+
507
+ def test_empty_element
508
+ assert !Rangeary(5..8).empty_element?
509
+ assert Rangeary(RangeExtd::NONE, RangeExtd(3...3,T)).empty_element?
510
+ end # def test_empty_element
511
+
512
+
513
+ def test_flatten
514
+ assert [6,7,11], Rangeary(RangeExtd(10...12,T), RangeExtd(5...8,T)).flatten
515
+ assert_raises(TypeError){ Rangeary( 10...12, RangeExtd(5.0...8,T)).flatten }
516
+ end # def test_flatten
517
+
518
+
519
+ def test_iteratable
520
+ assert Rangeary(?d..?n, RangeExtd(?a..?c,T), ?p..?z).iteratable?
521
+ assert Rangeary(5...8, RangeExtd(1..3,T), 8...15).iteratable?
522
+ assert !Rangeary(RangeExtd(1..3,T), 6.0...15).iteratable?
523
+ end # def test_iteratable
524
+
525
+
526
+ def test_size_element
527
+ assert_equal 2, Rangeary(1...4, RangeExtd(6...9,T)).size
528
+ assert_equal 5, Rangeary(1...4, RangeExtd(6...9,T)).size_element
529
+ end # def test_size_element
530
+
531
+
532
+ def test_in_document
533
+ assert_equal 33, Rangeary(2...4, 5..6, 8..9).flatten.reduce(:+) # => 33
534
+
535
+ r1 = RangeExtd(?a...?d, true) # => a<...d
536
+ ra = Rangeary(?g..?h, r1) # => [a<...d, g..h]
537
+ assert_equal r1, ra[0]
538
+ assert_equal ?g..?h, ra[1]
539
+ assert_equal 2, ra.size
540
+ assert_equal ?a, ra.begin
541
+ assert_equal RangeExtd::NONE, Rangeary(RangeExtd::NONE)[0]
542
+ assert_equal RangeExtd::NONE, Rangeary(RangeExtd::NONE, RangeExtd::NONE)[0]
543
+ assert_equal 1, Rangeary.new(RangeExtd::NONE, RangeExtd::NONE).size
544
+ assert Rangeary(RangeExtd::NONE, RangeExtd::NONE).empty_element?
545
+ assert_equal [1...7], Rangeary(RangeExtd::NONE, 1..5, 3...7) # => [1...7]
546
+ assert_raises(ArgumentError){ Rangeary(true..true) }
547
+
548
+ #assert_equal %w(b c g h), ra.to_a
549
+ assert_equal [RangeExtd(?a...?d,T), ?g..?h], ra.to_a
550
+ assert !ra.cover?("a")
551
+ assert ra.cover?("b") # => true
552
+ assert_equal "h", ra.end
553
+ s=''
554
+ ret = ra.each do |i|
555
+ s+=i.begin
556
+ end # => self ( "ag" => STDOUT )
557
+ assert_equal s, "ag"
558
+ assert_equal ra, ret
559
+ s=''
560
+ ret = ra.each_element do |i|
561
+ s+=i
562
+ end # => self ( "bcgh" => STDOUT )
563
+ assert_equal s, "bcgh"
564
+ assert_equal ra, ret
565
+
566
+ rb = Rangeary(6...9, 2..4) # => [2..4, 6...9]
567
+ assert_equal Rangeary(6...9, 2..4), rb
568
+ assert_equal [2..4, 6...9], rb.to_a
569
+ assert_equal [2..4, 6...9], rb
570
+ assert_equal rb, [2..4, 6...9]
571
+ assert_equal [2...9], rb + Rangeary(3..7) # => [2...9]
572
+ assert_equal [2...3, RangeExtd(7,'<...',9)], rb - Rangeary(3..7)
573
+ assert_equal [4..4, 8...9], rb * Rangeary(4..5, 8..10)
574
+ assert_equal [-Float::INFINITY...2, RangeExtd(4,'<...',6), 9..Float::INFINITY], rb.negation
575
+
576
+ assert !Rangeary(RangeExtd::NONE).empty? # => false
577
+ assert Rangeary(RangeExtd::NONE).empty_element? # => true
578
+
579
+ assert !(Rangeary(r1) === r1)
580
+
581
+ assert [2..4, 6..8] == Rangeary(2..4, 6..8)
582
+ assert [2..4, 6..8] == Rangeary(6..8, 2..4)
583
+ assert !([6..8, 2..4] == Rangeary(6..8, 2..4))
584
+
585
+ assert_equal 2, Rangeary(1..3, 5..8).size # => 2
586
+ assert_equal 7, Rangeary(1..3, 5..8).size_element # => 7
587
+ end # def test_in_document
588
+
589
+
590
+ ### All false, well, and they should be.
591
+ # def test_equal
592
+ # # Plus
593
+ # assert_equal RangeExtd(1..3), RangeExtd(1...4)
594
+ # assert_equal Rangeary(1..3), Rangeary(1...4)
595
+ # end
596
+
597
+ end # class TestUnitFoo < MiniTest::Unit::TestCase
598
+
599
+ #end # if $0 == __FILE__
600
+
601
+
metadata ADDED
@@ -0,0 +1,59 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rangeary
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Masa Sakano
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-05-09 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Rangeary is a sub-class of Array and represents any 1-dimensional multiple-range. For
14
+ example, (x<3 and 7<x<=9). All the standard logical operations, such as negation
15
+ and conjunction, are supported and can be used with conventional Ruby-style operators. Each
16
+ range is represented as RangeExtd class (Extended Range), which is a sub-class of
17
+ Range and supports exclude-begin and open-ended (to Infinity) ranges, and is downloadable
18
+ from https://rubygems.org/gems/range_extd
19
+ email:
20
+ executables: []
21
+ extensions: []
22
+ extra_rdoc_files:
23
+ - README.ja.rdoc
24
+ files:
25
+ - News
26
+ - ChangeLog
27
+ - README.ja.rdoc
28
+ - Rakefile
29
+ - rangeary.gemspec
30
+ - lib/rangeary/rangeary.rb
31
+ - test/test_rangeary.rb
32
+ homepage:
33
+ licenses:
34
+ - MIT
35
+ metadata: {}
36
+ post_install_message:
37
+ rdoc_options:
38
+ - --charset=UTF-8
39
+ require_paths:
40
+ - lib
41
+ required_ruby_version: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '2.0'
46
+ required_rubygems_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - '>='
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
51
+ requirements: []
52
+ rubyforge_project:
53
+ rubygems_version: 2.0.3
54
+ signing_key:
55
+ specification_version: 4
56
+ summary: Rangeary - class to represent any 1-dimensional multiple-range
57
+ test_files:
58
+ - test/test_rangeary.rb
59
+ has_rdoc: