rbtree2 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,2 @@
1
+ require "rbtree2/version"
2
+ require File.expand_path("../../ext/rbtree", __FILE__)
@@ -0,0 +1,3 @@
1
+ module Rbtree2
2
+ VERSION = "0.0.3"
3
+ end
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rbtree2/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "rbtree2"
8
+ gem.version = Rbtree2::VERSION
9
+ gem.authors = ["Keisuke KITA"]
10
+ gem.email = ["kei.kita2501@gmail.com"]
11
+ gem.description = %q{RB-Trees supported Ruby2 }
12
+ gem.summary = %q{RB-Trees supported Ruby2 }
13
+ gem.extensions = ["ext/extconf.rb"]
14
+ gem.homepage = "https://github.com/kitak/rbtree2"
15
+ gem.license = "MIT"
16
+
17
+ gem.files = `git ls-files`.split($/)
18
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
19
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
20
+ gem.require_paths = ["lib"]
21
+
22
+ gem.add_development_dependency "rake"
23
+ end
@@ -0,0 +1,9 @@
1
+ describe Rbtree2 do
2
+ it 'should have a version number' do
3
+ Rbtree2::VERSION.should_not be_nil
4
+ end
5
+
6
+ it 'should do something useful' do
7
+ false.should be_true
8
+ end
9
+ end
@@ -0,0 +1,2 @@
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+ require 'rbtree2'
@@ -0,0 +1,968 @@
1
+ require "rbtree2"
2
+ require "test/unit.rb"
3
+
4
+ class RBTreeTest < Test::Unit::TestCase
5
+ def setup
6
+ @rbtree = RBTree[*%w(b B d D a A c C)]
7
+ end
8
+
9
+ def test_new
10
+ assert_nothing_raised {
11
+ RBTree.new
12
+ RBTree.new("a")
13
+ RBTree.new { "a" }
14
+ }
15
+ assert_raises(ArgumentError) { RBTree.new("a") {} }
16
+ assert_raises(ArgumentError) { RBTree.new("a", "a") }
17
+ end
18
+
19
+ def test_aref
20
+ assert_equal("A", @rbtree["a"])
21
+ assert_equal("B", @rbtree["b"])
22
+ assert_equal("C", @rbtree["c"])
23
+ assert_equal("D", @rbtree["d"])
24
+
25
+ assert_equal(nil, @rbtree["e"])
26
+ @rbtree.default = "E"
27
+ assert_equal("E", @rbtree["e"])
28
+ end
29
+
30
+ def test_size
31
+ assert_equal(4, @rbtree.size)
32
+ end
33
+
34
+ def test_create
35
+ rbtree = RBTree[]
36
+ assert_equal(0, rbtree.size)
37
+
38
+ rbtree = RBTree[@rbtree]
39
+ assert_equal(4, rbtree.size)
40
+ assert_equal("A", @rbtree["a"])
41
+ assert_equal("B", @rbtree["b"])
42
+ assert_equal("C", @rbtree["c"])
43
+ assert_equal("D", @rbtree["d"])
44
+
45
+ rbtree = RBTree[RBTree.new("e")]
46
+ assert_equal(nil, rbtree.default)
47
+ rbtree = RBTree[RBTree.new { "e" }]
48
+ assert_equal(nil, rbtree.default_proc)
49
+ @rbtree.readjust {|a,b| b <=> a }
50
+ assert_equal(nil, RBTree[@rbtree].cmp_proc)
51
+
52
+ assert_raises(ArgumentError) { RBTree["e"] }
53
+
54
+ rbtree = RBTree[Hash[*%w(b B d D a A c C)]]
55
+ assert_equal(4, rbtree.size)
56
+ assert_equal("A", rbtree["a"])
57
+ assert_equal("B", rbtree["b"])
58
+ assert_equal("C", rbtree["c"])
59
+ assert_equal("D", rbtree["d"])
60
+
61
+ rbtree = RBTree[[%w(a A), %w(b B), %w(c C), %w(d D)]];
62
+ assert_equal(4, rbtree.size)
63
+ assert_equal("A", rbtree["a"])
64
+ assert_equal("B", rbtree["b"])
65
+ assert_equal("C", rbtree["c"])
66
+ assert_equal("D", rbtree["d"])
67
+
68
+ rbtree = RBTree[[["a"]]]
69
+ assert_equal(1, rbtree.size)
70
+ assert_equal(nil, rbtree["a"])
71
+ end
72
+
73
+ def test_clear
74
+ @rbtree.clear
75
+ assert_equal(0, @rbtree.size)
76
+ end
77
+
78
+ def test_aset
79
+ @rbtree["e"] = "E"
80
+ assert_equal(5, @rbtree.size)
81
+ assert_equal("E", @rbtree["e"])
82
+
83
+ @rbtree["c"] = "E"
84
+ assert_equal(5, @rbtree.size)
85
+ assert_equal("E", @rbtree["c"])
86
+
87
+ assert_raises(ArgumentError) { @rbtree[100] = 100 }
88
+ assert_equal(5, @rbtree.size)
89
+
90
+
91
+ key = "f"
92
+ @rbtree[key] = "F"
93
+ cloned_key = @rbtree.last[0]
94
+ assert_equal("f", cloned_key)
95
+ assert_not_same(key, cloned_key)
96
+ assert_equal(true, cloned_key.frozen?)
97
+
98
+ @rbtree["f"] = "F"
99
+ assert_same(cloned_key, @rbtree.last[0])
100
+
101
+ rbtree = RBTree.new
102
+ key = ["g"]
103
+ rbtree[key] = "G"
104
+ assert_same(key, rbtree.first[0])
105
+ assert_equal(false, key.frozen?)
106
+ end
107
+
108
+ def test_clone
109
+ clone = @rbtree.clone
110
+ assert_equal(4, @rbtree.size)
111
+ assert_equal("A", @rbtree["a"])
112
+ assert_equal("B", @rbtree["b"])
113
+ assert_equal("C", @rbtree["c"])
114
+ assert_equal("D", @rbtree["d"])
115
+
116
+ rbtree = RBTree.new("e")
117
+ clone = rbtree.clone
118
+ assert_equal("e", clone.default)
119
+
120
+ rbtree = RBTree.new { "e" }
121
+ clone = rbtree.clone
122
+ assert_equal("e", clone.default(nil))
123
+
124
+ rbtree = RBTree.new
125
+ rbtree.readjust {|a, b| a <=> b }
126
+ clone = rbtree.clone
127
+ assert_equal(rbtree.cmp_proc, clone.cmp_proc)
128
+ end
129
+
130
+ def test_default
131
+ assert_equal(nil, @rbtree.default)
132
+
133
+ rbtree = RBTree.new("e")
134
+ assert_equal("e", rbtree.default)
135
+ assert_equal("e", rbtree.default("f"))
136
+ assert_raises(ArgumentError) { rbtree.default("e", "f") }
137
+
138
+ rbtree = RBTree.new {|tree, key| @rbtree[key || "c"] }
139
+ assert_equal("C", rbtree.default(nil))
140
+ assert_equal("B", rbtree.default("b"))
141
+ end
142
+
143
+ def test_set_default
144
+ rbtree = RBTree.new { "e" }
145
+ rbtree.default = "f"
146
+ assert_equal("f", rbtree.default)
147
+ end
148
+
149
+ def test_default_proc
150
+ rbtree = RBTree.new("e")
151
+ assert_equal(nil, rbtree.default_proc)
152
+
153
+ rbtree = RBTree.new { "e" }
154
+ assert_equal("e", rbtree.default_proc.call)
155
+ end
156
+
157
+ def test_equal
158
+ assert_equal(RBTree.new, RBTree.new)
159
+ assert_equal(@rbtree, @rbtree)
160
+ assert_not_equal(@rbtree, RBTree.new)
161
+
162
+ rbtree = RBTree[*%w(b B d D a A c C)]
163
+ assert_equal(@rbtree, rbtree)
164
+ rbtree["d"] = "A"
165
+ assert_not_equal(@rbtree, rbtree)
166
+ rbtree["d"] = "D"
167
+ rbtree["e"] = "E"
168
+ assert_not_equal(@rbtree, rbtree)
169
+ @rbtree["e"] = "E"
170
+ assert_equal(@rbtree, rbtree)
171
+
172
+ rbtree.default = "e"
173
+ assert_equal(@rbtree, rbtree)
174
+ @rbtree.default = "f"
175
+ assert_equal(@rbtree, rbtree)
176
+
177
+ a = RBTree.new("e")
178
+ b = RBTree.new { "f" }
179
+ assert_equal(a, b)
180
+ assert_equal(b, b.clone)
181
+
182
+ a = RBTree.new
183
+ b = RBTree.new
184
+ a.readjust {|x, y| x <=> y }
185
+ assert_not_equal(a, b)
186
+ b.readjust(a.cmp_proc)
187
+ assert_equal(a, b)
188
+ end
189
+
190
+ def test_fetch
191
+ assert_equal("A", @rbtree.fetch("a"))
192
+ assert_equal("B", @rbtree.fetch("b"))
193
+ assert_equal("C", @rbtree.fetch("c"))
194
+ assert_equal("D", @rbtree.fetch("d"))
195
+
196
+ assert_raises(IndexError) { @rbtree.fetch("e") }
197
+
198
+ assert_equal("E", @rbtree.fetch("e", "E"))
199
+ assert_equal("E", @rbtree.fetch("e") { "E" })
200
+
201
+ class << (stderr = "")
202
+ alias write <<
203
+ end
204
+ $stderr, stderr, $VERBOSE, verbose = stderr, $stderr, false, $VERBOSE
205
+ begin
206
+ assert_equal("E", @rbtree.fetch("e", "F") { "E" })
207
+ ensure
208
+ $stderr, stderr, $VERBOSE, verbose = stderr, $stderr, false, $VERBOSE
209
+ end
210
+ assert_match(/warning: block supersedes default value argument/, stderr)
211
+
212
+ assert_raises(ArgumentError) { @rbtree.fetch }
213
+ assert_raises(ArgumentError) { @rbtree.fetch("e", "E", "E") }
214
+ end
215
+
216
+ def test_index
217
+ assert_equal("a", @rbtree.index("A"))
218
+ assert_equal(nil, @rbtree.index("E"))
219
+ end
220
+
221
+ def test_empty_p
222
+ assert_equal(false, @rbtree.empty?)
223
+ @rbtree.clear
224
+ assert_equal(true, @rbtree.empty?)
225
+ end
226
+
227
+ def test_each
228
+ ret = []
229
+ @rbtree.each {|key, val| ret << key << val }
230
+ assert_equal(%w(a A b B c C d D), ret)
231
+
232
+ assert_raises(TypeError) {
233
+ @rbtree.each { @rbtree["e"] = "E" }
234
+ }
235
+ assert_equal(4, @rbtree.size)
236
+
237
+ @rbtree.each {
238
+ @rbtree.each {}
239
+ assert_raises(TypeError) {
240
+ @rbtree["e"] = "E"
241
+ }
242
+ break
243
+ }
244
+ assert_equal(4, @rbtree.size)
245
+
246
+ if defined?(Enumerable::Enumerator)
247
+ enumerator = @rbtree.each
248
+ assert_equal(%w(a A b B c C d D), enumerator.map.flatten)
249
+ end
250
+ end
251
+
252
+ def test_each_pair
253
+ ret = []
254
+ @rbtree.each_pair {|key, val| ret << key << val }
255
+ assert_equal(%w(a A b B c C d D), ret)
256
+
257
+ assert_raises(TypeError) {
258
+ @rbtree.each_pair { @rbtree["e"] = "E" }
259
+ }
260
+ assert_equal(4, @rbtree.size)
261
+
262
+ @rbtree.each_pair {
263
+ @rbtree.each_pair {}
264
+ assert_raises(TypeError) {
265
+ @rbtree["e"] = "E"
266
+ }
267
+ break
268
+ }
269
+ assert_equal(4, @rbtree.size)
270
+
271
+ if defined?(Enumerable::Enumerator)
272
+ enumerator = @rbtree.each_pair
273
+ assert_equal(%w(a A b B c C d D), enumerator.map.flatten)
274
+ end
275
+ end
276
+
277
+ def test_each_key
278
+ ret = []
279
+ @rbtree.each_key {|key| ret.push(key) }
280
+ assert_equal(%w(a b c d), ret)
281
+
282
+ assert_raises(TypeError) {
283
+ @rbtree.each_key { @rbtree["e"] = "E" }
284
+ }
285
+ assert_equal(4, @rbtree.size)
286
+
287
+ @rbtree.each_key {
288
+ @rbtree.each_key {}
289
+ assert_raises(TypeError) {
290
+ @rbtree["e"] = "E"
291
+ }
292
+ break
293
+ }
294
+ assert_equal(4, @rbtree.size)
295
+
296
+ if defined?(Enumerable::Enumerator)
297
+ enumerator = @rbtree.each_key
298
+ assert_equal(%w(a b c d), enumerator.map.flatten)
299
+ end
300
+ end
301
+
302
+ def test_each_value
303
+ ret = []
304
+ @rbtree.each_value {|val| ret.push(val) }
305
+ assert_equal(%w(A B C D), ret)
306
+
307
+ assert_raises(TypeError) {
308
+ @rbtree.each_value { @rbtree["e"] = "E" }
309
+ }
310
+ assert_equal(4, @rbtree.size)
311
+
312
+ @rbtree.each_value {
313
+ @rbtree.each_value {}
314
+ assert_raises(TypeError) {
315
+ @rbtree["e"] = "E"
316
+ }
317
+ break
318
+ }
319
+ assert_equal(4, @rbtree.size)
320
+
321
+ if defined?(Enumerable::Enumerator)
322
+ enumerator = @rbtree.each_value
323
+ assert_equal(%w(A B C D), enumerator.map.flatten)
324
+ end
325
+ end
326
+
327
+ def test_shift
328
+ ret = @rbtree.shift
329
+ assert_equal(3, @rbtree.size)
330
+ assert_equal(["a", "A"], ret)
331
+ assert_equal(nil, @rbtree["a"])
332
+
333
+ 3.times { @rbtree.shift }
334
+ assert_equal(0, @rbtree.size)
335
+ assert_equal(nil, @rbtree.shift)
336
+ @rbtree.default = "e"
337
+ assert_equal("e", @rbtree.shift)
338
+
339
+ rbtree = RBTree.new { "e" }
340
+ assert_equal("e", rbtree.shift)
341
+ end
342
+
343
+ def test_pop
344
+ ret = @rbtree.pop
345
+ assert_equal(3, @rbtree.size)
346
+ assert_equal(["d", "D"], ret)
347
+ assert_equal(nil, @rbtree["d"])
348
+
349
+ 3.times { @rbtree.pop }
350
+ assert_equal(0, @rbtree.size)
351
+ assert_equal(nil, @rbtree.pop)
352
+ @rbtree.default = "e"
353
+ assert_equal("e", @rbtree.pop)
354
+
355
+ rbtree = RBTree.new { "e" }
356
+ assert_equal("e", rbtree.pop)
357
+ end
358
+
359
+ def test_delete
360
+ ret = @rbtree.delete("c")
361
+ assert_equal("C", ret)
362
+ assert_equal(3, @rbtree.size)
363
+ assert_equal(nil, @rbtree["c"])
364
+
365
+ assert_equal(nil, @rbtree.delete("e"))
366
+ assert_equal("E", @rbtree.delete("e") { "E" })
367
+ end
368
+
369
+ def test_delete_if
370
+ @rbtree.delete_if {|key, val| val == "A" || val == "B" }
371
+ assert_equal(RBTree[*%w(c C d D)], @rbtree)
372
+
373
+ assert_raises(ArgumentError) {
374
+ @rbtree.delete_if {|key, val| key == "c" or raise ArgumentError }
375
+ }
376
+ assert_equal(2, @rbtree.size)
377
+
378
+ assert_raises(TypeError) {
379
+ @rbtree.delete_if { @rbtree["e"] = "E" }
380
+ }
381
+ assert_equal(2, @rbtree.size)
382
+
383
+ @rbtree.delete_if {
384
+ @rbtree.each {
385
+ assert_equal(2, @rbtree.size)
386
+ }
387
+ assert_raises(TypeError) {
388
+ @rbtree["e"] = "E"
389
+ }
390
+ true
391
+ }
392
+ assert_equal(0, @rbtree.size)
393
+
394
+ if defined?(Enumerable::Enumerator)
395
+ rbtree = RBTree[*%w(b B d D a A c C)]
396
+ enumerator = rbtree.delete_if
397
+ assert_equal([true, true, false, false], enumerator.map {|key, val| val == "A" || val == "B" })
398
+ end
399
+ end
400
+
401
+ def test_reject_bang
402
+ ret = @rbtree.reject! { false }
403
+ assert_equal(nil, ret)
404
+ assert_equal(4, @rbtree.size)
405
+
406
+ ret = @rbtree.reject! {|key, val| val == "A" || val == "B" }
407
+ assert_same(@rbtree, ret)
408
+ assert_equal(RBTree[*%w(c C d D)], ret)
409
+
410
+ if defined?(Enumerable::Enumerator)
411
+ rbtree = RBTree[*%w(b B d D a A c C)]
412
+ enumerator = rbtree.reject!
413
+ assert_equal([true, true, false, false], enumerator.map {|key, val| val == "A" || val == "B" })
414
+ end
415
+ end
416
+
417
+ def test_reject
418
+ ret = @rbtree.reject { false }
419
+ assert_equal(nil, ret)
420
+ assert_equal(4, @rbtree.size)
421
+
422
+ ret = @rbtree.reject {|key, val| val == "A" || val == "B" }
423
+ assert_equal(RBTree[*%w(c C d D)], ret)
424
+ assert_equal(4, @rbtree.size)
425
+
426
+ if defined?(Enumerable::Enumerator)
427
+ enumerator = @rbtree.reject
428
+ assert_equal([true, true, false, false], enumerator.map {|key, val| val == "A" || val == "B" })
429
+ end
430
+ end
431
+
432
+ def test_select
433
+ ret = @rbtree.select {|key, val| val == "A" || val == "B" }
434
+ assert_equal(%w(a A b B), ret.flatten)
435
+ assert_raises(ArgumentError) { @rbtree.select("c") }
436
+
437
+ if defined?(Enumerable::Enumerator)
438
+ enumerator = @rbtree.select
439
+ assert_equal([true, true, false, false], enumerator.map {|key, val| val == "A" || val == "B"})
440
+ end
441
+ end
442
+
443
+ def test_values_at
444
+ ret = @rbtree.values_at("d", "a", "e")
445
+ assert_equal(["D", "A", nil], ret)
446
+ end
447
+
448
+ def test_invert
449
+ assert_equal(RBTree[*%w(A a B b C c D d)], @rbtree.invert)
450
+ end
451
+
452
+ def test_update
453
+ rbtree = RBTree.new
454
+ rbtree["e"] = "E"
455
+ @rbtree.update(rbtree)
456
+ assert_equal(RBTree[*%w(a A b B c C d D e E)], @rbtree)
457
+
458
+ @rbtree.clear
459
+ @rbtree["d"] = "A"
460
+ rbtree.clear
461
+ rbtree["d"] = "B"
462
+
463
+ @rbtree.update(rbtree) {|key, val1, val2|
464
+ val1 + val2 if key == "d"
465
+ }
466
+ assert_equal(RBTree[*%w(d AB)], @rbtree)
467
+
468
+ assert_raises(TypeError) { @rbtree.update("e") }
469
+ end
470
+
471
+ def test_merge
472
+ rbtree = RBTree.new
473
+ rbtree["e"] = "E"
474
+
475
+ ret = @rbtree.merge(rbtree)
476
+ assert_equal(RBTree[*%w(a A b B c C d D e E)], ret)
477
+
478
+ assert_equal(4, @rbtree.size)
479
+ end
480
+
481
+ def test_has_key
482
+ assert_equal(true, @rbtree.has_key?("a"))
483
+ assert_equal(true, @rbtree.has_key?("b"))
484
+ assert_equal(true, @rbtree.has_key?("c"))
485
+ assert_equal(true, @rbtree.has_key?("d"))
486
+ assert_equal(false, @rbtree.has_key?("e"))
487
+ end
488
+
489
+ def test_has_value
490
+ assert_equal(true, @rbtree.has_value?("A"))
491
+ assert_equal(true, @rbtree.has_value?("B"))
492
+ assert_equal(true, @rbtree.has_value?("C"))
493
+ assert_equal(true, @rbtree.has_value?("D"))
494
+ assert_equal(false, @rbtree.has_value?("E"))
495
+ end
496
+
497
+ def test_keys
498
+ assert_equal(%w(a b c d), @rbtree.keys)
499
+ end
500
+
501
+ def test_values
502
+ assert_equal(%w(A B C D), @rbtree.values)
503
+ end
504
+
505
+ def test_to_a
506
+ assert_equal([%w(a A), %w(b B), %w(c C), %w(d D)], @rbtree.to_a)
507
+ end
508
+
509
+ def test_to_s
510
+ if RUBY_VERSION < "1.9"
511
+ assert_equal("aAbBcCdD", @rbtree.to_s)
512
+ else
513
+ expected = "[[\"a\", \"A\"], [\"b\", \"B\"], [\"c\", \"C\"], [\"d\", \"D\"]]"
514
+ assert_equal(expected, @rbtree.to_s)
515
+
516
+ rbtree = RBTree.new
517
+ rbtree[rbtree] = rbtree
518
+ rbtree.default = rbtree
519
+ expected = "[[#<RBTree: {#<RBTree: ...>=>#<RBTree: ...>}, default=#<RBTree: ...>, cmp_proc=nil>, #<RBTree: {#<RBTree: ...>=>#<RBTree: ...>}, default=#<RBTree: ...>, cmp_proc=nil>]]"
520
+ assert_equal(expected, rbtree.to_s)
521
+ end
522
+ end
523
+
524
+ def test_to_hash
525
+ @rbtree.default = "e"
526
+ hash = @rbtree.to_hash
527
+ assert_equal(@rbtree.to_a.flatten, hash.to_a.flatten)
528
+ assert_equal("e", hash.default)
529
+
530
+ rbtree = RBTree.new { "e" }
531
+ hash = rbtree.to_hash
532
+ if (hash.respond_to?(:default_proc))
533
+ assert_equal(rbtree.default_proc, hash.default_proc)
534
+ else
535
+ assert_equal(rbtree.default_proc, hash.default)
536
+ end
537
+ end
538
+
539
+ def test_to_rbtree
540
+ assert_same(@rbtree, @rbtree.to_rbtree)
541
+ end
542
+
543
+ def test_inspect
544
+ @rbtree.default = "e"
545
+ @rbtree.readjust {|a, b| a <=> b}
546
+ re = /#<RBTree: (\{.*\}), default=(.*), cmp_proc=(.*)>/
547
+
548
+ assert_match(re, @rbtree.inspect)
549
+ match = re.match(@rbtree.inspect)
550
+ tree, default, cmp_proc = match.to_a[1..-1]
551
+ assert_equal(%({"a"=>"A", "b"=>"B", "c"=>"C", "d"=>"D"}), tree)
552
+ assert_equal(%("e"), default)
553
+ assert_match(/#<Proc:\w+(@#{__FILE__}:\d+)?>/o, cmp_proc)
554
+
555
+ rbtree = RBTree.new
556
+ assert_match(re, rbtree.inspect)
557
+ match = re.match(rbtree.inspect)
558
+ tree, default, cmp_proc = match.to_a[1..-1]
559
+ assert_equal("{}", tree)
560
+ assert_equal("nil", default)
561
+ assert_equal("nil", cmp_proc)
562
+
563
+ rbtree = RBTree.new
564
+ rbtree[rbtree] = rbtree
565
+ rbtree.default = rbtree
566
+ match = re.match(rbtree.inspect)
567
+ tree, default, cmp_proc = match.to_a[1..-1]
568
+ assert_equal("{#<RBTree: ...>=>#<RBTree: ...>}", tree)
569
+ assert_equal("#<RBTree: ...>", default)
570
+ assert_equal("nil", cmp_proc)
571
+ end
572
+
573
+ def test_lower_bound
574
+ rbtree = RBTree[*%w(a A c C e E)]
575
+ assert_equal(["c", "C"], rbtree.lower_bound("c"))
576
+ assert_equal(["c", "C"], rbtree.lower_bound("b"))
577
+ assert_equal(nil, rbtree.lower_bound("f"))
578
+ end
579
+
580
+ def test_upper_bound
581
+ rbtree = RBTree[*%w(a A c C e E)]
582
+ assert_equal(["c", "C"], rbtree.upper_bound("c"))
583
+ assert_equal(["c", "C"], rbtree.upper_bound("d"))
584
+ assert_equal(nil, rbtree.upper_bound("Z"))
585
+ end
586
+
587
+ def test_bound
588
+ rbtree = RBTree[*%w(a A c C e E)]
589
+ assert_equal(%w(a A c C), rbtree.bound("a", "c").flatten)
590
+ assert_equal(%w(a A), rbtree.bound("a").flatten)
591
+ assert_equal(%w(c C e E), rbtree.bound("b", "f").flatten)
592
+
593
+ assert_equal([], rbtree.bound("b", "b"))
594
+ assert_equal([], rbtree.bound("Y", "Z"))
595
+ assert_equal([], rbtree.bound("f", "g"))
596
+ assert_equal([], rbtree.bound("f", "Z"))
597
+ end
598
+
599
+ def test_bound_block
600
+ ret = []
601
+ @rbtree.bound("b", "c") {|key, val|
602
+ ret.push(key)
603
+ }
604
+ assert_equal(%w(b c), ret)
605
+
606
+ assert_raises(TypeError) {
607
+ @rbtree.bound("a", "d") {
608
+ @rbtree["e"] = "E"
609
+ }
610
+ }
611
+ assert_equal(4, @rbtree.size)
612
+
613
+ @rbtree.bound("b", "c") {
614
+ @rbtree.bound("b", "c") {}
615
+ assert_raises(TypeError) {
616
+ @rbtree["e"] = "E"
617
+ }
618
+ break
619
+ }
620
+ assert_equal(4, @rbtree.size)
621
+ end
622
+
623
+ def test_first
624
+ assert_equal(["a", "A"], @rbtree.first)
625
+
626
+ rbtree = RBTree.new("e")
627
+ assert_equal("e", rbtree.first)
628
+
629
+ rbtree = RBTree.new { "e" }
630
+ assert_equal("e", rbtree.first)
631
+ end
632
+
633
+ def test_last
634
+ assert_equal(["d", "D"], @rbtree.last)
635
+
636
+ rbtree = RBTree.new("e")
637
+ assert_equal("e", rbtree.last)
638
+
639
+ rbtree = RBTree.new { "e" }
640
+ assert_equal("e", rbtree.last)
641
+ end
642
+
643
+ def test_readjust
644
+ assert_equal(nil, @rbtree.cmp_proc)
645
+
646
+ @rbtree.readjust {|a, b| b <=> a }
647
+ assert_equal(%w(d c b a), @rbtree.keys)
648
+ assert_not_equal(nil, @rbtree.cmp_proc)
649
+
650
+ proc = Proc.new {|a,b| a.to_s <=> b.to_s }
651
+ @rbtree.readjust(proc)
652
+ assert_equal(%w(a b c d), @rbtree.keys)
653
+ assert_equal(proc, @rbtree.cmp_proc)
654
+
655
+ @rbtree[0] = nil
656
+ assert_raises(ArgumentError) { @rbtree.readjust(nil) }
657
+ assert_equal(5, @rbtree.size)
658
+ assert_equal(proc, @rbtree.cmp_proc)
659
+
660
+ @rbtree.delete(0)
661
+ @rbtree.readjust(nil)
662
+ assert_raises(ArgumentError) { @rbtree[0] = nil }
663
+
664
+
665
+ rbtree = RBTree.new
666
+ key = ["a"]
667
+ rbtree[key] = nil
668
+ rbtree[["e"]] = nil
669
+ key[0] = "f"
670
+
671
+ assert_equal([["f"], ["e"]], rbtree.keys)
672
+ rbtree.readjust
673
+ assert_equal([["e"], ["f"]], rbtree.keys)
674
+
675
+ assert_raises(ArgumentError) { @rbtree.readjust { "e" } }
676
+ assert_raises(TypeError) { @rbtree.readjust("e") }
677
+ assert_raises(ArgumentError) {
678
+ @rbtree.readjust(proc) {|a,b| a <=> b }
679
+ }
680
+ assert_raises(ArgumentError) { @rbtree.readjust(proc, proc) }
681
+ end
682
+
683
+ def test_replace
684
+ rbtree = RBTree.new { "e" }
685
+ rbtree.readjust {|a, b| a <=> b}
686
+ rbtree["a"] = "A"
687
+ rbtree["e"] = "E"
688
+
689
+ @rbtree.replace(rbtree)
690
+ assert_equal(%w(a A e E), @rbtree.to_a.flatten)
691
+ assert_equal(rbtree.default, @rbtree.default)
692
+ assert_equal(rbtree.cmp_proc, @rbtree.cmp_proc)
693
+
694
+ assert_raises(TypeError) { @rbtree.replace("e") }
695
+ end
696
+
697
+ def test_reverse_each
698
+ ret = []
699
+ @rbtree.reverse_each { |key, val| ret.push([key, val]) }
700
+ assert_equal(%w(d D c C b B a A), ret.flatten)
701
+
702
+ if defined?(Enumerable::Enumerator)
703
+ enumerator = @rbtree.reverse_each
704
+ assert_equal(%w(d D c C b B a A), enumerator.map.flatten)
705
+ end
706
+ end
707
+
708
+ def test_marshal
709
+ assert_equal(@rbtree, Marshal.load(Marshal.dump(@rbtree)))
710
+
711
+ @rbtree.default = "e"
712
+ assert_equal(@rbtree, Marshal.load(Marshal.dump(@rbtree)))
713
+
714
+ assert_raises(TypeError) {
715
+ Marshal.dump(RBTree.new { "e" })
716
+ }
717
+
718
+ assert_raises(TypeError) {
719
+ @rbtree.readjust {|a, b| a <=> b}
720
+ Marshal.dump(@rbtree)
721
+ }
722
+ end
723
+
724
+ begin
725
+ require "pp"
726
+
727
+ def test_pp
728
+ assert_equal(%(#<RBTree: {}, default=nil, cmp_proc=nil>\n),
729
+ PP.pp(RBTree.new, ""))
730
+ assert_equal(%(#<RBTree: {"a"=>"A", "b"=>"B"}, default=nil, cmp_proc=nil>\n),
731
+ PP.pp(RBTree[*%w(a A b B)], ""))
732
+
733
+ rbtree = RBTree[*("a".."z").to_a]
734
+ rbtree.default = "a"
735
+ rbtree.readjust {|a, b| a <=> b }
736
+ expected = <<EOS
737
+ #<RBTree: {"a"=>"b",
738
+ "c"=>"d",
739
+ "e"=>"f",
740
+ "g"=>"h",
741
+ "i"=>"j",
742
+ "k"=>"l",
743
+ "m"=>"n",
744
+ "o"=>"p",
745
+ "q"=>"r",
746
+ "s"=>"t",
747
+ "u"=>"v",
748
+ "w"=>"x",
749
+ "y"=>"z"},
750
+ default="a",
751
+ cmp_proc=#{rbtree.cmp_proc}>
752
+ EOS
753
+ assert_equal(expected, PP.pp(rbtree, ""))
754
+
755
+ rbtree = RBTree.new
756
+ rbtree[rbtree] = rbtree
757
+ rbtree.default = rbtree
758
+ expected = <<EOS
759
+ #<RBTree: {"#<RBTree: ...>"=>"#<RBTree: ...>"},
760
+ default="#<RBTree: ...>",
761
+ cmp_proc=nil>
762
+ EOS
763
+ assert_equal(expected, PP.pp(rbtree, ""))
764
+ end
765
+ rescue LoadError
766
+ end
767
+ end
768
+
769
+
770
+ class MultiRBTreeTest < Test::Unit::TestCase
771
+ def setup
772
+ @rbtree = MultiRBTree[*%w(a A b B b C b D c C)]
773
+ end
774
+
775
+ def test_create
776
+ assert_equal(%w(a A b B b C b D c C), @rbtree.to_a.flatten)
777
+
778
+ assert_equal(MultiRBTree[*%w(a A)], MultiRBTree[RBTree[*%w(a A)]])
779
+ assert_raises(TypeError) {
780
+ RBTree[MultiRBTree[*%w(a A)]]
781
+ }
782
+ end
783
+
784
+ def test_size
785
+ assert_equal(5, @rbtree.size)
786
+ end
787
+
788
+ def test_clear
789
+ @rbtree.clear
790
+ assert_equal(0, @rbtree.size)
791
+ end
792
+
793
+ def test_empty
794
+ assert_equal(false, @rbtree.empty?)
795
+ @rbtree.clear
796
+ assert_equal(true, @rbtree.empty?)
797
+ end
798
+
799
+ def test_to_a
800
+ assert_equal([%w(a A), %w(b B), %w(b C), %w(b D), %w(c C)],
801
+ @rbtree.to_a)
802
+ end
803
+
804
+ def test_to_s
805
+ if RUBY_VERSION < "1.9"
806
+ assert_equal("aAbBbCbDcC", @rbtree.to_s)
807
+ else
808
+ expected = "[[\"a\", \"A\"], [\"b\", \"B\"], [\"b\", \"C\"], \[\"b\", \"D\"], [\"c\", \"C\"]]"
809
+ assert_equal(expected, @rbtree.to_s)
810
+ end
811
+ end
812
+
813
+ def test_to_hash
814
+ assert_raises(TypeError) {
815
+ @rbtree.to_hash
816
+ }
817
+ end
818
+
819
+ def test_to_rbtree
820
+ assert_equal(@rbtree, @rbtree.to_rbtree)
821
+ end
822
+
823
+ def test_aref
824
+ assert_equal("B", @rbtree["b"])
825
+ end
826
+
827
+ def test_aset
828
+ @rbtree["b"] = "A"
829
+ assert_equal("B", @rbtree["b"])
830
+ assert_equal(%w(a A b B b C b D b A c C), @rbtree.to_a.flatten)
831
+ end
832
+
833
+ def test_equal
834
+ assert_equal(true, MultiRBTree[*%w(a A b B b C b D c C)] == @rbtree)
835
+ assert_equal(true, RBTree[*%w(a A)] == MultiRBTree[*%w(a A)])
836
+ assert_equal(true, MultiRBTree[*%w(a A)] == RBTree[*%w(a A)])
837
+ end
838
+
839
+ def test_replace
840
+ assert_equal(RBTree[*%w(a A)],
841
+ MultiRBTree[*%w(a A)].replace(RBTree[*%w(a A)]))
842
+ assert_raises(TypeError) {
843
+ RBTree[*%w(a A)].replace(MultiRBTree[*%w(a A)])
844
+ }
845
+ end
846
+
847
+ def test_update
848
+ assert_equal(MultiRBTree[*%w(a A b B)],
849
+ MultiRBTree[*%w(a A)].update(RBTree[*%w(b B)]))
850
+ assert_raises(TypeError) {
851
+ RBTree[*%w(a A)].update(MultiRBTree[*%w(b B)])
852
+ }
853
+ end
854
+
855
+ def test_clone
856
+ assert_equal(@rbtree, @rbtree.clone)
857
+ end
858
+
859
+ def test_each
860
+ ret = []
861
+ @rbtree.each {|k, v|
862
+ ret << k << v
863
+ }
864
+ assert_equal(%w(a A b B b C b D c C), ret)
865
+ end
866
+
867
+ def test_delete
868
+ @rbtree.delete("b")
869
+ assert_equal(4, @rbtree.size)
870
+ assert_equal(%w(a A b C b D c C), @rbtree.to_a.flatten)
871
+
872
+ @rbtree.delete("b")
873
+ assert_equal(3, @rbtree.size)
874
+ assert_equal(%w(a A b D c C), @rbtree.to_a.flatten)
875
+
876
+ @rbtree.delete("b")
877
+ assert_equal(2, @rbtree.size)
878
+ assert_equal(%w(a A c C), @rbtree.to_a.flatten)
879
+ end
880
+
881
+ def test_delete_if
882
+ @rbtree.delete_if {|k, v| k == "b" }
883
+ assert_equal(%w(a A c C), @rbtree.to_a.flatten)
884
+ end
885
+
886
+ def test_inspect
887
+ assert_equal(%(#<MultiRBTree: {"a"=>"A", "b"=>"B", "b"=>"C", "b"=>"D", "c"=>"C"}, default=nil, cmp_proc=nil>),
888
+ @rbtree.inspect)
889
+ end
890
+
891
+ def test_readjust
892
+ @rbtree.readjust {|a, b| b <=> a }
893
+ assert_equal(%w(c C b B b C b D a A), @rbtree.to_a.flatten)
894
+ end
895
+
896
+ def test_marshal
897
+ assert_equal(@rbtree, Marshal.load(Marshal.dump(@rbtree)))
898
+ end
899
+
900
+ def test_lower_bound
901
+ assert_equal(%w(b B), @rbtree.lower_bound("b"))
902
+ end
903
+
904
+ def test_upper_bound
905
+ assert_equal(%w(b D), @rbtree.upper_bound("b"))
906
+ end
907
+
908
+ def test_bound
909
+ assert_equal(%w(b B b C b D), @rbtree.bound("b").flatten)
910
+ end
911
+
912
+ def test_first
913
+ assert_equal(%w(a A), @rbtree.first)
914
+ end
915
+
916
+ def test_last
917
+ assert_equal(%w(c C), @rbtree.last)
918
+ end
919
+
920
+ def test_shift
921
+ assert_equal(%w(a A), @rbtree.shift)
922
+ assert_equal(4, @rbtree.size)
923
+ assert_equal(nil, @rbtree["a"])
924
+ end
925
+
926
+ def test_pop
927
+ assert_equal(%w(c C), @rbtree.pop)
928
+ assert_equal(4, @rbtree.size)
929
+ assert_equal(nil, @rbtree["c"])
930
+ end
931
+
932
+ def test_has_key
933
+ assert_equal(true, @rbtree.has_key?("b"))
934
+ end
935
+
936
+ def test_has_value
937
+ assert_equal(true, @rbtree.has_value?("B"))
938
+ assert_equal(true, @rbtree.has_value?("C"))
939
+ assert_equal(true, @rbtree.has_value?("D"))
940
+ end
941
+
942
+ def test_select
943
+ assert_equal(%w(b B b C b D), @rbtree.select {|k, v| k == "b"}.flatten)
944
+ assert_equal(%w(b C c C), @rbtree.select {|k, v| v == "C"}.flatten)
945
+ end
946
+
947
+ def test_values_at
948
+ assert_equal(%w(A B), @rbtree.values_at("a", "b"))
949
+ end
950
+
951
+ def test_invert
952
+ assert_equal(MultiRBTree[*%w(A a B b C b C c D b)], @rbtree.invert)
953
+ end
954
+
955
+ def test_keys
956
+ assert_equal(%w(a b b b c), @rbtree.keys)
957
+ end
958
+
959
+ def test_values
960
+ assert_equal(%w(A B C D C), @rbtree.values)
961
+ end
962
+
963
+ def test_index
964
+ assert_equal("b", @rbtree.index("B"))
965
+ assert_equal("b", @rbtree.index("C"))
966
+ assert_equal("b", @rbtree.index("D"))
967
+ end
968
+ end