rbtree 0.2.0 → 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (11) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +1 -1
  3. data/MANIFEST +0 -1
  4. data/README +52 -57
  5. data/dict.c +364 -83
  6. data/dict.h +30 -6
  7. data/extconf.rb +12 -29
  8. data/rbtree.c +824 -519
  9. data/test.rb +393 -193
  10. metadata +52 -45
  11. data/ChangeLog +0 -425
data/test.rb CHANGED
@@ -1,29 +1,40 @@
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
1
+ begin
2
+ require "./rbtree"
3
+ rescue LoadError
4
+ require "rubygems"
5
+ require "rbtree"
12
6
  end
7
+ require "test/unit.rb"
13
8
 
14
9
  class RBTreeTest < Test::Unit::TestCase
15
10
  def setup
16
11
  @rbtree = RBTree[*%w(b B d D a A c C)]
17
12
  end
18
13
 
14
+ def have_enumerator?
15
+ defined?(Enumerable::Enumerator) or defined?(Enumerator)
16
+ end
17
+
19
18
  def test_new
20
19
  assert_nothing_raised {
21
20
  RBTree.new
22
21
  RBTree.new("a")
23
22
  RBTree.new { "a" }
24
23
  }
25
- assert_raise(ArgumentError) { RBTree.new("a") {} }
26
- assert_raise(ArgumentError) { RBTree.new("a", "a") }
24
+ assert_raises(ArgumentError) { RBTree.new("a") {} }
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
27
38
  end
28
39
 
29
40
  def test_aref
@@ -59,14 +70,29 @@ class RBTreeTest < Test::Unit::TestCase
59
70
  @rbtree.readjust {|a,b| b <=> a }
60
71
  assert_equal(nil, RBTree[@rbtree].cmp_proc)
61
72
 
62
- assert_raise(ArgumentError) { RBTree["e"] }
73
+ assert_raises(ArgumentError) { RBTree["e"] }
63
74
 
64
75
  rbtree = RBTree[Hash[*%w(b B d D a A c C)]]
65
76
  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"])
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 = RBTree[[%w(a A), %w(b B), %w(c C), %w(d D)]];
83
+ assert_equal(4, rbtree.size)
84
+ assert_equal("A", rbtree["a"])
85
+ assert_equal("B", rbtree["b"])
86
+ assert_equal("C", rbtree["c"])
87
+ assert_equal("D", rbtree["d"])
88
+
89
+ # assert_raises(ArgumentError) { RBTree[["a"]] }
90
+
91
+ rbtree = RBTree[[["a"]]]
92
+ assert_equal(1, rbtree.size)
93
+ assert_equal(nil, rbtree["a"])
94
+
95
+ # assert_raises(ArgumentError) { RBTree[[["a", "A", "b", "B"]]] }
70
96
  end
71
97
 
72
98
  def test_clear
@@ -83,10 +109,8 @@ class RBTreeTest < Test::Unit::TestCase
83
109
  assert_equal(5, @rbtree.size)
84
110
  assert_equal("E", @rbtree["c"])
85
111
 
86
- if VERSION >= "1.8.0"
87
- assert_raise(ArgumentError) { @rbtree[100] = 100 }
88
- assert_equal(5, @rbtree.size)
89
- end
112
+ assert_raises(ArgumentError) { @rbtree[100] = 100 }
113
+ assert_equal(5, @rbtree.size)
90
114
 
91
115
 
92
116
  key = "f"
@@ -129,14 +153,13 @@ class RBTreeTest < Test::Unit::TestCase
129
153
  end
130
154
 
131
155
  def test_default
132
- assert_equal(nil, @rbtree.default)
133
-
134
156
  rbtree = RBTree.new("e")
135
157
  assert_equal("e", rbtree.default)
136
158
  assert_equal("e", rbtree.default("f"))
137
- assert_raise(ArgumentError) { rbtree.default("e", "f") }
159
+ assert_raises(ArgumentError) { rbtree.default("e", "f") }
138
160
 
139
- rbtree = RBTree.new {|rbtree, key| @rbtree[key || "c"] }
161
+ rbtree = RBTree.new {|tree, key| @rbtree[key || "c"] }
162
+ assert_equal(nil, rbtree.default)
140
163
  assert_equal("C", rbtree.default(nil))
141
164
  assert_equal("B", rbtree.default("b"))
142
165
  end
@@ -145,14 +168,51 @@ class RBTreeTest < Test::Unit::TestCase
145
168
  rbtree = RBTree.new { "e" }
146
169
  rbtree.default = "f"
147
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)
148
177
  end
149
178
 
150
179
  def test_default_proc
151
180
  rbtree = RBTree.new("e")
152
181
  assert_equal(nil, rbtree.default_proc)
153
182
 
154
- rbtree = RBTree.new { "e" }
155
- 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
156
216
  end
157
217
 
158
218
  def test_equal
@@ -182,10 +242,18 @@ class RBTreeTest < Test::Unit::TestCase
182
242
 
183
243
  a = RBTree.new
184
244
  b = RBTree.new
185
- a.readjust {|a, b| a <=> b }
245
+ a.readjust {|x, y| x <=> y }
186
246
  assert_not_equal(a, b)
187
247
  b.readjust(a.cmp_proc)
188
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
189
257
  end
190
258
 
191
259
  def test_fetch
@@ -194,19 +262,19 @@ class RBTreeTest < Test::Unit::TestCase
194
262
  assert_equal("C", @rbtree.fetch("c"))
195
263
  assert_equal("D", @rbtree.fetch("d"))
196
264
 
197
- assert_raise(IndexError) { @rbtree.fetch("e") }
265
+ assert_raises(IndexError) { @rbtree.fetch("e") }
198
266
 
199
267
  assert_equal("E", @rbtree.fetch("e", "E"))
200
268
  assert_equal("E", @rbtree.fetch("e") { "E" })
201
- assert_equal("E", @rbtree.fetch("e", "F") { "E" })
269
+ # assert_equal("E", @rbtree.fetch("e", "F") { "E" })
202
270
 
203
- assert_raise(ArgumentError) { @rbtree.fetch }
204
- assert_raise(ArgumentError) { @rbtree.fetch("e", "E", "E") }
271
+ assert_raises(ArgumentError) { @rbtree.fetch }
272
+ assert_raises(ArgumentError) { @rbtree.fetch("e", "E", "E") }
205
273
  end
206
274
 
207
- def test_index
208
- assert_equal("a", @rbtree.index("A"))
209
- assert_equal(nil, @rbtree.index("E"))
275
+ def test_key
276
+ assert_equal("a", @rbtree.key("A"))
277
+ assert_equal(nil, @rbtree.key("E"))
210
278
  end
211
279
 
212
280
  def test_empty_p
@@ -216,89 +284,84 @@ class RBTreeTest < Test::Unit::TestCase
216
284
  end
217
285
 
218
286
  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)
287
+ result = []
288
+ @rbtree.each {|key, val| result << key << val }
289
+ assert_equal(%w(a A b B c C d D), result)
222
290
 
223
- assert_raise(TypeError) {
291
+ assert_raises(TypeError) {
224
292
  @rbtree.each { @rbtree["e"] = "E" }
225
293
  }
226
294
  assert_equal(4, @rbtree.size)
227
295
 
228
296
  @rbtree.each {
229
297
  @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) {
298
+ assert_raises(TypeError) {
251
299
  @rbtree["e"] = "E"
252
300
  }
253
301
  break
254
302
  }
255
303
  assert_equal(4, @rbtree.size)
304
+
305
+ if have_enumerator?
306
+ enumerator = @rbtree.each
307
+ assert_equal(%w(a A b B c C d D), enumerator.to_a.flatten)
308
+ end
256
309
  end
257
310
 
258
311
  def test_each_key
259
- ret = []
260
- @rbtree.each_key {|val| ret.push(val) }
261
- 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)
262
315
 
263
- assert_raise(TypeError) {
316
+ assert_raises(TypeError) {
264
317
  @rbtree.each_key { @rbtree["e"] = "E" }
265
318
  }
266
319
  assert_equal(4, @rbtree.size)
267
320
 
268
321
  @rbtree.each_key {
269
322
  @rbtree.each_key {}
270
- assert_raise(TypeError) {
323
+ assert_raises(TypeError) {
271
324
  @rbtree["e"] = "E"
272
325
  }
273
326
  break
274
327
  }
275
328
  assert_equal(4, @rbtree.size)
329
+
330
+ if have_enumerator?
331
+ enumerator = @rbtree.each_key
332
+ assert_equal(%w(a b c d), enumerator.to_a.flatten)
333
+ end
276
334
  end
277
335
 
278
336
  def test_each_value
279
- ret = []
280
- @rbtree.each_value {|key| ret.push(key) }
281
- 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)
282
340
 
283
- assert_raise(TypeError) {
341
+ assert_raises(TypeError) {
284
342
  @rbtree.each_value { @rbtree["e"] = "E" }
285
343
  }
286
344
  assert_equal(4, @rbtree.size)
287
345
 
288
346
  @rbtree.each_value {
289
347
  @rbtree.each_value {}
290
- assert_raise(TypeError) {
348
+ assert_raises(TypeError) {
291
349
  @rbtree["e"] = "E"
292
350
  }
293
351
  break
294
352
  }
295
353
  assert_equal(4, @rbtree.size)
354
+
355
+ if have_enumerator?
356
+ enumerator = @rbtree.each_value
357
+ assert_equal(%w(A B C D), enumerator.to_a.flatten)
358
+ end
296
359
  end
297
360
 
298
361
  def test_shift
299
- ret = @rbtree.shift
362
+ result = @rbtree.shift
300
363
  assert_equal(3, @rbtree.size)
301
- assert_equal(["a", "A"], ret)
364
+ assert_equal(%w(a A), result)
302
365
  assert_equal(nil, @rbtree["a"])
303
366
 
304
367
  3.times { @rbtree.shift }
@@ -312,9 +375,9 @@ class RBTreeTest < Test::Unit::TestCase
312
375
  end
313
376
 
314
377
  def test_pop
315
- ret = @rbtree.pop
378
+ result = @rbtree.pop
316
379
  assert_equal(3, @rbtree.size)
317
- assert_equal(["d", "D"], ret)
380
+ assert_equal(%w(d D), result)
318
381
  assert_equal(nil, @rbtree["d"])
319
382
 
320
383
  3.times { @rbtree.pop }
@@ -328,8 +391,8 @@ class RBTreeTest < Test::Unit::TestCase
328
391
  end
329
392
 
330
393
  def test_delete
331
- ret = @rbtree.delete("c")
332
- assert_equal("C", ret)
394
+ result = @rbtree.delete("c")
395
+ assert_equal("C", result)
333
396
  assert_equal(3, @rbtree.size)
334
397
  assert_equal(nil, @rbtree["c"])
335
398
 
@@ -338,15 +401,16 @@ class RBTreeTest < Test::Unit::TestCase
338
401
  end
339
402
 
340
403
  def test_delete_if
341
- @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)
342
406
  assert_equal(RBTree[*%w(c C d D)], @rbtree)
343
407
 
344
- assert_raise(ArgumentError) {
408
+ assert_raises(ArgumentError) {
345
409
  @rbtree.delete_if {|key, val| key == "c" or raise ArgumentError }
346
410
  }
347
411
  assert_equal(2, @rbtree.size)
348
412
 
349
- assert_raise(TypeError) {
413
+ assert_raises(TypeError) {
350
414
  @rbtree.delete_if { @rbtree["e"] = "E" }
351
415
  }
352
416
  assert_equal(2, @rbtree.size)
@@ -355,43 +419,97 @@ class RBTreeTest < Test::Unit::TestCase
355
419
  @rbtree.each {
356
420
  assert_equal(2, @rbtree.size)
357
421
  }
358
- assert_raise(TypeError) {
422
+ assert_raises(TypeError) {
359
423
  @rbtree["e"] = "E"
360
424
  }
361
425
  true
362
426
  }
363
427
  assert_equal(0, @rbtree.size)
428
+
429
+ if have_enumerator?
430
+ rbtree = RBTree[*%w(b B d D a A c C)]
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)
445
+ end
364
446
  end
365
447
 
366
448
  def test_reject_bang
367
- ret = @rbtree.reject! { false }
368
- assert_equal(nil, ret)
449
+ result = @rbtree.reject! { false }
450
+ assert_equal(nil, result)
369
451
  assert_equal(4, @rbtree.size)
370
452
 
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)
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)
456
+
457
+ if have_enumerator?
458
+ rbtree = RBTree[*%w(b B d D a A c C)]
459
+ rbtree.reject!.with_index {|(key, val), i| i < 2 }
460
+ assert_equal(RBTree[*%w(c C d D)], rbtree)
461
+ end
374
462
  end
375
-
463
+
376
464
  def test_reject
377
- ret = @rbtree.reject { false }
378
- assert_equal(nil, ret)
465
+ result = @rbtree.reject { false }
466
+ assert_equal(RBTree[*%w(a A b B c C d D)], result)
379
467
  assert_equal(4, @rbtree.size)
380
468
 
381
- ret = @rbtree.reject {|key, val| val == "A" || val == "B" }
382
- 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)
383
471
  assert_equal(4, @rbtree.size)
472
+
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)
476
+ end
384
477
  end
385
-
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
+
386
495
  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") }
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)
502
+ assert_raises(ArgumentError) { @rbtree.select("c") }
503
+
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)
507
+ end
390
508
  end
391
509
 
392
510
  def test_values_at
393
- ret = @rbtree.values_at("d", "a", "e")
394
- assert_equal(["D", "A", nil], ret)
511
+ result = @rbtree.values_at("d", "a", "e")
512
+ assert_equal(["D", "A", nil], result)
395
513
  end
396
514
 
397
515
  def test_invert
@@ -414,19 +532,36 @@ class RBTreeTest < Test::Unit::TestCase
414
532
  }
415
533
  assert_equal(RBTree[*%w(d AB)], @rbtree)
416
534
 
417
- assert_raise(TypeError) { @rbtree.update("e") }
535
+ assert_raises(TypeError) { @rbtree.update("e") }
418
536
  end
419
537
 
420
538
  def test_merge
421
539
  rbtree = RBTree.new
422
540
  rbtree["e"] = "E"
423
541
 
424
- ret = @rbtree.merge(rbtree)
425
- 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)
426
544
 
427
545
  assert_equal(4, @rbtree.size)
428
546
  end
429
-
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
+
430
565
  def test_has_key
431
566
  assert_equal(true, @rbtree.has_key?("a"))
432
567
  assert_equal(true, @rbtree.has_key?("b"))
@@ -455,14 +590,10 @@ class RBTreeTest < Test::Unit::TestCase
455
590
  assert_equal([%w(a A), %w(b B), %w(c C), %w(d D)], @rbtree.to_a)
456
591
  end
457
592
 
458
- def test_to_s
459
- assert_equal("aAbBcCdD", @rbtree.to_s)
460
- end
461
-
462
593
  def test_to_hash
463
594
  @rbtree.default = "e"
464
595
  hash = @rbtree.to_hash
465
- assert_equal(@rbtree.to_a.flatten, hash.to_a.flatten)
596
+ assert_equal(@rbtree.to_a.flatten, hash.sort_by {|key, val| key}.flatten)
466
597
  assert_equal("e", hash.default)
467
598
 
468
599
  rbtree = RBTree.new { "e" }
@@ -479,66 +610,84 @@ class RBTreeTest < Test::Unit::TestCase
479
610
  end
480
611
 
481
612
  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])
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
506
644
  end
507
645
 
508
646
  def test_lower_bound
509
647
  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"))
648
+ assert_equal(%w(c C), rbtree.lower_bound("c"))
649
+ assert_equal(%w(c C), rbtree.lower_bound("b"))
512
650
  assert_equal(nil, rbtree.lower_bound("f"))
513
651
  end
514
652
 
515
653
  def test_upper_bound
516
654
  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"))
655
+ assert_equal(%w(c C), rbtree.upper_bound("c"))
656
+ assert_equal(%w(c C), rbtree.upper_bound("d"))
519
657
  assert_equal(nil, rbtree.upper_bound("Z"))
520
658
  end
521
659
 
522
660
  def test_bound
523
661
  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"))
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)
665
+
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
532
681
  end
533
682
 
534
683
  def test_bound_block
535
- ret = []
684
+ result = []
536
685
  @rbtree.bound("b", "c") {|key, val|
537
- ret.push(key)
686
+ result.push(key)
538
687
  }
539
- assert_equal(%w(b c), ret)
688
+ assert_equal(%w(b c), result)
540
689
 
541
- assert_raise(TypeError) {
690
+ assert_raises(TypeError) {
542
691
  @rbtree.bound("a", "d") {
543
692
  @rbtree["e"] = "E"
544
693
  }
@@ -547,7 +696,7 @@ class RBTreeTest < Test::Unit::TestCase
547
696
 
548
697
  @rbtree.bound("b", "c") {
549
698
  @rbtree.bound("b", "c") {}
550
- assert_raise(TypeError) {
699
+ assert_raises(TypeError) {
551
700
  @rbtree["e"] = "E"
552
701
  }
553
702
  break
@@ -556,7 +705,7 @@ class RBTreeTest < Test::Unit::TestCase
556
705
  end
557
706
 
558
707
  def test_first
559
- assert_equal(["a", "A"], @rbtree.first)
708
+ assert_equal(%w(a A), @rbtree.first)
560
709
 
561
710
  rbtree = RBTree.new("e")
562
711
  assert_equal("e", rbtree.first)
@@ -566,7 +715,7 @@ class RBTreeTest < Test::Unit::TestCase
566
715
  end
567
716
 
568
717
  def test_last
569
- assert_equal(["d", "D"], @rbtree.last)
718
+ assert_equal(%w(d D), @rbtree.last)
570
719
 
571
720
  rbtree = RBTree.new("e")
572
721
  assert_equal("e", rbtree.last)
@@ -588,17 +737,41 @@ class RBTreeTest < Test::Unit::TestCase
588
737
  assert_equal(proc, @rbtree.cmp_proc)
589
738
 
590
739
  @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
740
+ assert_raises(ArgumentError) { @rbtree.readjust(nil) }
741
+ assert_equal(5, @rbtree.size)
742
+ assert_equal(proc, @rbtree.cmp_proc)
743
+
744
+ @rbtree.delete(0)
745
+ @rbtree.readjust(nil)
746
+ assert_raises(ArgumentError) { @rbtree[0] = nil }
600
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
601
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
+
602
775
  rbtree = RBTree.new
603
776
  key = ["a"]
604
777
  rbtree[key] = nil
@@ -609,14 +782,22 @@ class RBTreeTest < Test::Unit::TestCase
609
782
  rbtree.readjust
610
783
  assert_equal([["e"], ["f"]], rbtree.keys)
611
784
 
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) {
785
+ assert_raises(TypeError) { @rbtree.readjust("e") }
786
+ assert_raises(ArgumentError) {
617
787
  @rbtree.readjust(proc) {|a,b| a <=> b }
618
788
  }
619
- assert_raise(ArgumentError) { @rbtree.readjust(proc, proc) }
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
620
801
  end
621
802
 
622
803
  def test_replace
@@ -630,13 +811,18 @@ class RBTreeTest < Test::Unit::TestCase
630
811
  assert_equal(rbtree.default, @rbtree.default)
631
812
  assert_equal(rbtree.cmp_proc, @rbtree.cmp_proc)
632
813
 
633
- assert_raise(TypeError) { @rbtree.replace("e") }
814
+ assert_raises(TypeError) { @rbtree.replace("e") }
634
815
  end
635
816
 
636
817
  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)
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)
821
+
822
+ if have_enumerator?
823
+ enumerator = @rbtree.reverse_each
824
+ assert_equal(%w(d D c C b B a A), enumerator.to_a.flatten)
825
+ end
640
826
  end
641
827
 
642
828
  def test_marshal
@@ -645,22 +831,32 @@ class RBTreeTest < Test::Unit::TestCase
645
831
  @rbtree.default = "e"
646
832
  assert_equal(@rbtree, Marshal.load(Marshal.dump(@rbtree)))
647
833
 
648
- assert_raise(TypeError) {
834
+ assert_raises(TypeError) {
649
835
  Marshal.dump(RBTree.new { "e" })
650
836
  }
651
837
 
652
- assert_raise(TypeError) {
838
+ assert_raises(TypeError) {
653
839
  @rbtree.readjust {|a, b| a <=> b}
654
840
  Marshal.dump(@rbtree)
655
841
  }
656
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
657
853
 
658
854
  begin
659
855
  require "pp"
660
856
 
661
857
  def test_pp
662
858
  assert_equal(%(#<RBTree: {}, default=nil, cmp_proc=nil>\n),
663
- PP.pp(RBTree[], ""))
859
+ PP.pp(RBTree.new, ""))
664
860
  assert_equal(%(#<RBTree: {"a"=>"A", "b"=>"B"}, default=nil, cmp_proc=nil>\n),
665
861
  PP.pp(RBTree[*%w(a A b B)], ""))
666
862
 
@@ -686,7 +882,7 @@ class RBTreeTest < Test::Unit::TestCase
686
882
  EOS
687
883
  assert_equal(expected, PP.pp(rbtree, ""))
688
884
 
689
- rbtree = RBTree[]
885
+ rbtree = RBTree.new
690
886
  rbtree[rbtree] = rbtree
691
887
  rbtree.default = rbtree
692
888
  expected = <<EOS
@@ -710,7 +906,7 @@ class MultiRBTreeTest < Test::Unit::TestCase
710
906
  assert_equal(%w(a A b B b C b D c C), @rbtree.to_a.flatten)
711
907
 
712
908
  assert_equal(MultiRBTree[*%w(a A)], MultiRBTree[RBTree[*%w(a A)]])
713
- assert_raise(ArgumentError) {
909
+ assert_raises(TypeError) {
714
910
  RBTree[MultiRBTree[*%w(a A)]]
715
911
  }
716
912
  end
@@ -734,13 +930,11 @@ class MultiRBTreeTest < Test::Unit::TestCase
734
930
  assert_equal([%w(a A), %w(b B), %w(b C), %w(b D), %w(c C)],
735
931
  @rbtree.to_a)
736
932
  end
737
-
738
- def test_to_s
739
- assert_equal("aAbBbCbDcC", @rbtree.to_s)
740
- end
741
933
 
742
934
  def test_to_hash
743
- assert_equal(Hash[*%w(a A b D c C)], @rbtree.to_hash)
935
+ assert_raises(TypeError) {
936
+ @rbtree.to_hash
937
+ }
744
938
  end
745
939
 
746
940
  def test_to_rbtree
@@ -766,7 +960,7 @@ class MultiRBTreeTest < Test::Unit::TestCase
766
960
  def test_replace
767
961
  assert_equal(RBTree[*%w(a A)],
768
962
  MultiRBTree[*%w(a A)].replace(RBTree[*%w(a A)]))
769
- assert_raise(TypeError) {
963
+ assert_raises(TypeError) {
770
964
  RBTree[*%w(a A)].replace(MultiRBTree[*%w(a A)])
771
965
  }
772
966
  end
@@ -774,7 +968,7 @@ class MultiRBTreeTest < Test::Unit::TestCase
774
968
  def test_update
775
969
  assert_equal(MultiRBTree[*%w(a A b B)],
776
970
  MultiRBTree[*%w(a A)].update(RBTree[*%w(b B)]))
777
- assert_raise(TypeError) {
971
+ assert_raises(TypeError) {
778
972
  RBTree[*%w(a A)].update(MultiRBTree[*%w(b B)])
779
973
  }
780
974
  end
@@ -784,11 +978,11 @@ class MultiRBTreeTest < Test::Unit::TestCase
784
978
  end
785
979
 
786
980
  def test_each
787
- ret = []
981
+ result = []
788
982
  @rbtree.each {|k, v|
789
- ret << k << v
983
+ result << k << v
790
984
  }
791
- 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)
792
986
  end
793
987
 
794
988
  def test_delete
@@ -810,6 +1004,17 @@ class MultiRBTreeTest < Test::Unit::TestCase
810
1004
  assert_equal(%w(a A c C), @rbtree.to_a.flatten)
811
1005
  end
812
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
+
813
1018
  def test_inspect
814
1019
  assert_equal(%(#<MultiRBTree: {"a"=>"A", "b"=>"B", "b"=>"C", "b"=>"D", "c"=>"C"}, default=nil, cmp_proc=nil>),
815
1020
  @rbtree.inspect)
@@ -833,7 +1038,7 @@ class MultiRBTreeTest < Test::Unit::TestCase
833
1038
  end
834
1039
 
835
1040
  def test_bound
836
- 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)
837
1042
  end
838
1043
 
839
1044
  def test_first
@@ -866,11 +1071,6 @@ class MultiRBTreeTest < Test::Unit::TestCase
866
1071
  assert_equal(true, @rbtree.has_value?("D"))
867
1072
  end
868
1073
 
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
1074
  def test_values_at
875
1075
  assert_equal(%w(A B), @rbtree.values_at("a", "b"))
876
1076
  end
@@ -887,9 +1087,9 @@ class MultiRBTreeTest < Test::Unit::TestCase
887
1087
  assert_equal(%w(A B C D C), @rbtree.values)
888
1088
  end
889
1089
 
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"))
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"))
894
1094
  end
895
1095
  end