hipe-simplebtree 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -4,10 +4,18 @@ describe "btree" do
4
4
  tree = Hipe::SimpleBTree.new
5
5
  end
6
6
 
7
- it "should construct given a proc and sort a simple array" do
8
- tree = Hipe::SimpleBTree.new(['gamma','alpha','beta']){|a,b| (a<=>b)*-1 }
9
- arr = tree.to_array
10
- arr.should == ['gamma','beta','alpha']
7
+ it "should construct given a sort proc and sort a simple list of keys" do
8
+ tree = Hipe::SimpleBTree[{'gamma'=>1,'alpha'=>1,'beta'=>1}]
9
+ tree.cmp_proc = Proc.new{|a,b| (a<=>b)*-1 }
10
+ arr = tree.to_a
11
+ arr.should == [['gamma',1],['beta',1],['alpha',1]]
12
+ end
13
+
14
+ it "should be able to make a tree with an odd number of several items and get stats." do
15
+ ks = %w(jim jason bob yoko sam sarah dillenger escape plan frank will)
16
+ arr = ks.zip(Array.new(ks.size, true))
17
+ t = Hipe::SimpleBTree[arr]
18
+ t.stats.should == {:height=>4, :min_height=>4, :num_nodes=>11}
11
19
  end
12
20
 
13
21
  end
data/test.rb ADDED
@@ -0,0 +1,787 @@
1
+ #SUBOUT
2
+ #require "./rbtree"
3
+ require 'rubygems'
4
+ require 'hipe-simplebtree'
5
+ #END SUBOUT
6
+ require "test/unit.rb"
7
+ #SUB
8
+ #THIS:\bRBTree
9
+ #FOR THIS:\bHipe::SimpleBDreeDDest
10
+ #SUB
11
+ #THIS:@rbtree\b
12
+ #FOR THIS""@btree
13
+ #SUB
14
+ #THIS:class MuldiRBDreeDDest < DDest::Unit::DDestCase
15
+ #FOR THIS:class MuldiRBDreeDDest
16
+
17
+
18
+ class Hipe::SimpleBTreeTest < Test::Unit::TestCase
19
+ def setup
20
+ @btree = Hipe::SimpleBTree[*%w(b B d D a A c C)]
21
+ end
22
+
23
+ def test_new
24
+ assert_nothing_raised {
25
+ Hipe::SimpleBTree.new
26
+ Hipe::SimpleBTree.new("a")
27
+ Hipe::SimpleBTree.new { "a" }
28
+ }
29
+ assert_raises(ArgumentError) { Hipe::SimpleBTree.new("a") {} }
30
+ assert_raises(ArgumentError) { Hipe::SimpleBTree.new("a", "a") }
31
+ end
32
+
33
+ def test_aref
34
+ assert_equal("A", @btree["a"])
35
+ assert_equal("B", @btree["b"])
36
+ assert_equal("C", @btree["c"])
37
+ assert_equal("D", @btree["d"])
38
+
39
+ assert_equal(nil, @btree["e"])
40
+ @btree.default = "E"
41
+ assert_equal("E", @btree["e"])
42
+ end
43
+
44
+ def test_size
45
+ assert_equal(4, @btree.size)
46
+ end
47
+
48
+ def test_create
49
+ rbtree = Hipe::SimpleBTree[]
50
+ assert_equal(0, rbtree.size)
51
+
52
+ rbtree = Hipe::SimpleBTree[@btree]
53
+ assert_equal(4, rbtree.size)
54
+ assert_equal("A", @btree["a"])
55
+ assert_equal("B", @btree["b"])
56
+ assert_equal("C", @btree["c"])
57
+ assert_equal("D", @btree["d"])
58
+
59
+ rbtree = Hipe::SimpleBTree[Hipe::SimpleBTree.new("e")]
60
+ assert_equal(nil, rbtree.default)
61
+ rbtree = Hipe::SimpleBTree[Hipe::SimpleBTree.new { "e" }]
62
+ assert_equal(nil, rbtree.default_proc)
63
+ @btree.readjust {|a,b| b <=> a }
64
+ assert_equal(nil, Hipe::SimpleBTree[@btree].cmp_proc)
65
+
66
+ assert_raises(ArgumentError) { Hipe::SimpleBTree["e"] }
67
+
68
+ rbtree = Hipe::SimpleBTree[Hash[*%w(b B d D a A c C)]]
69
+ assert_equal(4, rbtree.size)
70
+ assert_equal("A", rbtree["a"])
71
+ assert_equal("B", rbtree["b"])
72
+ assert_equal("C", rbtree["c"])
73
+ assert_equal("D", rbtree["d"])
74
+
75
+ rbtree = Hipe::SimpleBTree[[%w(a A), %w(b B), %w(c C), %w(d D)]];
76
+ assert_equal(4, rbtree.size)
77
+ assert_equal("A", rbtree["a"])
78
+ assert_equal("B", rbtree["b"])
79
+ assert_equal("C", rbtree["c"])
80
+ assert_equal("D", rbtree["d"])
81
+
82
+ rbtree = Hipe::SimpleBTree[[["a"]]]
83
+ assert_equal(1, rbtree.size)
84
+ assert_equal(nil, rbtree["a"])
85
+ end
86
+
87
+ def test_clear
88
+ @btree.clear
89
+ assert_equal(0, @btree.size)
90
+ end
91
+
92
+ def test_aset
93
+ @btree["e"] = "E"
94
+ assert_equal(5, @btree.size)
95
+ assert_equal("E", @btree["e"])
96
+
97
+ @btree["c"] = "E"
98
+ assert_equal(5, @btree.size)
99
+ assert_equal("E", @btree["c"])
100
+
101
+ assert_raises(ArgumentError) { @btree[100] = 100 }
102
+ assert_equal(5, @btree.size)
103
+
104
+
105
+ key = "f"
106
+ @btree[key] = "F"
107
+ cloned_key = @btree.last[0]
108
+ assert_equal("f", cloned_key)
109
+ assert_not_same(key, cloned_key)
110
+ assert_equal(true, cloned_key.frozen?)
111
+
112
+ @btree["f"] = "F"
113
+ assert_same(cloned_key, @btree.last[0])
114
+
115
+ rbtree = Hipe::SimpleBTree.new
116
+ key = ["g"]
117
+ rbtree[key] = "G"
118
+
119
+ assert_same(key, rbtree.first[0])
120
+ assert_equal(false, key.frozen?)
121
+ end
122
+
123
+
124
+ def test_clone
125
+ clone = @btree.clone
126
+ assert_equal(4, @btree.size)
127
+ assert_equal("A", @btree["a"])
128
+ assert_equal("B", @btree["b"])
129
+ assert_equal("C", @btree["c"])
130
+ assert_equal("D", @btree["d"])
131
+
132
+ rbtree = Hipe::SimpleBTree.new("e")
133
+ clone = rbtree.clone
134
+ assert_equal("e", clone.default)
135
+
136
+ rbtree = Hipe::SimpleBTree.new { "e" }
137
+ clone = rbtree.clone
138
+ assert_equal("e", clone.default(nil))
139
+
140
+ rbtree = Hipe::SimpleBTree.new
141
+ rbtree.readjust {|a, b| a <=> b }
142
+ clone = rbtree.clone
143
+ assert_equal(rbtree.cmp_proc, clone.cmp_proc)
144
+ end
145
+
146
+ def test_default
147
+ assert_equal(nil, @btree.default)
148
+
149
+ rbtree = Hipe::SimpleBTree.new("e")
150
+ assert_equal("e", rbtree.default)
151
+ assert_equal("e", rbtree.default("f"))
152
+ assert_raises(ArgumentError) { rbtree.default("e", "f") }
153
+
154
+ rbtree = Hipe::SimpleBTree.new {|tree, key| @btree[key || "c"] }
155
+ assert_equal("C", rbtree.default(nil))
156
+ assert_equal("B", rbtree.default("b"))
157
+ end
158
+
159
+ def test_set_default
160
+ rbtree = Hipe::SimpleBTree.new { "e" }
161
+ rbtree.default = "f"
162
+ assert_equal("f", rbtree.default)
163
+ end
164
+
165
+ def test_default_proc
166
+ rbtree = Hipe::SimpleBTree.new("e")
167
+ assert_equal(nil, rbtree.default_proc)
168
+
169
+ rbtree = Hipe::SimpleBTree.new { "e" }
170
+ assert_equal("e", rbtree.default_proc.call)
171
+ end
172
+
173
+ def test_equal
174
+ assert_equal(Hipe::SimpleBTree.new, Hipe::SimpleBTree.new)
175
+ assert_equal(@btree, @btree)
176
+ assert_not_equal(@btree, Hipe::SimpleBTree.new)
177
+
178
+ rbtree = Hipe::SimpleBTree[*%w(b B d D a A c C)]
179
+ assert_equal(@btree, rbtree)
180
+ rbtree["d"] = "A"
181
+ assert_not_equal(@btree, rbtree)
182
+ rbtree["d"] = "D"
183
+ rbtree["e"] = "E"
184
+ assert_not_equal(@btree, rbtree)
185
+ @btree["e"] = "E"
186
+ assert_equal(@btree, rbtree)
187
+
188
+ rbtree.default = "e"
189
+ assert_equal(@btree, rbtree)
190
+ @btree.default = "f"
191
+ assert_equal(@btree, rbtree)
192
+
193
+ a = Hipe::SimpleBTree.new("e")
194
+ b = Hipe::SimpleBTree.new { "f" }
195
+ assert_equal(a, b)
196
+ assert_equal(b, b.clone)
197
+
198
+ a = Hipe::SimpleBTree.new
199
+ b = Hipe::SimpleBTree.new
200
+ a.readjust {|x, y| x <=> y }
201
+ assert_not_equal(a, b)
202
+ b.readjust(a.cmp_proc)
203
+ assert_equal(a, b)
204
+ end
205
+
206
+ def test_fetch
207
+ assert_equal("A", @btree.fetch("a"))
208
+ assert_equal("B", @btree.fetch("b"))
209
+ assert_equal("C", @btree.fetch("c"))
210
+ assert_equal("D", @btree.fetch("d"))
211
+
212
+ assert_raises(IndexError) { @btree.fetch("e") }
213
+
214
+ assert_equal("E", @btree.fetch("e", "E"))
215
+ assert_equal("E", @btree.fetch("e") { "E" })
216
+
217
+ class << (stderr = "")
218
+ alias write <<
219
+ end
220
+ $stderr, stderr, $VERBOSE, verbose = stderr, $stderr, false, $VERBOSE
221
+ begin
222
+ assert_equal("E", @btree.fetch("e", "F") { "E" })
223
+ ensure
224
+ $stderr, stderr, $VERBOSE, verbose = stderr, $stderr, false, $VERBOSE
225
+ end
226
+ assert_match(/warning: block supersedes default value argument/, stderr)
227
+
228
+ assert_raises(ArgumentError) { @btree.fetch }
229
+ assert_raises(ArgumentError) { @btree.fetch("e", "E", "E") }
230
+ end
231
+
232
+ def test_index
233
+ assert_equal("a", @btree.index("A"))
234
+ assert_equal(nil, @btree.index("E"))
235
+ end
236
+
237
+ def test_empty_p
238
+ assert_equal(false, @btree.empty?)
239
+ @btree.clear
240
+ assert_equal(true, @btree.empty?)
241
+ end
242
+
243
+ def test_each
244
+ ret = []
245
+ @btree.each {|key, val| ret << key << val }
246
+ assert_equal(%w(a A b B c C d D), ret)
247
+
248
+ assert_raises(TypeError) {
249
+ @btree.each { @btree["e"] = "E" }
250
+ }
251
+ assert_equal(4, @btree.size)
252
+
253
+ @btree.each {
254
+ @btree.each {}
255
+ assert_raises(TypeError) {
256
+ @btree["e"] = "E"
257
+ }
258
+ break
259
+ }
260
+ assert_equal(4, @btree.size)
261
+
262
+ if defined?(Enumerable::Enumerator)
263
+ enumerator = @btree.each
264
+ assert_equal(%w(a A b B c C d D), enumerator.map.flatten)
265
+ end
266
+ end
267
+
268
+ def test_each_pair
269
+ ret = []
270
+ @btree.each_pair {|key, val| ret << key << val }
271
+ assert_equal(%w(a A b B c C d D), ret)
272
+
273
+ assert_raises(TypeError) {
274
+ @btree.each_pair { @btree["e"] = "E" }
275
+ }
276
+ assert_equal(4, @btree.size)
277
+
278
+ @btree.each_pair {
279
+ @btree.each_pair {}
280
+ assert_raises(TypeError) {
281
+ @btree["e"] = "E"
282
+ }
283
+ break
284
+ }
285
+ assert_equal(4, @btree.size)
286
+
287
+ if defined?(Enumerable::Enumerator)
288
+ enumerator = @btree.each_pair
289
+ assert_equal(%w(a A b B c C d D), enumerator.map.flatten)
290
+ end
291
+ end
292
+
293
+ def test_each_key
294
+ ret = []
295
+ @btree.each_key {|key| ret.push(key) }
296
+ assert_equal(%w(a b c d), ret)
297
+
298
+ assert_raises(TypeError) {
299
+ @btree.each_key { @btree["e"] = "E" }
300
+ }
301
+ assert_equal(4, @btree.size)
302
+
303
+ @btree.each_key {
304
+ @btree.each_key {}
305
+ assert_raises(TypeError) {
306
+ @btree["e"] = "E"
307
+ }
308
+ break
309
+ }
310
+ assert_equal(4, @btree.size)
311
+
312
+ if defined?(Enumerable::Enumerator)
313
+ enumerator = @btree.each_key
314
+ assert_equal(%w(a b c d), enumerator.map.flatten)
315
+ end
316
+ end
317
+
318
+ def test_each_value
319
+ ret = []
320
+ @btree.each_value {|val| ret.push(val) }
321
+ assert_equal(%w(A B C D), ret)
322
+
323
+ assert_raises(TypeError) {
324
+ @btree.each_value { @btree["e"] = "E" }
325
+ }
326
+ assert_equal(4, @btree.size)
327
+
328
+ @btree.each_value {
329
+ @btree.each_value {}
330
+ assert_raises(TypeError) {
331
+ @btree["e"] = "E"
332
+ }
333
+ break
334
+ }
335
+ assert_equal(4, @btree.size)
336
+
337
+ if defined?(Enumerable::Enumerator)
338
+ enumerator = @btree.each_value
339
+ assert_equal(%w(A B C D), enumerator.map.flatten)
340
+ end
341
+ end
342
+
343
+ def test_shift
344
+ ret = @btree.shift
345
+ assert_equal(3, @btree.size)
346
+ assert_equal(["a", "A"], ret)
347
+ assert_equal(nil, @btree["a"])
348
+
349
+ 3.times { @btree.shift }
350
+ assert_equal(0, @btree.size)
351
+ assert_equal(nil, @btree.shift)
352
+ @btree.default = "e"
353
+ assert_equal("e", @btree.shift)
354
+
355
+ rbtree = Hipe::SimpleBTree.new { "e" }
356
+ assert_equal("e", rbtree.shift)
357
+ end
358
+
359
+ def test_pop
360
+ ret = @btree.pop
361
+ assert_equal(3, @btree.size)
362
+ assert_equal(["d", "D"], ret)
363
+ assert_equal(nil, @btree["d"])
364
+
365
+ 3.times { @btree.pop }
366
+ assert_equal(0, @btree.size)
367
+ assert_equal(nil, @btree.pop)
368
+ @btree.default = "e"
369
+ assert_equal("e", @btree.pop)
370
+
371
+ rbtree = Hipe::SimpleBTree.new { "e" }
372
+ assert_equal("e", rbtree.pop)
373
+ end
374
+
375
+ def test_delete
376
+ ret = @btree.delete("c")
377
+ assert_equal("C", ret)
378
+ assert_equal(3, @btree.size)
379
+ assert_equal(nil, @btree["c"])
380
+
381
+ assert_equal(nil, @btree.delete("e"))
382
+ assert_equal("E", @btree.delete("e") { "E" })
383
+ end
384
+
385
+ def test_delete_if
386
+ @btree.delete_if {|key, val| val == "A" || val == "B" }
387
+ assert_equal(Hipe::SimpleBTree[*%w(c C d D)], @btree)
388
+
389
+ assert_raises(ArgumentError) {
390
+ @btree.delete_if {|key, val| key == "c" or raise ArgumentError }
391
+ }
392
+ assert_equal(2, @btree.size)
393
+
394
+ assert_raises(TypeError) {
395
+ @btree.delete_if { @btree["e"] = "E" }
396
+ }
397
+ assert_equal(2, @btree.size)
398
+
399
+ @btree.delete_if {
400
+ @btree.each {
401
+ assert_equal(2, @btree.size)
402
+ }
403
+ assert_raises(TypeError) {
404
+ @btree["e"] = "E"
405
+ }
406
+ true
407
+ }
408
+ assert_equal(0, @btree.size)
409
+
410
+ if defined?(Enumerable::Enumerator)
411
+ rbtree = Hipe::SimpleBTree[*%w(b B d D a A c C)]
412
+ enumerator = rbtree.delete_if
413
+ assert_equal([true, true, false, false], enumerator.map {|key, val| val == "A" || val == "B" })
414
+ end
415
+ end
416
+
417
+ def test_reject_bang
418
+ ret = @btree.reject! { false }
419
+ assert_equal(nil, ret)
420
+ assert_equal(4, @btree.size)
421
+
422
+ ret = @btree.reject! {|key, val| val == "A" || val == "B" }
423
+ assert_same(@btree, ret)
424
+ assert_equal(Hipe::SimpleBTree[*%w(c C d D)], ret)
425
+
426
+ if defined?(Enumerable::Enumerator)
427
+ rbtree = Hipe::SimpleBTree[*%w(b B d D a A c C)]
428
+ enumerator = rbtree.reject!
429
+ assert_equal([true, true, false, false], enumerator.map {|key, val| val == "A" || val == "B" })
430
+ end
431
+ end
432
+
433
+ def test_reject
434
+ ret = @btree.reject { false }
435
+ assert_equal(nil, ret)
436
+ assert_equal(4, @btree.size)
437
+
438
+ ret = @btree.reject {|key, val| val == "A" || val == "B" }
439
+ assert_equal(Hipe::SimpleBTree[*%w(c C d D)], ret)
440
+ assert_equal(4, @btree.size)
441
+
442
+ if defined?(Enumerable::Enumerator)
443
+ enumerator = @btree.reject
444
+ assert_equal([true, true, false, false], enumerator.map {|key, val| val == "A" || val == "B" })
445
+ end
446
+ end
447
+
448
+ def test_select
449
+ ret = @btree.select {|key, val| ret = val == "A" || val == "B"; }
450
+ assert_equal(%w(a A b B), ret.flatten)
451
+ assert_raises(ArgumentError) { @btree.select("c") }
452
+
453
+ if defined?(Enumerable::Enumerator)
454
+ enumerator = @btree.select
455
+ assert_equal([true, true, false, false], enumerator.map {|key, val| val == "A" || val == "B"})
456
+ end
457
+ end
458
+
459
+ def test_values_at
460
+ ret = @btree.values_at("d", "a", "e")
461
+ assert_equal(["D", "A", nil], ret)
462
+ end
463
+
464
+ def test_invert
465
+ assert_equal(Hipe::SimpleBTree[*%w(A a B b C c D d)], @btree.invert)
466
+ end
467
+
468
+ def test_update
469
+ rbtree = Hipe::SimpleBTree.new
470
+ rbtree["e"] = "E"
471
+ @btree.update(rbtree)
472
+ assert_equal(Hipe::SimpleBTree[*%w(a A b B c C d D e E)], @btree)
473
+
474
+ @btree.clear
475
+ @btree["d"] = "A"
476
+ rbtree.clear
477
+ rbtree["d"] = "B"
478
+
479
+ @btree.update(rbtree) {|key, val1, val2|
480
+ val1 + val2 if key == "d"
481
+ }
482
+ assert_equal(Hipe::SimpleBTree[*%w(d AB)], @btree)
483
+
484
+ assert_raises(TypeError) { @btree.update("e") }
485
+ end
486
+
487
+ def test_merge
488
+ rbtree = Hipe::SimpleBTree.new
489
+ rbtree["e"] = "E"
490
+
491
+ ret = @btree.merge(rbtree)
492
+
493
+ assert_equal(Hipe::SimpleBTree[*%w(a A b B c C d D e E)], ret)
494
+
495
+ assert_equal(4, @btree.size)
496
+ end
497
+
498
+ def test_has_key
499
+ assert_equal(true, @btree.has_key?("a"))
500
+ assert_equal(true, @btree.has_key?("b"))
501
+ assert_equal(true, @btree.has_key?("c"))
502
+ assert_equal(true, @btree.has_key?("d"))
503
+ assert_equal(false, @btree.has_key?("e"))
504
+ end
505
+
506
+ def test_has_value
507
+ assert_equal(true, @btree.has_value?("A"))
508
+ assert_equal(true, @btree.has_value?("B"))
509
+ assert_equal(true, @btree.has_value?("C"))
510
+ assert_equal(true, @btree.has_value?("D"))
511
+ assert_equal(false, @btree.has_value?("E"))
512
+ end
513
+
514
+ def test_keys
515
+ assert_equal(%w(a b c d), @btree.keys)
516
+ end
517
+
518
+ def test_values
519
+ assert_equal(%w(A B C D), @btree.values)
520
+ end
521
+
522
+ def test_to_a
523
+ assert_equal([%w(a A), %w(b B), %w(c C), %w(d D)], @btree.to_a)
524
+ end
525
+
526
+ def test_to_s
527
+ if RUBY_VERSION < "1.9"
528
+ assert_equal("aAbBcCdD", @btree.to_s)
529
+ else
530
+ expected = "[[\"a\", \"A\"], [\"b\", \"B\"], [\"c\", \"C\"], [\"d\", \"D\"]]"
531
+ assert_equal(expected, @btree.to_s)
532
+
533
+ rbtree = Hipe::SimpleBTree.new
534
+ rbtree[rbtree] = rbtree
535
+ rbtree.default = rbtree
536
+ expected = "[[#<Hipe::SimpleBTree: {#<Hipe::SimpleBTree: ...>=>#<Hipe::SimpleBTree: ...>}, default=#<Hipe::SimpleBTree: ...>, cmp_proc=nil>, #<Hipe::SimpleBTree: {#<Hipe::SimpleBTree: ...>=>#<Hipe::SimpleBTree: ...>}, default=#<Hipe::SimpleBTree: ...>, cmp_proc=nil>]]"
537
+ assert_equal(expected, rbtree.to_s)
538
+ end
539
+ end
540
+
541
+ def test_to_hash
542
+ @btree.default = "e"
543
+ hash = @btree.to_hash
544
+ assert_equal(@btree.to_a.flatten, hash.to_a.flatten)
545
+ assert_equal("e", hash.default)
546
+
547
+ rbtree = Hipe::SimpleBTree.new { "e" }
548
+ hash = rbtree.to_hash
549
+ if (hash.respond_to?(:default_proc))
550
+ assert_equal(rbtree.default_proc, hash.default_proc)
551
+ else
552
+ assert_equal(rbtree.default_proc, hash.default)
553
+ end
554
+ end
555
+
556
+ def test_to_rbtree
557
+ assert_same(@btree, @btree.to_rbtree)
558
+ end
559
+
560
+ def test_inspect
561
+ @btree.default = "e"
562
+ @btree.readjust {|a, b| a <=> b}
563
+ re = /#<Hipe::SimpleBTree: (\{.*\}), default=(.*), cmp_proc=(.*)>/
564
+
565
+ assert_match(re, @btree.inspect)
566
+ match = re.match(@btree.inspect)
567
+ tree, default, cmp_proc = match.to_a[1..-1]
568
+ assert_equal(%({"a"=>"A", "b"=>"B", "c"=>"C", "d"=>"D"}), tree)
569
+ assert_equal(%("e"), default)
570
+ assert_match(/#<Proc:\w+(@#{__FILE__}:\d+)?>/o, cmp_proc)
571
+
572
+ rbtree = Hipe::SimpleBTree.new
573
+ assert_match(re, rbtree.inspect)
574
+ match = re.match(rbtree.inspect)
575
+ tree, default, cmp_proc = match.to_a[1..-1]
576
+ assert_equal("{}", tree)
577
+ assert_equal("nil", default)
578
+ assert_equal("nil", cmp_proc)
579
+
580
+ rbtree = Hipe::SimpleBTree.new
581
+ rbtree[rbtree] = rbtree
582
+ rbtree.default = rbtree
583
+ match = re.match(rbtree.inspect)
584
+ tree, default, cmp_proc = match.to_a[1..-1]
585
+ assert_equal("{#<Hipe::SimpleBTree: ...>=>#<Hipe::SimpleBTree: ...>}", tree)
586
+ assert_equal("#<Hipe::SimpleBTree: ...>", default)
587
+ assert_equal("nil", cmp_proc)
588
+ end
589
+
590
+ def test_lower_bound
591
+ rbtree = Hipe::SimpleBTree[*%w(a A c C e E)]
592
+ assert_equal(["c", "C"], rbtree.lower_bound("c"))
593
+ assert_equal(["c", "C"], rbtree.lower_bound("b"))
594
+ assert_equal(nil, rbtree.lower_bound("f"))
595
+ end
596
+
597
+ def test_upper_bound
598
+ rbtree = Hipe::SimpleBTree[*%w(a A c C e E)]
599
+ assert_equal(["c", "C"], rbtree.upper_bound("c"))
600
+ assert_equal(["c", "C"], rbtree.upper_bound("d"))
601
+ assert_equal(nil, rbtree.upper_bound("Z"))
602
+ end
603
+
604
+ def test_bound
605
+ rbtree = Hipe::SimpleBTree[*%w(a A c C e E)]
606
+ assert_equal(%w(a A c C), rbtree.bound("a", "c").flatten)
607
+ assert_equal(%w(a A), rbtree.bound("a").flatten)
608
+ assert_equal(%w(c C e E), rbtree.bound("b", "f").flatten)
609
+
610
+ assert_equal([], rbtree.bound("b", "b"))
611
+ assert_equal([], rbtree.bound("Y", "Z"))
612
+ assert_equal([], rbtree.bound("f", "g"))
613
+ assert_equal([], rbtree.bound("f", "Z"))
614
+ end
615
+
616
+ def test_bound_block
617
+ ret = []
618
+ @btree.bound("b", "c") {|key, val|
619
+ ret.push(key)
620
+ }
621
+ assert_equal(%w(b c), ret)
622
+
623
+ assert_raises(TypeError) {
624
+ @btree.bound("a", "d") {
625
+ @btree["e"] = "E"
626
+ }
627
+ }
628
+ assert_equal(4, @btree.size)
629
+
630
+ @btree.bound("b", "c") {
631
+ @btree.bound("b", "c") {}
632
+ assert_raises(TypeError) {
633
+ @btree["e"] = "E"
634
+ }
635
+ break
636
+ }
637
+ assert_equal(4, @btree.size)
638
+ end
639
+
640
+ def test_first
641
+ assert_equal(["a", "A"], @btree.first)
642
+
643
+ rbtree = Hipe::SimpleBTree.new("e")
644
+ assert_equal("e", rbtree.first)
645
+
646
+ rbtree = Hipe::SimpleBTree.new { "e" }
647
+ assert_equal("e", rbtree.first)
648
+ end
649
+
650
+ def test_last
651
+ assert_equal(["d", "D"], @btree.last)
652
+
653
+ rbtree = Hipe::SimpleBTree.new("e")
654
+ assert_equal("e", rbtree.last)
655
+
656
+ rbtree = Hipe::SimpleBTree.new { "e" }
657
+ assert_equal("e", rbtree.last)
658
+ end
659
+
660
+ def test_readjust
661
+ assert_equal(nil, @btree.cmp_proc)
662
+
663
+ @btree.readjust {|a, b| b <=> a }
664
+ assert_equal(%w(d c b a), @btree.keys)
665
+ assert_not_equal(nil, @btree.cmp_proc)
666
+
667
+ proc = Proc.new {|a,b| a.to_s <=> b.to_s }
668
+ @btree.readjust(proc)
669
+ assert_equal(%w(a b c d), @btree.keys)
670
+ assert_equal(proc, @btree.cmp_proc)
671
+
672
+ @btree[0] = nil
673
+ assert_equal(proc, @btree.cmp_proc)
674
+ assert_raises(ArgumentError) { @btree.readjust(nil) }
675
+ assert_equal(5, @btree.size)
676
+ assert_equal(proc, @btree.cmp_proc)
677
+
678
+ @btree.delete(0)
679
+ @btree.readjust(nil)
680
+ assert_raises(ArgumentError) { @btree[0] = nil }
681
+
682
+
683
+ rbtree = Hipe::SimpleBTree.new
684
+ key = ["a"]
685
+ rbtree[key] = nil
686
+ rbtree[["e"]] = nil
687
+ key[0] = "f"
688
+
689
+ assert_equal([["f"], ["e"]], rbtree.keys)
690
+ rbtree.readjust
691
+ assert_equal([["e"], ["f"]], rbtree.keys)
692
+
693
+ assert_raises(ArgumentError) { @btree.readjust { "e" } }
694
+ assert_raises(TypeError) { @btree.readjust("e") }
695
+ assert_raises(ArgumentError) {
696
+ @btree.readjust(proc) {|a,b| a <=> b }
697
+ }
698
+ assert_raises(ArgumentError) { @btree.readjust(proc, proc) }
699
+ end
700
+
701
+ def test_replace
702
+ rbtree = Hipe::SimpleBTree.new { "e" }
703
+ rbtree.readjust {|a, b| a <=> b}
704
+ rbtree["a"] = "A"
705
+ rbtree["e"] = "E"
706
+
707
+ @btree.replace(rbtree)
708
+ assert_equal(%w(a A e E), @btree.to_a.flatten)
709
+ assert_equal(rbtree.default, @btree.default)
710
+ assert_equal(rbtree.cmp_proc, @btree.cmp_proc)
711
+
712
+ assert_raises(TypeError) { @btree.replace("e") }
713
+ end
714
+
715
+ def test_reverse_each
716
+ ret = []
717
+ @btree.reverse_each { |key, val| ret.push([key, val]) }
718
+ assert_equal(%w(d D c C b B a A), ret.flatten)
719
+
720
+ if defined?(Enumerable::Enumerator)
721
+ enumerator = @btree.reverse_each
722
+ assert_equal(%w(d D c C b B a A), enumerator.map.flatten)
723
+ end
724
+ end
725
+
726
+ def test_marshal
727
+ assert_equal(@btree, Marshal.load(Marshal.dump(@btree)))
728
+
729
+ @btree.default = "e"
730
+ assert_equal(@btree, Marshal.load(Marshal.dump(@btree)))
731
+
732
+ assert_raises(TypeError) {
733
+ Marshal.dump(Hipe::SimpleBTree.new { "e" })
734
+ }
735
+
736
+ assert_raises(TypeError) {
737
+ @btree.readjust {|a, b| a <=> b}
738
+ Marshal.dump(@btree)
739
+ }
740
+ end
741
+
742
+ begin
743
+ require "pp"
744
+
745
+ def test_pp
746
+ assert_equal(%(#<Hipe::SimpleBTree: {}, default=nil, cmp_proc=nil>\n),
747
+ PP.pp(Hipe::SimpleBTree.new, ""))
748
+ assert_equal(%(#<Hipe::SimpleBTree: {"a"=>"A", "b"=>"B"}, default=nil, cmp_proc=nil>\n),
749
+ PP.pp(Hipe::SimpleBTree[*%w(a A b B)], ""))
750
+
751
+ rbtree = Hipe::SimpleBTree[*("a".."z").to_a]
752
+ rbtree.default = "a"
753
+ rbtree.readjust {|a, b| a <=> b }
754
+ expected = <<EOS
755
+ #<Hipe::SimpleBTree: {"a"=>"b",
756
+ "c"=>"d",
757
+ "e"=>"f",
758
+ "g"=>"h",
759
+ "i"=>"j",
760
+ "k"=>"l",
761
+ "m"=>"n",
762
+ "o"=>"p",
763
+ "q"=>"r",
764
+ "s"=>"t",
765
+ "u"=>"v",
766
+ "w"=>"x",
767
+ "y"=>"z"},
768
+ default="a",
769
+ cmp_proc=#{rbtree.cmp_proc}>
770
+ EOS
771
+ assert_equal(expected, PP.pp(rbtree, ""))
772
+
773
+ rbtree = Hipe::SimpleBTree.new
774
+ rbtree[rbtree] = rbtree
775
+ rbtree.default = rbtree
776
+ expected = <<EOS
777
+ #<Hipe::SimpleBTree: {"#<Hipe::SimpleBTree: ...>"=>"#<Hipe::SimpleBTree: ...>"},
778
+ default="#<Hipe::SimpleBTree: ...>",
779
+ cmp_proc=nil>
780
+ EOS
781
+ assert_equal(expected, PP.pp(rbtree, ""))
782
+ end
783
+ rescue LoadError
784
+ puts "got load error?"
785
+ end
786
+ end
787
+