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