rbtree 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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