rbtree 0.2.1 → 0.4.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.
Files changed (11) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +1 -1
  3. data/MANIFEST +0 -1
  4. data/README +36 -72
  5. data/dict.c +364 -83
  6. data/dict.h +30 -6
  7. data/extconf.rb +11 -5
  8. data/rbtree.c +796 -470
  9. data/test.rb +313 -157
  10. metadata +42 -45
  11. data/ChangeLog +0 -483
data/test.rb CHANGED
@@ -1,4 +1,9 @@
1
- require "rbtree"
1
+ begin
2
+ require "./rbtree"
3
+ rescue LoadError
4
+ require "rubygems"
5
+ require "rbtree"
6
+ end
2
7
  require "test/unit.rb"
3
8
 
4
9
  class RBTreeTest < Test::Unit::TestCase
@@ -6,6 +11,10 @@ class RBTreeTest < Test::Unit::TestCase
6
11
  @rbtree = RBTree[*%w(b B d D a A c C)]
7
12
  end
8
13
 
14
+ def have_enumerator?
15
+ defined?(Enumerable::Enumerator) or defined?(Enumerator)
16
+ end
17
+
9
18
  def test_new
10
19
  assert_nothing_raised {
11
20
  RBTree.new
@@ -14,6 +23,18 @@ class RBTreeTest < Test::Unit::TestCase
14
23
  }
15
24
  assert_raises(ArgumentError) { RBTree.new("a") {} }
16
25
  assert_raises(ArgumentError) { RBTree.new("a", "a") }
26
+
27
+ if RUBY_VERSION >= "1.9.2"
28
+ assert_nothing_raised {
29
+ RBTree.new(&lambda {|a, b|})
30
+ RBTree.new(&lambda {|*a|})
31
+ RBTree.new(&lambda {|a, *b|})
32
+ RBTree.new(&lambda {|a, b, *c|})
33
+ }
34
+ assert_raises(TypeError) { RBTree.new(&lambda {|a|}) }
35
+ assert_raises(TypeError) { RBTree.new(&lambda {|a, b, c|}) }
36
+ assert_raises(TypeError) { RBTree.new(&lambda {|a, b, c, *d|}) }
37
+ end
17
38
  end
18
39
 
19
40
  def test_aref
@@ -65,9 +86,13 @@ class RBTreeTest < Test::Unit::TestCase
65
86
  assert_equal("C", rbtree["c"])
66
87
  assert_equal("D", rbtree["d"])
67
88
 
89
+ # assert_raises(ArgumentError) { RBTree[["a"]] }
90
+
68
91
  rbtree = RBTree[[["a"]]]
69
92
  assert_equal(1, rbtree.size)
70
93
  assert_equal(nil, rbtree["a"])
94
+
95
+ # assert_raises(ArgumentError) { RBTree[[["a", "A", "b", "B"]]] }
71
96
  end
72
97
 
73
98
  def test_clear
@@ -128,14 +153,13 @@ class RBTreeTest < Test::Unit::TestCase
128
153
  end
129
154
 
130
155
  def test_default
131
- assert_equal(nil, @rbtree.default)
132
-
133
156
  rbtree = RBTree.new("e")
134
157
  assert_equal("e", rbtree.default)
135
158
  assert_equal("e", rbtree.default("f"))
136
159
  assert_raises(ArgumentError) { rbtree.default("e", "f") }
137
160
 
138
- rbtree = RBTree.new {|rbtree, key| @rbtree[key || "c"] }
161
+ rbtree = RBTree.new {|tree, key| @rbtree[key || "c"] }
162
+ assert_equal(nil, rbtree.default)
139
163
  assert_equal("C", rbtree.default(nil))
140
164
  assert_equal("B", rbtree.default("b"))
141
165
  end
@@ -144,14 +168,51 @@ class RBTreeTest < Test::Unit::TestCase
144
168
  rbtree = RBTree.new { "e" }
145
169
  rbtree.default = "f"
146
170
  assert_equal("f", rbtree.default)
171
+ assert_equal(nil, rbtree.default_proc)
172
+
173
+ rbtree = RBTree.new { "e" }
174
+ rbtree.default = nil
175
+ assert_equal(nil, rbtree.default)
176
+ assert_equal(nil, rbtree.default_proc)
147
177
  end
148
178
 
149
179
  def test_default_proc
150
180
  rbtree = RBTree.new("e")
151
181
  assert_equal(nil, rbtree.default_proc)
152
182
 
153
- rbtree = RBTree.new { "e" }
154
- assert_equal("e", rbtree.default_proc.call)
183
+ rbtree = RBTree.new { "f" }
184
+ assert_equal("f", rbtree.default_proc.call)
185
+ end
186
+
187
+ def test_set_default_proc
188
+ rbtree = RBTree.new("e")
189
+ rbtree.default_proc = Proc.new { "f" }
190
+ assert_equal(nil, rbtree.default)
191
+ assert_equal("f", rbtree.default_proc.call)
192
+
193
+ rbtree = RBTree.new("e")
194
+ rbtree.default_proc = nil
195
+ assert_equal(nil, rbtree.default)
196
+ assert_equal(nil, rbtree.default_proc)
197
+
198
+ if Symbol.method_defined?(:to_proc)
199
+ @rbtree.default_proc = :upper_bound
200
+ assert_equal(%w(d D), @rbtree["e"])
201
+ end
202
+
203
+ assert_raises(TypeError) { rbtree.default_proc = "f" }
204
+
205
+ if RUBY_VERSION >= "1.9.2"
206
+ assert_nothing_raised {
207
+ @rbtree.default_proc = lambda {|a, b|}
208
+ @rbtree.default_proc = lambda {|*a|}
209
+ @rbtree.default_proc = lambda {|a, *b|}
210
+ @rbtree.default_proc = lambda {|a, b, *c|}
211
+ }
212
+ assert_raises(TypeError) { @rbtree.default_proc = lambda {|a|} }
213
+ assert_raises(TypeError) { @rbtree.default_proc = lambda {|a, b, c|} }
214
+ assert_raises(TypeError) { @rbtree.default_proc = lambda {|a, b, c, *d|} }
215
+ end
155
216
  end
156
217
 
157
218
  def test_equal
@@ -181,10 +242,18 @@ class RBTreeTest < Test::Unit::TestCase
181
242
 
182
243
  a = RBTree.new
183
244
  b = RBTree.new
184
- a.readjust {|a, b| a <=> b }
245
+ a.readjust {|x, y| x <=> y }
185
246
  assert_not_equal(a, b)
186
247
  b.readjust(a.cmp_proc)
187
248
  assert_equal(a, b)
249
+
250
+ if RUBY_VERSION >= "1.8.7"
251
+ a = RBTree.new
252
+ a[1] = a
253
+ b = RBTree.new
254
+ b[1] = b
255
+ assert_equal(a, b)
256
+ end
188
257
  end
189
258
 
190
259
  def test_fetch
@@ -197,15 +266,15 @@ class RBTreeTest < Test::Unit::TestCase
197
266
 
198
267
  assert_equal("E", @rbtree.fetch("e", "E"))
199
268
  assert_equal("E", @rbtree.fetch("e") { "E" })
200
- assert_equal("E", @rbtree.fetch("e", "F") { "E" })
269
+ # assert_equal("E", @rbtree.fetch("e", "F") { "E" })
201
270
 
202
271
  assert_raises(ArgumentError) { @rbtree.fetch }
203
272
  assert_raises(ArgumentError) { @rbtree.fetch("e", "E", "E") }
204
273
  end
205
274
 
206
- def test_index
207
- assert_equal("a", @rbtree.index("A"))
208
- assert_equal(nil, @rbtree.index("E"))
275
+ def test_key
276
+ assert_equal("a", @rbtree.key("A"))
277
+ assert_equal(nil, @rbtree.key("E"))
209
278
  end
210
279
 
211
280
  def test_empty_p
@@ -215,9 +284,9 @@ class RBTreeTest < Test::Unit::TestCase
215
284
  end
216
285
 
217
286
  def test_each
218
- ret = []
219
- @rbtree.each {|key, val| ret << key << val }
220
- assert_equal(%w(a A b B c C d D), ret)
287
+ result = []
288
+ @rbtree.each {|key, val| result << key << val }
289
+ assert_equal(%w(a A b B c C d D), result)
221
290
 
222
291
  assert_raises(TypeError) {
223
292
  @rbtree.each { @rbtree["e"] = "E" }
@@ -233,41 +302,16 @@ class RBTreeTest < Test::Unit::TestCase
233
302
  }
234
303
  assert_equal(4, @rbtree.size)
235
304
 
236
- if defined?(Enumerable::Enumerator)
305
+ if have_enumerator?
237
306
  enumerator = @rbtree.each
238
- assert_equal(%w(a A b B c C d D), enumerator.map.flatten)
239
- end
240
- end
241
-
242
- def test_each_pair
243
- ret = []
244
- @rbtree.each_pair {|key, val| ret << key << val }
245
- assert_equal(%w(a A b B c C d D), ret)
246
-
247
- assert_raises(TypeError) {
248
- @rbtree.each_pair { @rbtree["e"] = "E" }
249
- }
250
- assert_equal(4, @rbtree.size)
251
-
252
- @rbtree.each_pair {
253
- @rbtree.each_pair {}
254
- assert_raises(TypeError) {
255
- @rbtree["e"] = "E"
256
- }
257
- break
258
- }
259
- assert_equal(4, @rbtree.size)
260
-
261
- if defined?(Enumerable::Enumerator)
262
- enumerator = @rbtree.each_pair
263
- assert_equal(%w(a A b B c C d D), enumerator.map.flatten)
307
+ assert_equal(%w(a A b B c C d D), enumerator.to_a.flatten)
264
308
  end
265
309
  end
266
310
 
267
311
  def test_each_key
268
- ret = []
269
- @rbtree.each_key {|key| ret.push(key) }
270
- assert_equal(%w(a b c d), ret)
312
+ result = []
313
+ @rbtree.each_key {|key| result.push(key) }
314
+ assert_equal(%w(a b c d), result)
271
315
 
272
316
  assert_raises(TypeError) {
273
317
  @rbtree.each_key { @rbtree["e"] = "E" }
@@ -283,16 +327,16 @@ class RBTreeTest < Test::Unit::TestCase
283
327
  }
284
328
  assert_equal(4, @rbtree.size)
285
329
 
286
- if defined?(Enumerable::Enumerator)
330
+ if have_enumerator?
287
331
  enumerator = @rbtree.each_key
288
- assert_equal(%w(a b c d), enumerator.map.flatten)
332
+ assert_equal(%w(a b c d), enumerator.to_a.flatten)
289
333
  end
290
334
  end
291
335
 
292
336
  def test_each_value
293
- ret = []
294
- @rbtree.each_value {|val| ret.push(val) }
295
- assert_equal(%w(A B C D), ret)
337
+ result = []
338
+ @rbtree.each_value {|val| result.push(val) }
339
+ assert_equal(%w(A B C D), result)
296
340
 
297
341
  assert_raises(TypeError) {
298
342
  @rbtree.each_value { @rbtree["e"] = "E" }
@@ -308,16 +352,16 @@ class RBTreeTest < Test::Unit::TestCase
308
352
  }
309
353
  assert_equal(4, @rbtree.size)
310
354
 
311
- if defined?(Enumerable::Enumerator)
355
+ if have_enumerator?
312
356
  enumerator = @rbtree.each_value
313
- assert_equal(%w(A B C D), enumerator.map.flatten)
357
+ assert_equal(%w(A B C D), enumerator.to_a.flatten)
314
358
  end
315
359
  end
316
360
 
317
361
  def test_shift
318
- ret = @rbtree.shift
362
+ result = @rbtree.shift
319
363
  assert_equal(3, @rbtree.size)
320
- assert_equal(["a", "A"], ret)
364
+ assert_equal(%w(a A), result)
321
365
  assert_equal(nil, @rbtree["a"])
322
366
 
323
367
  3.times { @rbtree.shift }
@@ -331,9 +375,9 @@ class RBTreeTest < Test::Unit::TestCase
331
375
  end
332
376
 
333
377
  def test_pop
334
- ret = @rbtree.pop
378
+ result = @rbtree.pop
335
379
  assert_equal(3, @rbtree.size)
336
- assert_equal(["d", "D"], ret)
380
+ assert_equal(%w(d D), result)
337
381
  assert_equal(nil, @rbtree["d"])
338
382
 
339
383
  3.times { @rbtree.pop }
@@ -347,8 +391,8 @@ class RBTreeTest < Test::Unit::TestCase
347
391
  end
348
392
 
349
393
  def test_delete
350
- ret = @rbtree.delete("c")
351
- assert_equal("C", ret)
394
+ result = @rbtree.delete("c")
395
+ assert_equal("C", result)
352
396
  assert_equal(3, @rbtree.size)
353
397
  assert_equal(nil, @rbtree["c"])
354
398
 
@@ -357,7 +401,8 @@ class RBTreeTest < Test::Unit::TestCase
357
401
  end
358
402
 
359
403
  def test_delete_if
360
- @rbtree.delete_if {|key, val| val == "A" || val == "B" }
404
+ result = @rbtree.delete_if {|key, val| val == "A" || val == "B" }
405
+ assert_same(@rbtree, result)
361
406
  assert_equal(RBTree[*%w(c C d D)], @rbtree)
362
407
 
363
408
  assert_raises(ArgumentError) {
@@ -381,58 +426,90 @@ class RBTreeTest < Test::Unit::TestCase
381
426
  }
382
427
  assert_equal(0, @rbtree.size)
383
428
 
384
- if defined?(Enumerable::Enumerator)
429
+ if have_enumerator?
385
430
  rbtree = RBTree[*%w(b B d D a A c C)]
386
- enumerator = rbtree.delete_if
387
- assert_equal([true, true, false, false], enumerator.map {|key, val| val == "A" || val == "B" })
431
+ rbtree.delete_if.with_index {|(key, val), i| i < 2 }
432
+ assert_equal(RBTree[*%w(c C d D)], rbtree)
433
+ end
434
+ end
435
+
436
+ def test_keep_if
437
+ result = @rbtree.keep_if {|key, val| val == "A" || val == "B" }
438
+ assert_same(@rbtree, result)
439
+ assert_equal(RBTree[*%w(a A b B)], @rbtree)
440
+
441
+ if have_enumerator?
442
+ rbtree = RBTree[*%w(b B d D a A c C)]
443
+ rbtree.keep_if.with_index {|(key, val), i| i < 2 }
444
+ assert_equal(RBTree[*%w(a A b B)], rbtree)
388
445
  end
389
446
  end
390
447
 
391
448
  def test_reject_bang
392
- ret = @rbtree.reject! { false }
393
- assert_equal(nil, ret)
449
+ result = @rbtree.reject! { false }
450
+ assert_equal(nil, result)
394
451
  assert_equal(4, @rbtree.size)
395
452
 
396
- ret = @rbtree.reject! {|key, val| val == "A" || val == "B" }
397
- assert_same(@rbtree, ret)
398
- assert_equal(RBTree[*%w(c C d D)], ret)
453
+ result = @rbtree.reject! {|key, val| val == "A" || val == "B" }
454
+ assert_same(@rbtree, result)
455
+ assert_equal(RBTree[*%w(c C d D)], result)
399
456
 
400
- if defined?(Enumerable::Enumerator)
457
+ if have_enumerator?
401
458
  rbtree = RBTree[*%w(b B d D a A c C)]
402
- enumerator = rbtree.reject!
403
- assert_equal([true, true, false, false], enumerator.map {|key, val| val == "A" || val == "B" })
459
+ rbtree.reject!.with_index {|(key, val), i| i < 2 }
460
+ assert_equal(RBTree[*%w(c C d D)], rbtree)
404
461
  end
405
462
  end
406
463
 
407
464
  def test_reject
408
- ret = @rbtree.reject { false }
409
- assert_equal(nil, ret)
465
+ result = @rbtree.reject { false }
466
+ assert_equal(RBTree[*%w(a A b B c C d D)], result)
410
467
  assert_equal(4, @rbtree.size)
411
468
 
412
- ret = @rbtree.reject {|key, val| val == "A" || val == "B" }
413
- assert_equal(RBTree[*%w(c C d D)], ret)
469
+ result = @rbtree.reject {|key, val| val == "A" || val == "B" }
470
+ assert_equal(RBTree[*%w(c C d D)], result)
414
471
  assert_equal(4, @rbtree.size)
415
472
 
416
- if defined?(Enumerable::Enumerator)
417
- enumerator = @rbtree.reject
418
- assert_equal([true, true, false, false], enumerator.map {|key, val| val == "A" || val == "B" })
473
+ if have_enumerator?
474
+ result = @rbtree.reject.with_index {|(key, val), i| i < 2 }
475
+ assert_equal(RBTree[*%w(c C d D)], result)
419
476
  end
420
477
  end
421
-
478
+
479
+ def test_select_bang
480
+ result = @rbtree.select! { true }
481
+ assert_equal(nil, result)
482
+ assert_equal(4, @rbtree.size)
483
+
484
+ result = @rbtree.select! {|key, val| val == "A" || val == "B" }
485
+ assert_same(@rbtree, result)
486
+ assert_equal(RBTree[*%w(a A b B)], result)
487
+
488
+ if have_enumerator?
489
+ rbtree = RBTree[*%w(b B d D a A c C)]
490
+ rbtree.select!.with_index {|(key, val), i| i < 2 }
491
+ assert_equal(RBTree[*%w(a A b B)], rbtree)
492
+ end
493
+ end
494
+
422
495
  def test_select
423
- ret = @rbtree.select {|key, val| val == "A" || val == "B" }
424
- assert_equal(%w(a A b B), ret.flatten)
496
+ result = @rbtree.select { true }
497
+ assert_equal(RBTree[*%w(a A b B c C d D)], result)
498
+ assert_equal(4, @rbtree.size)
499
+
500
+ result = @rbtree.select {|key, val| val == "A" || val == "B" }
501
+ assert_equal(RBTree[*%w(a A b B)], result)
425
502
  assert_raises(ArgumentError) { @rbtree.select("c") }
426
503
 
427
- if defined?(Enumerable::Enumerator)
428
- enumerator = @rbtree.select
429
- assert_equal([true, true, false, false], enumerator.map {|key, val| val == "A" || val == "B"})
504
+ if have_enumerator?
505
+ result = @rbtree.select.with_index {|(key, val), i| i < 2 }
506
+ assert_equal(RBTree[*%w(a A b B)], result)
430
507
  end
431
508
  end
432
509
 
433
510
  def test_values_at
434
- ret = @rbtree.values_at("d", "a", "e")
435
- assert_equal(["D", "A", nil], ret)
511
+ result = @rbtree.values_at("d", "a", "e")
512
+ assert_equal(["D", "A", nil], result)
436
513
  end
437
514
 
438
515
  def test_invert
@@ -462,12 +539,29 @@ class RBTreeTest < Test::Unit::TestCase
462
539
  rbtree = RBTree.new
463
540
  rbtree["e"] = "E"
464
541
 
465
- ret = @rbtree.merge(rbtree)
466
- assert_equal(RBTree[*%w(a A b B c C d D e E)], ret)
542
+ result = @rbtree.merge(rbtree)
543
+ assert_equal(RBTree[*%w(a A b B c C d D e E)], result)
467
544
 
468
545
  assert_equal(4, @rbtree.size)
469
546
  end
470
-
547
+
548
+ if MultiRBTree.method_defined?(:flatten)
549
+ def test_flatten
550
+ rbtree = RBTree.new
551
+ rbtree.readjust {|a, b| a.flatten <=> b.flatten }
552
+ rbtree[["a"]] = ["A"]
553
+ rbtree[[["b"]]] = [["B"]]
554
+ assert_equal([["a"], ["A"], [["b"]], [["B"]]], rbtree.flatten)
555
+ assert_equal([["a"], ["A"], [["b"]], [["B"]]], rbtree.flatten(0))
556
+ assert_equal([["a"], ["A"], [["b"]], [["B"]]], rbtree.flatten(1))
557
+ assert_equal(["a", "A", ["b"], ["B"]], rbtree.flatten(2))
558
+ assert_equal(["a", "A", "b", "B"], rbtree.flatten(3))
559
+
560
+ assert_raises(TypeError) { @rbtree.flatten("e") }
561
+ assert_raises(ArgumentError) { @rbtree.flatten(1, 2) }
562
+ end
563
+ end
564
+
471
565
  def test_has_key
472
566
  assert_equal(true, @rbtree.has_key?("a"))
473
567
  assert_equal(true, @rbtree.has_key?("b"))
@@ -496,14 +590,10 @@ class RBTreeTest < Test::Unit::TestCase
496
590
  assert_equal([%w(a A), %w(b B), %w(c C), %w(d D)], @rbtree.to_a)
497
591
  end
498
592
 
499
- def test_to_s
500
- assert_equal("aAbBcCdD", @rbtree.to_s)
501
- end
502
-
503
593
  def test_to_hash
504
594
  @rbtree.default = "e"
505
595
  hash = @rbtree.to_hash
506
- assert_equal(@rbtree.to_a.flatten, hash.to_a.flatten)
596
+ assert_equal(@rbtree.to_a.flatten, hash.sort_by {|key, val| key}.flatten)
507
597
  assert_equal("e", hash.default)
508
598
 
509
599
  rbtree = RBTree.new { "e" }
@@ -520,64 +610,82 @@ class RBTreeTest < Test::Unit::TestCase
520
610
  end
521
611
 
522
612
  def test_inspect
523
- @rbtree.default = "e"
524
- @rbtree.readjust {|a, b| a <=> b}
525
- re = /#<RBTree: (\{.*\}), default=(.*), cmp_proc=(.*)>/
526
-
527
- assert_match(re, @rbtree.inspect)
528
- match = re.match(@rbtree.inspect)
529
- tree, default, cmp_proc = match.to_a[1..-1]
530
- assert_equal(%({"a"=>"A", "b"=>"B", "c"=>"C", "d"=>"D"}), tree)
531
- assert_equal(%("e"), default)
532
- assert_match(/#<Proc:\w+(@test.rb:\d+)?>/, cmp_proc)
533
-
534
- rbtree = RBTree.new
535
- assert_match(re, rbtree.inspect)
536
- match = re.match(rbtree.inspect)
537
- tree, default, cmp_proc = match.to_a[1..-1]
538
- assert_equal("{}", tree)
539
- assert_equal("nil", default)
540
- assert_equal("nil", cmp_proc)
541
-
542
- rbtree = RBTree.new
543
- rbtree["e"] = rbtree
544
- assert_match(re, rbtree.inspect)
545
- match = re.match(rbtree.inspect)
546
- assert_equal(%({"e"=>#<RBTree: ...>}), match[1])
613
+ [:to_s, :inspect].each do |method|
614
+ @rbtree.default = "e"
615
+ @rbtree.readjust {|a, b| a <=> b}
616
+ re = /#<RBTree: (\{.*\}), default=(.*), cmp_proc=(.*)>/
617
+
618
+ assert_match(re, @rbtree.send(method))
619
+ match = re.match(@rbtree.send(method))
620
+ tree, default, cmp_proc = match.to_a[1..-1]
621
+ assert_equal(%({"a"=>"A", "b"=>"B", "c"=>"C", "d"=>"D"}), tree)
622
+ assert_equal(%("e"), default)
623
+ assert_match(/#<Proc:\w+([@ ]#{__FILE__}:\d+)?>/o, cmp_proc)
624
+
625
+ rbtree = RBTree.new
626
+ assert_match(re, rbtree.send(method))
627
+ match = re.match(rbtree.send(method))
628
+ tree, default, cmp_proc = match.to_a[1..-1]
629
+ assert_equal("{}", tree)
630
+ assert_equal("nil", default)
631
+ assert_equal("nil", cmp_proc)
632
+
633
+ next if method == :to_s and RUBY_VERSION < "1.9"
634
+
635
+ rbtree = RBTree.new
636
+ rbtree[rbtree] = rbtree
637
+ rbtree.default = rbtree
638
+ match = re.match(rbtree.send(method))
639
+ tree, default, cmp_proc = match.to_a[1..-1]
640
+ assert_equal("{#<RBTree: ...>=>#<RBTree: ...>}", tree)
641
+ assert_equal("#<RBTree: ...>", default)
642
+ assert_equal("nil", cmp_proc)
643
+ end
547
644
  end
548
645
 
549
646
  def test_lower_bound
550
647
  rbtree = RBTree[*%w(a A c C e E)]
551
- assert_equal(["c", "C"], rbtree.lower_bound("c"))
552
- assert_equal(["c", "C"], rbtree.lower_bound("b"))
648
+ assert_equal(%w(c C), rbtree.lower_bound("c"))
649
+ assert_equal(%w(c C), rbtree.lower_bound("b"))
553
650
  assert_equal(nil, rbtree.lower_bound("f"))
554
651
  end
555
652
 
556
653
  def test_upper_bound
557
654
  rbtree = RBTree[*%w(a A c C e E)]
558
- assert_equal(["c", "C"], rbtree.upper_bound("c"))
559
- assert_equal(["c", "C"], rbtree.upper_bound("d"))
655
+ assert_equal(%w(c C), rbtree.upper_bound("c"))
656
+ assert_equal(%w(c C), rbtree.upper_bound("d"))
560
657
  assert_equal(nil, rbtree.upper_bound("Z"))
561
658
  end
562
659
 
563
660
  def test_bound
564
661
  rbtree = RBTree[*%w(a A c C e E)]
565
- assert_equal(%w(a A c C), rbtree.bound("a", "c").flatten)
566
- assert_equal(%w(a A), rbtree.bound("a").flatten)
567
- assert_equal(%w(c C e E), rbtree.bound("b", "f").flatten)
662
+ assert_equal(%w(a A c C), rbtree.bound("a", "c").to_a.flatten)
663
+ assert_equal(%w(a A), rbtree.bound("a").to_a.flatten)
664
+ assert_equal(%w(c C e E), rbtree.bound("b", "f").to_a.flatten)
568
665
 
569
- assert_equal([], rbtree.bound("b", "b"))
570
- assert_equal([], rbtree.bound("Y", "Z"))
571
- assert_equal([], rbtree.bound("f", "g"))
572
- assert_equal([], rbtree.bound("f", "Z"))
666
+ assert_equal([], rbtree.bound("b", "b").to_a)
667
+ assert_equal([], rbtree.bound("Y", "Z").to_a)
668
+ assert_equal([], rbtree.bound("f", "g").to_a)
669
+ assert_equal([], rbtree.bound("f", "Z").to_a)
670
+
671
+ if defined?(Enumerator) and Enumerator.method_defined?(:size)
672
+ assert_equal(2, rbtree.bound("a", "c").size)
673
+ assert_equal(1, rbtree.bound("a").size)
674
+ assert_equal(2, rbtree.bound("b", "f").size)
675
+
676
+ assert_equal(0, rbtree.bound("b", "b").size)
677
+ assert_equal(0, rbtree.bound("Y", "Z").size)
678
+ assert_equal(0, rbtree.bound("f", "g").size)
679
+ assert_equal(0, rbtree.bound("f", "Z").size)
680
+ end
573
681
  end
574
682
 
575
683
  def test_bound_block
576
- ret = []
684
+ result = []
577
685
  @rbtree.bound("b", "c") {|key, val|
578
- ret.push(key)
686
+ result.push(key)
579
687
  }
580
- assert_equal(%w(b c), ret)
688
+ assert_equal(%w(b c), result)
581
689
 
582
690
  assert_raises(TypeError) {
583
691
  @rbtree.bound("a", "d") {
@@ -597,7 +705,7 @@ class RBTreeTest < Test::Unit::TestCase
597
705
  end
598
706
 
599
707
  def test_first
600
- assert_equal(["a", "A"], @rbtree.first)
708
+ assert_equal(%w(a A), @rbtree.first)
601
709
 
602
710
  rbtree = RBTree.new("e")
603
711
  assert_equal("e", rbtree.first)
@@ -607,7 +715,7 @@ class RBTreeTest < Test::Unit::TestCase
607
715
  end
608
716
 
609
717
  def test_last
610
- assert_equal(["d", "D"], @rbtree.last)
718
+ assert_equal(%w(d D), @rbtree.last)
611
719
 
612
720
  rbtree = RBTree.new("e")
613
721
  assert_equal("e", rbtree.last)
@@ -637,7 +745,33 @@ class RBTreeTest < Test::Unit::TestCase
637
745
  @rbtree.readjust(nil)
638
746
  assert_raises(ArgumentError) { @rbtree[0] = nil }
639
747
 
748
+ if Symbol.method_defined?(:to_proc)
749
+ rbtree = RBTree[*%w(a A B b)]
750
+ assert_equal(%w(B b a A), rbtree.to_a.flatten)
751
+ rbtree.readjust(:casecmp)
752
+ assert_equal(%w(a A B b), rbtree.to_a.flatten)
753
+ end
640
754
 
755
+ if RUBY_VERSION >= "1.9.2"
756
+ assert_nothing_raised {
757
+ @rbtree.readjust(lambda {|a, b| a <=> b })
758
+ @rbtree.readjust(lambda {|*a| a[0] <=> a[1] })
759
+ @rbtree.readjust(lambda {|a, *b| a <=> b[0] })
760
+ @rbtree.readjust(lambda {|a, b, *c| a <=> b })
761
+ @rbtree.readjust(&lambda {|a, b| a <=> b })
762
+ @rbtree.readjust(&lambda {|*a| a[0] <=> a[1] })
763
+ @rbtree.readjust(&lambda {|a, *b| a <=> b[0] })
764
+ @rbtree.readjust(&lambda {|a, b, *c| a <=> b })
765
+ }
766
+ assert_raises(TypeError) { @rbtree.readjust(lambda {|a| 1 }) }
767
+ assert_raises(TypeError) { @rbtree.readjust(lambda {|a, b, c| 1 }) }
768
+ assert_raises(TypeError) { @rbtree.readjust(lambda {|a, b, c, *d| 1 }) }
769
+ assert_raises(TypeError) { @rbtree.readjust(&lambda {|a| 1 }) }
770
+ assert_raises(TypeError) { @rbtree.readjust(&lambda {|a, b, c| 1 }) }
771
+ assert_raises(TypeError) { @rbtree.readjust(&lambda {|a, b, c, *d| 1 }) }
772
+ end
773
+
774
+
641
775
  rbtree = RBTree.new
642
776
  key = ["a"]
643
777
  rbtree[key] = nil
@@ -648,12 +782,22 @@ class RBTreeTest < Test::Unit::TestCase
648
782
  rbtree.readjust
649
783
  assert_equal([["e"], ["f"]], rbtree.keys)
650
784
 
651
- assert_raises(ArgumentError) { @rbtree.readjust { "e" } }
652
785
  assert_raises(TypeError) { @rbtree.readjust("e") }
653
786
  assert_raises(ArgumentError) {
654
787
  @rbtree.readjust(proc) {|a,b| a <=> b }
655
788
  }
656
789
  assert_raises(ArgumentError) { @rbtree.readjust(proc, proc) }
790
+
791
+
792
+ rbtree = RBTree[("a".."z").to_a.zip(("A".."Z").to_a)]
793
+ assert_nothing_raised do
794
+ rbtree.readjust do |a, b|
795
+ ObjectSpace.each_object(RBTree) do |temp|
796
+ temp.clear if temp.size == rbtree.size - 1
797
+ end
798
+ a <=> b
799
+ end
800
+ end
657
801
  end
658
802
 
659
803
  def test_replace
@@ -671,13 +815,13 @@ class RBTreeTest < Test::Unit::TestCase
671
815
  end
672
816
 
673
817
  def test_reverse_each
674
- ret = []
675
- @rbtree.reverse_each { |key, val| ret.push([key, val]) }
676
- assert_equal(%w(d D c C b B a A), ret.flatten)
818
+ result = []
819
+ @rbtree.reverse_each { |key, val| result.push([key, val]) }
820
+ assert_equal(%w(d D c C b B a A), result.flatten)
677
821
 
678
- if defined?(Enumerable::Enumerator)
822
+ if have_enumerator?
679
823
  enumerator = @rbtree.reverse_each
680
- assert_equal(%w(d D c C b B a A), enumerator.map.flatten)
824
+ assert_equal(%w(d D c C b B a A), enumerator.to_a.flatten)
681
825
  end
682
826
  end
683
827
 
@@ -696,13 +840,23 @@ class RBTreeTest < Test::Unit::TestCase
696
840
  Marshal.dump(@rbtree)
697
841
  }
698
842
  end
843
+
844
+ def test_modify_in_cmp_proc
845
+ can_clear = false
846
+ @rbtree.readjust do |a, b|
847
+ @rbtree.clear if can_clear
848
+ a <=> b
849
+ end
850
+ can_clear = true
851
+ assert_raises(TypeError) { @rbtree["e"] }
852
+ end
699
853
 
700
854
  begin
701
855
  require "pp"
702
856
 
703
857
  def test_pp
704
858
  assert_equal(%(#<RBTree: {}, default=nil, cmp_proc=nil>\n),
705
- PP.pp(RBTree[], ""))
859
+ PP.pp(RBTree.new, ""))
706
860
  assert_equal(%(#<RBTree: {"a"=>"A", "b"=>"B"}, default=nil, cmp_proc=nil>\n),
707
861
  PP.pp(RBTree[*%w(a A b B)], ""))
708
862
 
@@ -728,7 +882,7 @@ class RBTreeTest < Test::Unit::TestCase
728
882
  EOS
729
883
  assert_equal(expected, PP.pp(rbtree, ""))
730
884
 
731
- rbtree = RBTree[]
885
+ rbtree = RBTree.new
732
886
  rbtree[rbtree] = rbtree
733
887
  rbtree.default = rbtree
734
888
  expected = <<EOS
@@ -776,10 +930,6 @@ class MultiRBTreeTest < Test::Unit::TestCase
776
930
  assert_equal([%w(a A), %w(b B), %w(b C), %w(b D), %w(c C)],
777
931
  @rbtree.to_a)
778
932
  end
779
-
780
- def test_to_s
781
- assert_equal("aAbBbCbDcC", @rbtree.to_s)
782
- end
783
933
 
784
934
  def test_to_hash
785
935
  assert_raises(TypeError) {
@@ -828,11 +978,11 @@ class MultiRBTreeTest < Test::Unit::TestCase
828
978
  end
829
979
 
830
980
  def test_each
831
- ret = []
981
+ result = []
832
982
  @rbtree.each {|k, v|
833
- ret << k << v
983
+ result << k << v
834
984
  }
835
- assert_equal(%w(a A b B b C b D c C), ret)
985
+ assert_equal(%w(a A b B b C b D c C), result)
836
986
  end
837
987
 
838
988
  def test_delete
@@ -854,6 +1004,17 @@ class MultiRBTreeTest < Test::Unit::TestCase
854
1004
  assert_equal(%w(a A c C), @rbtree.to_a.flatten)
855
1005
  end
856
1006
 
1007
+ def test_keep_if
1008
+ @rbtree.keep_if {|k, v| k != "b" }
1009
+ assert_equal(%w(a A c C), @rbtree.to_a.flatten)
1010
+ end
1011
+
1012
+ if MultiRBTree.method_defined?(:flatten)
1013
+ def test_flatten
1014
+ assert_equal(%w(a A b B b C b D c C), @rbtree.flatten)
1015
+ end
1016
+ end
1017
+
857
1018
  def test_inspect
858
1019
  assert_equal(%(#<MultiRBTree: {"a"=>"A", "b"=>"B", "b"=>"C", "b"=>"D", "c"=>"C"}, default=nil, cmp_proc=nil>),
859
1020
  @rbtree.inspect)
@@ -877,7 +1038,7 @@ class MultiRBTreeTest < Test::Unit::TestCase
877
1038
  end
878
1039
 
879
1040
  def test_bound
880
- assert_equal(%w(b B b C b D), @rbtree.bound("b").flatten)
1041
+ assert_equal(%w(b B b C b D), @rbtree.bound("b").to_a.flatten)
881
1042
  end
882
1043
 
883
1044
  def test_first
@@ -910,11 +1071,6 @@ class MultiRBTreeTest < Test::Unit::TestCase
910
1071
  assert_equal(true, @rbtree.has_value?("D"))
911
1072
  end
912
1073
 
913
- def test_select
914
- assert_equal(%w(b B b C b D), @rbtree.select {|k, v| k == "b"}.flatten)
915
- assert_equal(%w(b C c C), @rbtree.select {|k, v| v == "C"}.flatten)
916
- end
917
-
918
1074
  def test_values_at
919
1075
  assert_equal(%w(A B), @rbtree.values_at("a", "b"))
920
1076
  end
@@ -931,9 +1087,9 @@ class MultiRBTreeTest < Test::Unit::TestCase
931
1087
  assert_equal(%w(A B C D C), @rbtree.values)
932
1088
  end
933
1089
 
934
- def test_index
935
- assert_equal("b", @rbtree.index("B"))
936
- assert_equal("b", @rbtree.index("C"))
937
- assert_equal("b", @rbtree.index("D"))
1090
+ def test_key
1091
+ assert_equal("b", @rbtree.key("B"))
1092
+ assert_equal("b", @rbtree.key("C"))
1093
+ assert_equal("b", @rbtree.key("D"))
938
1094
  end
939
1095
  end