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.
- checksums.yaml +7 -0
- data/ChangeLog +5 -0
- data/News +3 -0
- data/README.ja.rdoc +456 -0
- data/Rakefile +9 -0
- data/lib/rangeary/rangeary.rb +1176 -0
- data/rangeary.gemspec +47 -0
- data/test/test_rangeary.rb +601 -0
- metadata +59 -0
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:
|