rbtree2 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,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