rbtree 0.2.0 → 0.4.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +1 -1
- data/MANIFEST +0 -1
- data/README +52 -57
- data/dict.c +364 -83
- data/dict.h +30 -6
- data/extconf.rb +12 -29
- data/rbtree.c +824 -519
- data/test.rb +393 -193
- metadata +52 -45
- data/ChangeLog +0 -425
data/test.rb
CHANGED
@@ -1,29 +1,40 @@
|
|
1
|
-
|
2
|
-
require "
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
class TestCase
|
7
|
-
unless method_defined?(:assert_raise)
|
8
|
-
alias :assert_raise :assert_raises
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
1
|
+
begin
|
2
|
+
require "./rbtree"
|
3
|
+
rescue LoadError
|
4
|
+
require "rubygems"
|
5
|
+
require "rbtree"
|
12
6
|
end
|
7
|
+
require "test/unit.rb"
|
13
8
|
|
14
9
|
class RBTreeTest < Test::Unit::TestCase
|
15
10
|
def setup
|
16
11
|
@rbtree = RBTree[*%w(b B d D a A c C)]
|
17
12
|
end
|
18
13
|
|
14
|
+
def have_enumerator?
|
15
|
+
defined?(Enumerable::Enumerator) or defined?(Enumerator)
|
16
|
+
end
|
17
|
+
|
19
18
|
def test_new
|
20
19
|
assert_nothing_raised {
|
21
20
|
RBTree.new
|
22
21
|
RBTree.new("a")
|
23
22
|
RBTree.new { "a" }
|
24
23
|
}
|
25
|
-
|
26
|
-
|
24
|
+
assert_raises(ArgumentError) { RBTree.new("a") {} }
|
25
|
+
assert_raises(ArgumentError) { RBTree.new("a", "a") }
|
26
|
+
|
27
|
+
if RUBY_VERSION >= "1.9.2"
|
28
|
+
assert_nothing_raised {
|
29
|
+
RBTree.new(&lambda {|a, b|})
|
30
|
+
RBTree.new(&lambda {|*a|})
|
31
|
+
RBTree.new(&lambda {|a, *b|})
|
32
|
+
RBTree.new(&lambda {|a, b, *c|})
|
33
|
+
}
|
34
|
+
assert_raises(TypeError) { RBTree.new(&lambda {|a|}) }
|
35
|
+
assert_raises(TypeError) { RBTree.new(&lambda {|a, b, c|}) }
|
36
|
+
assert_raises(TypeError) { RBTree.new(&lambda {|a, b, c, *d|}) }
|
37
|
+
end
|
27
38
|
end
|
28
39
|
|
29
40
|
def test_aref
|
@@ -59,14 +70,29 @@ class RBTreeTest < Test::Unit::TestCase
|
|
59
70
|
@rbtree.readjust {|a,b| b <=> a }
|
60
71
|
assert_equal(nil, RBTree[@rbtree].cmp_proc)
|
61
72
|
|
62
|
-
|
73
|
+
assert_raises(ArgumentError) { RBTree["e"] }
|
63
74
|
|
64
75
|
rbtree = RBTree[Hash[*%w(b B d D a A c C)]]
|
65
76
|
assert_equal(4, rbtree.size)
|
66
|
-
assert_equal("A",
|
67
|
-
assert_equal("B",
|
68
|
-
assert_equal("C",
|
69
|
-
assert_equal("D",
|
77
|
+
assert_equal("A", rbtree["a"])
|
78
|
+
assert_equal("B", rbtree["b"])
|
79
|
+
assert_equal("C", rbtree["c"])
|
80
|
+
assert_equal("D", rbtree["d"])
|
81
|
+
|
82
|
+
rbtree = RBTree[[%w(a A), %w(b B), %w(c C), %w(d D)]];
|
83
|
+
assert_equal(4, rbtree.size)
|
84
|
+
assert_equal("A", rbtree["a"])
|
85
|
+
assert_equal("B", rbtree["b"])
|
86
|
+
assert_equal("C", rbtree["c"])
|
87
|
+
assert_equal("D", rbtree["d"])
|
88
|
+
|
89
|
+
# assert_raises(ArgumentError) { RBTree[["a"]] }
|
90
|
+
|
91
|
+
rbtree = RBTree[[["a"]]]
|
92
|
+
assert_equal(1, rbtree.size)
|
93
|
+
assert_equal(nil, rbtree["a"])
|
94
|
+
|
95
|
+
# assert_raises(ArgumentError) { RBTree[[["a", "A", "b", "B"]]] }
|
70
96
|
end
|
71
97
|
|
72
98
|
def test_clear
|
@@ -83,10 +109,8 @@ class RBTreeTest < Test::Unit::TestCase
|
|
83
109
|
assert_equal(5, @rbtree.size)
|
84
110
|
assert_equal("E", @rbtree["c"])
|
85
111
|
|
86
|
-
|
87
|
-
|
88
|
-
assert_equal(5, @rbtree.size)
|
89
|
-
end
|
112
|
+
assert_raises(ArgumentError) { @rbtree[100] = 100 }
|
113
|
+
assert_equal(5, @rbtree.size)
|
90
114
|
|
91
115
|
|
92
116
|
key = "f"
|
@@ -129,14 +153,13 @@ class RBTreeTest < Test::Unit::TestCase
|
|
129
153
|
end
|
130
154
|
|
131
155
|
def test_default
|
132
|
-
assert_equal(nil, @rbtree.default)
|
133
|
-
|
134
156
|
rbtree = RBTree.new("e")
|
135
157
|
assert_equal("e", rbtree.default)
|
136
158
|
assert_equal("e", rbtree.default("f"))
|
137
|
-
|
159
|
+
assert_raises(ArgumentError) { rbtree.default("e", "f") }
|
138
160
|
|
139
|
-
rbtree = RBTree.new {|
|
161
|
+
rbtree = RBTree.new {|tree, key| @rbtree[key || "c"] }
|
162
|
+
assert_equal(nil, rbtree.default)
|
140
163
|
assert_equal("C", rbtree.default(nil))
|
141
164
|
assert_equal("B", rbtree.default("b"))
|
142
165
|
end
|
@@ -145,14 +168,51 @@ class RBTreeTest < Test::Unit::TestCase
|
|
145
168
|
rbtree = RBTree.new { "e" }
|
146
169
|
rbtree.default = "f"
|
147
170
|
assert_equal("f", rbtree.default)
|
171
|
+
assert_equal(nil, rbtree.default_proc)
|
172
|
+
|
173
|
+
rbtree = RBTree.new { "e" }
|
174
|
+
rbtree.default = nil
|
175
|
+
assert_equal(nil, rbtree.default)
|
176
|
+
assert_equal(nil, rbtree.default_proc)
|
148
177
|
end
|
149
178
|
|
150
179
|
def test_default_proc
|
151
180
|
rbtree = RBTree.new("e")
|
152
181
|
assert_equal(nil, rbtree.default_proc)
|
153
182
|
|
154
|
-
rbtree = RBTree.new { "
|
155
|
-
assert_equal("
|
183
|
+
rbtree = RBTree.new { "f" }
|
184
|
+
assert_equal("f", rbtree.default_proc.call)
|
185
|
+
end
|
186
|
+
|
187
|
+
def test_set_default_proc
|
188
|
+
rbtree = RBTree.new("e")
|
189
|
+
rbtree.default_proc = Proc.new { "f" }
|
190
|
+
assert_equal(nil, rbtree.default)
|
191
|
+
assert_equal("f", rbtree.default_proc.call)
|
192
|
+
|
193
|
+
rbtree = RBTree.new("e")
|
194
|
+
rbtree.default_proc = nil
|
195
|
+
assert_equal(nil, rbtree.default)
|
196
|
+
assert_equal(nil, rbtree.default_proc)
|
197
|
+
|
198
|
+
if Symbol.method_defined?(:to_proc)
|
199
|
+
@rbtree.default_proc = :upper_bound
|
200
|
+
assert_equal(%w(d D), @rbtree["e"])
|
201
|
+
end
|
202
|
+
|
203
|
+
assert_raises(TypeError) { rbtree.default_proc = "f" }
|
204
|
+
|
205
|
+
if RUBY_VERSION >= "1.9.2"
|
206
|
+
assert_nothing_raised {
|
207
|
+
@rbtree.default_proc = lambda {|a, b|}
|
208
|
+
@rbtree.default_proc = lambda {|*a|}
|
209
|
+
@rbtree.default_proc = lambda {|a, *b|}
|
210
|
+
@rbtree.default_proc = lambda {|a, b, *c|}
|
211
|
+
}
|
212
|
+
assert_raises(TypeError) { @rbtree.default_proc = lambda {|a|} }
|
213
|
+
assert_raises(TypeError) { @rbtree.default_proc = lambda {|a, b, c|} }
|
214
|
+
assert_raises(TypeError) { @rbtree.default_proc = lambda {|a, b, c, *d|} }
|
215
|
+
end
|
156
216
|
end
|
157
217
|
|
158
218
|
def test_equal
|
@@ -182,10 +242,18 @@ class RBTreeTest < Test::Unit::TestCase
|
|
182
242
|
|
183
243
|
a = RBTree.new
|
184
244
|
b = RBTree.new
|
185
|
-
a.readjust {|
|
245
|
+
a.readjust {|x, y| x <=> y }
|
186
246
|
assert_not_equal(a, b)
|
187
247
|
b.readjust(a.cmp_proc)
|
188
248
|
assert_equal(a, b)
|
249
|
+
|
250
|
+
if RUBY_VERSION >= "1.8.7"
|
251
|
+
a = RBTree.new
|
252
|
+
a[1] = a
|
253
|
+
b = RBTree.new
|
254
|
+
b[1] = b
|
255
|
+
assert_equal(a, b)
|
256
|
+
end
|
189
257
|
end
|
190
258
|
|
191
259
|
def test_fetch
|
@@ -194,19 +262,19 @@ class RBTreeTest < Test::Unit::TestCase
|
|
194
262
|
assert_equal("C", @rbtree.fetch("c"))
|
195
263
|
assert_equal("D", @rbtree.fetch("d"))
|
196
264
|
|
197
|
-
|
265
|
+
assert_raises(IndexError) { @rbtree.fetch("e") }
|
198
266
|
|
199
267
|
assert_equal("E", @rbtree.fetch("e", "E"))
|
200
268
|
assert_equal("E", @rbtree.fetch("e") { "E" })
|
201
|
-
assert_equal("E", @rbtree.fetch("e", "F") { "E" })
|
269
|
+
# assert_equal("E", @rbtree.fetch("e", "F") { "E" })
|
202
270
|
|
203
|
-
|
204
|
-
|
271
|
+
assert_raises(ArgumentError) { @rbtree.fetch }
|
272
|
+
assert_raises(ArgumentError) { @rbtree.fetch("e", "E", "E") }
|
205
273
|
end
|
206
274
|
|
207
|
-
def
|
208
|
-
assert_equal("a", @rbtree.
|
209
|
-
assert_equal(nil, @rbtree.
|
275
|
+
def test_key
|
276
|
+
assert_equal("a", @rbtree.key("A"))
|
277
|
+
assert_equal(nil, @rbtree.key("E"))
|
210
278
|
end
|
211
279
|
|
212
280
|
def test_empty_p
|
@@ -216,89 +284,84 @@ class RBTreeTest < Test::Unit::TestCase
|
|
216
284
|
end
|
217
285
|
|
218
286
|
def test_each
|
219
|
-
|
220
|
-
@rbtree.each {|key, val|
|
221
|
-
assert_equal(%w(a A b B c C d D),
|
287
|
+
result = []
|
288
|
+
@rbtree.each {|key, val| result << key << val }
|
289
|
+
assert_equal(%w(a A b B c C d D), result)
|
222
290
|
|
223
|
-
|
291
|
+
assert_raises(TypeError) {
|
224
292
|
@rbtree.each { @rbtree["e"] = "E" }
|
225
293
|
}
|
226
294
|
assert_equal(4, @rbtree.size)
|
227
295
|
|
228
296
|
@rbtree.each {
|
229
297
|
@rbtree.each {}
|
230
|
-
|
231
|
-
@rbtree["e"] = "E"
|
232
|
-
}
|
233
|
-
break
|
234
|
-
}
|
235
|
-
assert_equal(4, @rbtree.size)
|
236
|
-
end
|
237
|
-
|
238
|
-
def test_each_pair
|
239
|
-
ret = []
|
240
|
-
@rbtree.each_pair {|key, val| ret << key << val }
|
241
|
-
assert_equal(%w(a A b B c C d D), ret)
|
242
|
-
|
243
|
-
assert_raise(TypeError) {
|
244
|
-
@rbtree.each_pair { @rbtree["e"] = "E" }
|
245
|
-
}
|
246
|
-
assert_equal(4, @rbtree.size)
|
247
|
-
|
248
|
-
@rbtree.each_pair {
|
249
|
-
@rbtree.each_pair {}
|
250
|
-
assert_raise(TypeError) {
|
298
|
+
assert_raises(TypeError) {
|
251
299
|
@rbtree["e"] = "E"
|
252
300
|
}
|
253
301
|
break
|
254
302
|
}
|
255
303
|
assert_equal(4, @rbtree.size)
|
304
|
+
|
305
|
+
if have_enumerator?
|
306
|
+
enumerator = @rbtree.each
|
307
|
+
assert_equal(%w(a A b B c C d D), enumerator.to_a.flatten)
|
308
|
+
end
|
256
309
|
end
|
257
310
|
|
258
311
|
def test_each_key
|
259
|
-
|
260
|
-
@rbtree.each_key {|
|
261
|
-
assert_equal(%w(a b c d),
|
312
|
+
result = []
|
313
|
+
@rbtree.each_key {|key| result.push(key) }
|
314
|
+
assert_equal(%w(a b c d), result)
|
262
315
|
|
263
|
-
|
316
|
+
assert_raises(TypeError) {
|
264
317
|
@rbtree.each_key { @rbtree["e"] = "E" }
|
265
318
|
}
|
266
319
|
assert_equal(4, @rbtree.size)
|
267
320
|
|
268
321
|
@rbtree.each_key {
|
269
322
|
@rbtree.each_key {}
|
270
|
-
|
323
|
+
assert_raises(TypeError) {
|
271
324
|
@rbtree["e"] = "E"
|
272
325
|
}
|
273
326
|
break
|
274
327
|
}
|
275
328
|
assert_equal(4, @rbtree.size)
|
329
|
+
|
330
|
+
if have_enumerator?
|
331
|
+
enumerator = @rbtree.each_key
|
332
|
+
assert_equal(%w(a b c d), enumerator.to_a.flatten)
|
333
|
+
end
|
276
334
|
end
|
277
335
|
|
278
336
|
def test_each_value
|
279
|
-
|
280
|
-
@rbtree.each_value {|
|
281
|
-
assert_equal(%w(A B C D),
|
337
|
+
result = []
|
338
|
+
@rbtree.each_value {|val| result.push(val) }
|
339
|
+
assert_equal(%w(A B C D), result)
|
282
340
|
|
283
|
-
|
341
|
+
assert_raises(TypeError) {
|
284
342
|
@rbtree.each_value { @rbtree["e"] = "E" }
|
285
343
|
}
|
286
344
|
assert_equal(4, @rbtree.size)
|
287
345
|
|
288
346
|
@rbtree.each_value {
|
289
347
|
@rbtree.each_value {}
|
290
|
-
|
348
|
+
assert_raises(TypeError) {
|
291
349
|
@rbtree["e"] = "E"
|
292
350
|
}
|
293
351
|
break
|
294
352
|
}
|
295
353
|
assert_equal(4, @rbtree.size)
|
354
|
+
|
355
|
+
if have_enumerator?
|
356
|
+
enumerator = @rbtree.each_value
|
357
|
+
assert_equal(%w(A B C D), enumerator.to_a.flatten)
|
358
|
+
end
|
296
359
|
end
|
297
360
|
|
298
361
|
def test_shift
|
299
|
-
|
362
|
+
result = @rbtree.shift
|
300
363
|
assert_equal(3, @rbtree.size)
|
301
|
-
assert_equal(
|
364
|
+
assert_equal(%w(a A), result)
|
302
365
|
assert_equal(nil, @rbtree["a"])
|
303
366
|
|
304
367
|
3.times { @rbtree.shift }
|
@@ -312,9 +375,9 @@ class RBTreeTest < Test::Unit::TestCase
|
|
312
375
|
end
|
313
376
|
|
314
377
|
def test_pop
|
315
|
-
|
378
|
+
result = @rbtree.pop
|
316
379
|
assert_equal(3, @rbtree.size)
|
317
|
-
assert_equal(
|
380
|
+
assert_equal(%w(d D), result)
|
318
381
|
assert_equal(nil, @rbtree["d"])
|
319
382
|
|
320
383
|
3.times { @rbtree.pop }
|
@@ -328,8 +391,8 @@ class RBTreeTest < Test::Unit::TestCase
|
|
328
391
|
end
|
329
392
|
|
330
393
|
def test_delete
|
331
|
-
|
332
|
-
assert_equal("C",
|
394
|
+
result = @rbtree.delete("c")
|
395
|
+
assert_equal("C", result)
|
333
396
|
assert_equal(3, @rbtree.size)
|
334
397
|
assert_equal(nil, @rbtree["c"])
|
335
398
|
|
@@ -338,15 +401,16 @@ class RBTreeTest < Test::Unit::TestCase
|
|
338
401
|
end
|
339
402
|
|
340
403
|
def test_delete_if
|
341
|
-
@rbtree.delete_if {|key, val| val == "A" || val == "B" }
|
404
|
+
result = @rbtree.delete_if {|key, val| val == "A" || val == "B" }
|
405
|
+
assert_same(@rbtree, result)
|
342
406
|
assert_equal(RBTree[*%w(c C d D)], @rbtree)
|
343
407
|
|
344
|
-
|
408
|
+
assert_raises(ArgumentError) {
|
345
409
|
@rbtree.delete_if {|key, val| key == "c" or raise ArgumentError }
|
346
410
|
}
|
347
411
|
assert_equal(2, @rbtree.size)
|
348
412
|
|
349
|
-
|
413
|
+
assert_raises(TypeError) {
|
350
414
|
@rbtree.delete_if { @rbtree["e"] = "E" }
|
351
415
|
}
|
352
416
|
assert_equal(2, @rbtree.size)
|
@@ -355,43 +419,97 @@ class RBTreeTest < Test::Unit::TestCase
|
|
355
419
|
@rbtree.each {
|
356
420
|
assert_equal(2, @rbtree.size)
|
357
421
|
}
|
358
|
-
|
422
|
+
assert_raises(TypeError) {
|
359
423
|
@rbtree["e"] = "E"
|
360
424
|
}
|
361
425
|
true
|
362
426
|
}
|
363
427
|
assert_equal(0, @rbtree.size)
|
428
|
+
|
429
|
+
if have_enumerator?
|
430
|
+
rbtree = RBTree[*%w(b B d D a A c C)]
|
431
|
+
rbtree.delete_if.with_index {|(key, val), i| i < 2 }
|
432
|
+
assert_equal(RBTree[*%w(c C d D)], rbtree)
|
433
|
+
end
|
434
|
+
end
|
435
|
+
|
436
|
+
def test_keep_if
|
437
|
+
result = @rbtree.keep_if {|key, val| val == "A" || val == "B" }
|
438
|
+
assert_same(@rbtree, result)
|
439
|
+
assert_equal(RBTree[*%w(a A b B)], @rbtree)
|
440
|
+
|
441
|
+
if have_enumerator?
|
442
|
+
rbtree = RBTree[*%w(b B d D a A c C)]
|
443
|
+
rbtree.keep_if.with_index {|(key, val), i| i < 2 }
|
444
|
+
assert_equal(RBTree[*%w(a A b B)], rbtree)
|
445
|
+
end
|
364
446
|
end
|
365
447
|
|
366
448
|
def test_reject_bang
|
367
|
-
|
368
|
-
assert_equal(nil,
|
449
|
+
result = @rbtree.reject! { false }
|
450
|
+
assert_equal(nil, result)
|
369
451
|
assert_equal(4, @rbtree.size)
|
370
452
|
|
371
|
-
|
372
|
-
assert_same(@rbtree,
|
373
|
-
assert_equal(RBTree[*%w(c C d D)],
|
453
|
+
result = @rbtree.reject! {|key, val| val == "A" || val == "B" }
|
454
|
+
assert_same(@rbtree, result)
|
455
|
+
assert_equal(RBTree[*%w(c C d D)], result)
|
456
|
+
|
457
|
+
if have_enumerator?
|
458
|
+
rbtree = RBTree[*%w(b B d D a A c C)]
|
459
|
+
rbtree.reject!.with_index {|(key, val), i| i < 2 }
|
460
|
+
assert_equal(RBTree[*%w(c C d D)], rbtree)
|
461
|
+
end
|
374
462
|
end
|
375
|
-
|
463
|
+
|
376
464
|
def test_reject
|
377
|
-
|
378
|
-
assert_equal(
|
465
|
+
result = @rbtree.reject { false }
|
466
|
+
assert_equal(RBTree[*%w(a A b B c C d D)], result)
|
379
467
|
assert_equal(4, @rbtree.size)
|
380
468
|
|
381
|
-
|
382
|
-
assert_equal(RBTree[*%w(c C d D)],
|
469
|
+
result = @rbtree.reject {|key, val| val == "A" || val == "B" }
|
470
|
+
assert_equal(RBTree[*%w(c C d D)], result)
|
383
471
|
assert_equal(4, @rbtree.size)
|
472
|
+
|
473
|
+
if have_enumerator?
|
474
|
+
result = @rbtree.reject.with_index {|(key, val), i| i < 2 }
|
475
|
+
assert_equal(RBTree[*%w(c C d D)], result)
|
476
|
+
end
|
384
477
|
end
|
385
|
-
|
478
|
+
|
479
|
+
def test_select_bang
|
480
|
+
result = @rbtree.select! { true }
|
481
|
+
assert_equal(nil, result)
|
482
|
+
assert_equal(4, @rbtree.size)
|
483
|
+
|
484
|
+
result = @rbtree.select! {|key, val| val == "A" || val == "B" }
|
485
|
+
assert_same(@rbtree, result)
|
486
|
+
assert_equal(RBTree[*%w(a A b B)], result)
|
487
|
+
|
488
|
+
if have_enumerator?
|
489
|
+
rbtree = RBTree[*%w(b B d D a A c C)]
|
490
|
+
rbtree.select!.with_index {|(key, val), i| i < 2 }
|
491
|
+
assert_equal(RBTree[*%w(a A b B)], rbtree)
|
492
|
+
end
|
493
|
+
end
|
494
|
+
|
386
495
|
def test_select
|
387
|
-
|
388
|
-
assert_equal(
|
389
|
-
|
496
|
+
result = @rbtree.select { true }
|
497
|
+
assert_equal(RBTree[*%w(a A b B c C d D)], result)
|
498
|
+
assert_equal(4, @rbtree.size)
|
499
|
+
|
500
|
+
result = @rbtree.select {|key, val| val == "A" || val == "B" }
|
501
|
+
assert_equal(RBTree[*%w(a A b B)], result)
|
502
|
+
assert_raises(ArgumentError) { @rbtree.select("c") }
|
503
|
+
|
504
|
+
if have_enumerator?
|
505
|
+
result = @rbtree.select.with_index {|(key, val), i| i < 2 }
|
506
|
+
assert_equal(RBTree[*%w(a A b B)], result)
|
507
|
+
end
|
390
508
|
end
|
391
509
|
|
392
510
|
def test_values_at
|
393
|
-
|
394
|
-
assert_equal(["D", "A", nil],
|
511
|
+
result = @rbtree.values_at("d", "a", "e")
|
512
|
+
assert_equal(["D", "A", nil], result)
|
395
513
|
end
|
396
514
|
|
397
515
|
def test_invert
|
@@ -414,19 +532,36 @@ class RBTreeTest < Test::Unit::TestCase
|
|
414
532
|
}
|
415
533
|
assert_equal(RBTree[*%w(d AB)], @rbtree)
|
416
534
|
|
417
|
-
|
535
|
+
assert_raises(TypeError) { @rbtree.update("e") }
|
418
536
|
end
|
419
537
|
|
420
538
|
def test_merge
|
421
539
|
rbtree = RBTree.new
|
422
540
|
rbtree["e"] = "E"
|
423
541
|
|
424
|
-
|
425
|
-
assert_equal(RBTree[*%w(a A b B c C d D e E)],
|
542
|
+
result = @rbtree.merge(rbtree)
|
543
|
+
assert_equal(RBTree[*%w(a A b B c C d D e E)], result)
|
426
544
|
|
427
545
|
assert_equal(4, @rbtree.size)
|
428
546
|
end
|
429
|
-
|
547
|
+
|
548
|
+
if MultiRBTree.method_defined?(:flatten)
|
549
|
+
def test_flatten
|
550
|
+
rbtree = RBTree.new
|
551
|
+
rbtree.readjust {|a, b| a.flatten <=> b.flatten }
|
552
|
+
rbtree[["a"]] = ["A"]
|
553
|
+
rbtree[[["b"]]] = [["B"]]
|
554
|
+
assert_equal([["a"], ["A"], [["b"]], [["B"]]], rbtree.flatten)
|
555
|
+
assert_equal([["a"], ["A"], [["b"]], [["B"]]], rbtree.flatten(0))
|
556
|
+
assert_equal([["a"], ["A"], [["b"]], [["B"]]], rbtree.flatten(1))
|
557
|
+
assert_equal(["a", "A", ["b"], ["B"]], rbtree.flatten(2))
|
558
|
+
assert_equal(["a", "A", "b", "B"], rbtree.flatten(3))
|
559
|
+
|
560
|
+
assert_raises(TypeError) { @rbtree.flatten("e") }
|
561
|
+
assert_raises(ArgumentError) { @rbtree.flatten(1, 2) }
|
562
|
+
end
|
563
|
+
end
|
564
|
+
|
430
565
|
def test_has_key
|
431
566
|
assert_equal(true, @rbtree.has_key?("a"))
|
432
567
|
assert_equal(true, @rbtree.has_key?("b"))
|
@@ -455,14 +590,10 @@ class RBTreeTest < Test::Unit::TestCase
|
|
455
590
|
assert_equal([%w(a A), %w(b B), %w(c C), %w(d D)], @rbtree.to_a)
|
456
591
|
end
|
457
592
|
|
458
|
-
def test_to_s
|
459
|
-
assert_equal("aAbBcCdD", @rbtree.to_s)
|
460
|
-
end
|
461
|
-
|
462
593
|
def test_to_hash
|
463
594
|
@rbtree.default = "e"
|
464
595
|
hash = @rbtree.to_hash
|
465
|
-
assert_equal(@rbtree.to_a.flatten, hash.
|
596
|
+
assert_equal(@rbtree.to_a.flatten, hash.sort_by {|key, val| key}.flatten)
|
466
597
|
assert_equal("e", hash.default)
|
467
598
|
|
468
599
|
rbtree = RBTree.new { "e" }
|
@@ -479,66 +610,84 @@ class RBTreeTest < Test::Unit::TestCase
|
|
479
610
|
end
|
480
611
|
|
481
612
|
def test_inspect
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
613
|
+
[:to_s, :inspect].each do |method|
|
614
|
+
@rbtree.default = "e"
|
615
|
+
@rbtree.readjust {|a, b| a <=> b}
|
616
|
+
re = /#<RBTree: (\{.*\}), default=(.*), cmp_proc=(.*)>/
|
617
|
+
|
618
|
+
assert_match(re, @rbtree.send(method))
|
619
|
+
match = re.match(@rbtree.send(method))
|
620
|
+
tree, default, cmp_proc = match.to_a[1..-1]
|
621
|
+
assert_equal(%({"a"=>"A", "b"=>"B", "c"=>"C", "d"=>"D"}), tree)
|
622
|
+
assert_equal(%("e"), default)
|
623
|
+
assert_match(/#<Proc:\w+([@ ]#{__FILE__}:\d+)?>/o, cmp_proc)
|
624
|
+
|
625
|
+
rbtree = RBTree.new
|
626
|
+
assert_match(re, rbtree.send(method))
|
627
|
+
match = re.match(rbtree.send(method))
|
628
|
+
tree, default, cmp_proc = match.to_a[1..-1]
|
629
|
+
assert_equal("{}", tree)
|
630
|
+
assert_equal("nil", default)
|
631
|
+
assert_equal("nil", cmp_proc)
|
632
|
+
|
633
|
+
next if method == :to_s and RUBY_VERSION < "1.9"
|
634
|
+
|
635
|
+
rbtree = RBTree.new
|
636
|
+
rbtree[rbtree] = rbtree
|
637
|
+
rbtree.default = rbtree
|
638
|
+
match = re.match(rbtree.send(method))
|
639
|
+
tree, default, cmp_proc = match.to_a[1..-1]
|
640
|
+
assert_equal("{#<RBTree: ...>=>#<RBTree: ...>}", tree)
|
641
|
+
assert_equal("#<RBTree: ...>", default)
|
642
|
+
assert_equal("nil", cmp_proc)
|
643
|
+
end
|
506
644
|
end
|
507
645
|
|
508
646
|
def test_lower_bound
|
509
647
|
rbtree = RBTree[*%w(a A c C e E)]
|
510
|
-
assert_equal(
|
511
|
-
assert_equal(
|
648
|
+
assert_equal(%w(c C), rbtree.lower_bound("c"))
|
649
|
+
assert_equal(%w(c C), rbtree.lower_bound("b"))
|
512
650
|
assert_equal(nil, rbtree.lower_bound("f"))
|
513
651
|
end
|
514
652
|
|
515
653
|
def test_upper_bound
|
516
654
|
rbtree = RBTree[*%w(a A c C e E)]
|
517
|
-
assert_equal(
|
518
|
-
assert_equal(
|
655
|
+
assert_equal(%w(c C), rbtree.upper_bound("c"))
|
656
|
+
assert_equal(%w(c C), rbtree.upper_bound("d"))
|
519
657
|
assert_equal(nil, rbtree.upper_bound("Z"))
|
520
658
|
end
|
521
659
|
|
522
660
|
def test_bound
|
523
661
|
rbtree = RBTree[*%w(a A c C e E)]
|
524
|
-
assert_equal(%w(a A c C), rbtree.bound("a", "c").flatten)
|
525
|
-
assert_equal(%w(a A), rbtree.bound("a").flatten)
|
526
|
-
assert_equal(%w(c C e E), rbtree.bound("b", "f").flatten)
|
527
|
-
|
528
|
-
assert_equal([], rbtree.bound("b", "b"))
|
529
|
-
assert_equal([], rbtree.bound("Y", "Z"))
|
530
|
-
assert_equal([], rbtree.bound("f", "g"))
|
531
|
-
assert_equal([], rbtree.bound("f", "Z"))
|
662
|
+
assert_equal(%w(a A c C), rbtree.bound("a", "c").to_a.flatten)
|
663
|
+
assert_equal(%w(a A), rbtree.bound("a").to_a.flatten)
|
664
|
+
assert_equal(%w(c C e E), rbtree.bound("b", "f").to_a.flatten)
|
665
|
+
|
666
|
+
assert_equal([], rbtree.bound("b", "b").to_a)
|
667
|
+
assert_equal([], rbtree.bound("Y", "Z").to_a)
|
668
|
+
assert_equal([], rbtree.bound("f", "g").to_a)
|
669
|
+
assert_equal([], rbtree.bound("f", "Z").to_a)
|
670
|
+
|
671
|
+
if defined?(Enumerator) and Enumerator.method_defined?(:size)
|
672
|
+
assert_equal(2, rbtree.bound("a", "c").size)
|
673
|
+
assert_equal(1, rbtree.bound("a").size)
|
674
|
+
assert_equal(2, rbtree.bound("b", "f").size)
|
675
|
+
|
676
|
+
assert_equal(0, rbtree.bound("b", "b").size)
|
677
|
+
assert_equal(0, rbtree.bound("Y", "Z").size)
|
678
|
+
assert_equal(0, rbtree.bound("f", "g").size)
|
679
|
+
assert_equal(0, rbtree.bound("f", "Z").size)
|
680
|
+
end
|
532
681
|
end
|
533
682
|
|
534
683
|
def test_bound_block
|
535
|
-
|
684
|
+
result = []
|
536
685
|
@rbtree.bound("b", "c") {|key, val|
|
537
|
-
|
686
|
+
result.push(key)
|
538
687
|
}
|
539
|
-
assert_equal(%w(b c),
|
688
|
+
assert_equal(%w(b c), result)
|
540
689
|
|
541
|
-
|
690
|
+
assert_raises(TypeError) {
|
542
691
|
@rbtree.bound("a", "d") {
|
543
692
|
@rbtree["e"] = "E"
|
544
693
|
}
|
@@ -547,7 +696,7 @@ class RBTreeTest < Test::Unit::TestCase
|
|
547
696
|
|
548
697
|
@rbtree.bound("b", "c") {
|
549
698
|
@rbtree.bound("b", "c") {}
|
550
|
-
|
699
|
+
assert_raises(TypeError) {
|
551
700
|
@rbtree["e"] = "E"
|
552
701
|
}
|
553
702
|
break
|
@@ -556,7 +705,7 @@ class RBTreeTest < Test::Unit::TestCase
|
|
556
705
|
end
|
557
706
|
|
558
707
|
def test_first
|
559
|
-
assert_equal(
|
708
|
+
assert_equal(%w(a A), @rbtree.first)
|
560
709
|
|
561
710
|
rbtree = RBTree.new("e")
|
562
711
|
assert_equal("e", rbtree.first)
|
@@ -566,7 +715,7 @@ class RBTreeTest < Test::Unit::TestCase
|
|
566
715
|
end
|
567
716
|
|
568
717
|
def test_last
|
569
|
-
assert_equal(
|
718
|
+
assert_equal(%w(d D), @rbtree.last)
|
570
719
|
|
571
720
|
rbtree = RBTree.new("e")
|
572
721
|
assert_equal("e", rbtree.last)
|
@@ -588,17 +737,41 @@ class RBTreeTest < Test::Unit::TestCase
|
|
588
737
|
assert_equal(proc, @rbtree.cmp_proc)
|
589
738
|
|
590
739
|
@rbtree[0] = nil
|
591
|
-
|
592
|
-
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
assert_raise(ArgumentError) { @rbtree[0] = nil }
|
599
|
-
end
|
740
|
+
assert_raises(ArgumentError) { @rbtree.readjust(nil) }
|
741
|
+
assert_equal(5, @rbtree.size)
|
742
|
+
assert_equal(proc, @rbtree.cmp_proc)
|
743
|
+
|
744
|
+
@rbtree.delete(0)
|
745
|
+
@rbtree.readjust(nil)
|
746
|
+
assert_raises(ArgumentError) { @rbtree[0] = nil }
|
600
747
|
|
748
|
+
if Symbol.method_defined?(:to_proc)
|
749
|
+
rbtree = RBTree[*%w(a A B b)]
|
750
|
+
assert_equal(%w(B b a A), rbtree.to_a.flatten)
|
751
|
+
rbtree.readjust(:casecmp)
|
752
|
+
assert_equal(%w(a A B b), rbtree.to_a.flatten)
|
753
|
+
end
|
601
754
|
|
755
|
+
if RUBY_VERSION >= "1.9.2"
|
756
|
+
assert_nothing_raised {
|
757
|
+
@rbtree.readjust(lambda {|a, b| a <=> b })
|
758
|
+
@rbtree.readjust(lambda {|*a| a[0] <=> a[1] })
|
759
|
+
@rbtree.readjust(lambda {|a, *b| a <=> b[0] })
|
760
|
+
@rbtree.readjust(lambda {|a, b, *c| a <=> b })
|
761
|
+
@rbtree.readjust(&lambda {|a, b| a <=> b })
|
762
|
+
@rbtree.readjust(&lambda {|*a| a[0] <=> a[1] })
|
763
|
+
@rbtree.readjust(&lambda {|a, *b| a <=> b[0] })
|
764
|
+
@rbtree.readjust(&lambda {|a, b, *c| a <=> b })
|
765
|
+
}
|
766
|
+
assert_raises(TypeError) { @rbtree.readjust(lambda {|a| 1 }) }
|
767
|
+
assert_raises(TypeError) { @rbtree.readjust(lambda {|a, b, c| 1 }) }
|
768
|
+
assert_raises(TypeError) { @rbtree.readjust(lambda {|a, b, c, *d| 1 }) }
|
769
|
+
assert_raises(TypeError) { @rbtree.readjust(&lambda {|a| 1 }) }
|
770
|
+
assert_raises(TypeError) { @rbtree.readjust(&lambda {|a, b, c| 1 }) }
|
771
|
+
assert_raises(TypeError) { @rbtree.readjust(&lambda {|a, b, c, *d| 1 }) }
|
772
|
+
end
|
773
|
+
|
774
|
+
|
602
775
|
rbtree = RBTree.new
|
603
776
|
key = ["a"]
|
604
777
|
rbtree[key] = nil
|
@@ -609,14 +782,22 @@ class RBTreeTest < Test::Unit::TestCase
|
|
609
782
|
rbtree.readjust
|
610
783
|
assert_equal([["e"], ["f"]], rbtree.keys)
|
611
784
|
|
612
|
-
|
613
|
-
|
614
|
-
end
|
615
|
-
assert_raise(TypeError) { @rbtree.readjust("e") }
|
616
|
-
assert_raise(ArgumentError) {
|
785
|
+
assert_raises(TypeError) { @rbtree.readjust("e") }
|
786
|
+
assert_raises(ArgumentError) {
|
617
787
|
@rbtree.readjust(proc) {|a,b| a <=> b }
|
618
788
|
}
|
619
|
-
|
789
|
+
assert_raises(ArgumentError) { @rbtree.readjust(proc, proc) }
|
790
|
+
|
791
|
+
|
792
|
+
rbtree = RBTree[("a".."z").to_a.zip(("A".."Z").to_a)]
|
793
|
+
assert_nothing_raised do
|
794
|
+
rbtree.readjust do |a, b|
|
795
|
+
ObjectSpace.each_object(RBTree) do |temp|
|
796
|
+
temp.clear if temp.size == rbtree.size - 1
|
797
|
+
end
|
798
|
+
a <=> b
|
799
|
+
end
|
800
|
+
end
|
620
801
|
end
|
621
802
|
|
622
803
|
def test_replace
|
@@ -630,13 +811,18 @@ class RBTreeTest < Test::Unit::TestCase
|
|
630
811
|
assert_equal(rbtree.default, @rbtree.default)
|
631
812
|
assert_equal(rbtree.cmp_proc, @rbtree.cmp_proc)
|
632
813
|
|
633
|
-
|
814
|
+
assert_raises(TypeError) { @rbtree.replace("e") }
|
634
815
|
end
|
635
816
|
|
636
817
|
def test_reverse_each
|
637
|
-
|
638
|
-
@rbtree.reverse_each { |key, val|
|
639
|
-
assert_equal(%w(d D c C b B a A),
|
818
|
+
result = []
|
819
|
+
@rbtree.reverse_each { |key, val| result.push([key, val]) }
|
820
|
+
assert_equal(%w(d D c C b B a A), result.flatten)
|
821
|
+
|
822
|
+
if have_enumerator?
|
823
|
+
enumerator = @rbtree.reverse_each
|
824
|
+
assert_equal(%w(d D c C b B a A), enumerator.to_a.flatten)
|
825
|
+
end
|
640
826
|
end
|
641
827
|
|
642
828
|
def test_marshal
|
@@ -645,22 +831,32 @@ class RBTreeTest < Test::Unit::TestCase
|
|
645
831
|
@rbtree.default = "e"
|
646
832
|
assert_equal(@rbtree, Marshal.load(Marshal.dump(@rbtree)))
|
647
833
|
|
648
|
-
|
834
|
+
assert_raises(TypeError) {
|
649
835
|
Marshal.dump(RBTree.new { "e" })
|
650
836
|
}
|
651
837
|
|
652
|
-
|
838
|
+
assert_raises(TypeError) {
|
653
839
|
@rbtree.readjust {|a, b| a <=> b}
|
654
840
|
Marshal.dump(@rbtree)
|
655
841
|
}
|
656
842
|
end
|
843
|
+
|
844
|
+
def test_modify_in_cmp_proc
|
845
|
+
can_clear = false
|
846
|
+
@rbtree.readjust do |a, b|
|
847
|
+
@rbtree.clear if can_clear
|
848
|
+
a <=> b
|
849
|
+
end
|
850
|
+
can_clear = true
|
851
|
+
assert_raises(TypeError) { @rbtree["e"] }
|
852
|
+
end
|
657
853
|
|
658
854
|
begin
|
659
855
|
require "pp"
|
660
856
|
|
661
857
|
def test_pp
|
662
858
|
assert_equal(%(#<RBTree: {}, default=nil, cmp_proc=nil>\n),
|
663
|
-
PP.pp(RBTree
|
859
|
+
PP.pp(RBTree.new, ""))
|
664
860
|
assert_equal(%(#<RBTree: {"a"=>"A", "b"=>"B"}, default=nil, cmp_proc=nil>\n),
|
665
861
|
PP.pp(RBTree[*%w(a A b B)], ""))
|
666
862
|
|
@@ -686,7 +882,7 @@ class RBTreeTest < Test::Unit::TestCase
|
|
686
882
|
EOS
|
687
883
|
assert_equal(expected, PP.pp(rbtree, ""))
|
688
884
|
|
689
|
-
rbtree = RBTree
|
885
|
+
rbtree = RBTree.new
|
690
886
|
rbtree[rbtree] = rbtree
|
691
887
|
rbtree.default = rbtree
|
692
888
|
expected = <<EOS
|
@@ -710,7 +906,7 @@ class MultiRBTreeTest < Test::Unit::TestCase
|
|
710
906
|
assert_equal(%w(a A b B b C b D c C), @rbtree.to_a.flatten)
|
711
907
|
|
712
908
|
assert_equal(MultiRBTree[*%w(a A)], MultiRBTree[RBTree[*%w(a A)]])
|
713
|
-
|
909
|
+
assert_raises(TypeError) {
|
714
910
|
RBTree[MultiRBTree[*%w(a A)]]
|
715
911
|
}
|
716
912
|
end
|
@@ -734,13 +930,11 @@ class MultiRBTreeTest < Test::Unit::TestCase
|
|
734
930
|
assert_equal([%w(a A), %w(b B), %w(b C), %w(b D), %w(c C)],
|
735
931
|
@rbtree.to_a)
|
736
932
|
end
|
737
|
-
|
738
|
-
def test_to_s
|
739
|
-
assert_equal("aAbBbCbDcC", @rbtree.to_s)
|
740
|
-
end
|
741
933
|
|
742
934
|
def test_to_hash
|
743
|
-
|
935
|
+
assert_raises(TypeError) {
|
936
|
+
@rbtree.to_hash
|
937
|
+
}
|
744
938
|
end
|
745
939
|
|
746
940
|
def test_to_rbtree
|
@@ -766,7 +960,7 @@ class MultiRBTreeTest < Test::Unit::TestCase
|
|
766
960
|
def test_replace
|
767
961
|
assert_equal(RBTree[*%w(a A)],
|
768
962
|
MultiRBTree[*%w(a A)].replace(RBTree[*%w(a A)]))
|
769
|
-
|
963
|
+
assert_raises(TypeError) {
|
770
964
|
RBTree[*%w(a A)].replace(MultiRBTree[*%w(a A)])
|
771
965
|
}
|
772
966
|
end
|
@@ -774,7 +968,7 @@ class MultiRBTreeTest < Test::Unit::TestCase
|
|
774
968
|
def test_update
|
775
969
|
assert_equal(MultiRBTree[*%w(a A b B)],
|
776
970
|
MultiRBTree[*%w(a A)].update(RBTree[*%w(b B)]))
|
777
|
-
|
971
|
+
assert_raises(TypeError) {
|
778
972
|
RBTree[*%w(a A)].update(MultiRBTree[*%w(b B)])
|
779
973
|
}
|
780
974
|
end
|
@@ -784,11 +978,11 @@ class MultiRBTreeTest < Test::Unit::TestCase
|
|
784
978
|
end
|
785
979
|
|
786
980
|
def test_each
|
787
|
-
|
981
|
+
result = []
|
788
982
|
@rbtree.each {|k, v|
|
789
|
-
|
983
|
+
result << k << v
|
790
984
|
}
|
791
|
-
assert_equal(%w(a A b B b C b D c C),
|
985
|
+
assert_equal(%w(a A b B b C b D c C), result)
|
792
986
|
end
|
793
987
|
|
794
988
|
def test_delete
|
@@ -810,6 +1004,17 @@ class MultiRBTreeTest < Test::Unit::TestCase
|
|
810
1004
|
assert_equal(%w(a A c C), @rbtree.to_a.flatten)
|
811
1005
|
end
|
812
1006
|
|
1007
|
+
def test_keep_if
|
1008
|
+
@rbtree.keep_if {|k, v| k != "b" }
|
1009
|
+
assert_equal(%w(a A c C), @rbtree.to_a.flatten)
|
1010
|
+
end
|
1011
|
+
|
1012
|
+
if MultiRBTree.method_defined?(:flatten)
|
1013
|
+
def test_flatten
|
1014
|
+
assert_equal(%w(a A b B b C b D c C), @rbtree.flatten)
|
1015
|
+
end
|
1016
|
+
end
|
1017
|
+
|
813
1018
|
def test_inspect
|
814
1019
|
assert_equal(%(#<MultiRBTree: {"a"=>"A", "b"=>"B", "b"=>"C", "b"=>"D", "c"=>"C"}, default=nil, cmp_proc=nil>),
|
815
1020
|
@rbtree.inspect)
|
@@ -833,7 +1038,7 @@ class MultiRBTreeTest < Test::Unit::TestCase
|
|
833
1038
|
end
|
834
1039
|
|
835
1040
|
def test_bound
|
836
|
-
assert_equal(%w(b B b C b D), @rbtree.bound("b").flatten)
|
1041
|
+
assert_equal(%w(b B b C b D), @rbtree.bound("b").to_a.flatten)
|
837
1042
|
end
|
838
1043
|
|
839
1044
|
def test_first
|
@@ -866,11 +1071,6 @@ class MultiRBTreeTest < Test::Unit::TestCase
|
|
866
1071
|
assert_equal(true, @rbtree.has_value?("D"))
|
867
1072
|
end
|
868
1073
|
|
869
|
-
def test_select
|
870
|
-
assert_equal(%w(b B b C b D), @rbtree.select {|k, v| k == "b"}.flatten)
|
871
|
-
assert_equal(%w(b C c C), @rbtree.select {|k, v| v == "C"}.flatten)
|
872
|
-
end
|
873
|
-
|
874
1074
|
def test_values_at
|
875
1075
|
assert_equal(%w(A B), @rbtree.values_at("a", "b"))
|
876
1076
|
end
|
@@ -887,9 +1087,9 @@ class MultiRBTreeTest < Test::Unit::TestCase
|
|
887
1087
|
assert_equal(%w(A B C D C), @rbtree.values)
|
888
1088
|
end
|
889
1089
|
|
890
|
-
def
|
891
|
-
assert_equal("b", @rbtree.
|
892
|
-
assert_equal("b", @rbtree.
|
893
|
-
assert_equal("b", @rbtree.
|
1090
|
+
def test_key
|
1091
|
+
assert_equal("b", @rbtree.key("B"))
|
1092
|
+
assert_equal("b", @rbtree.key("C"))
|
1093
|
+
assert_equal("b", @rbtree.key("D"))
|
894
1094
|
end
|
895
1095
|
end
|