random-accessible 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,495 @@
1
+ require 'test/unit'
2
+ require 'random-accessible'
3
+
4
+
5
+ class TestRandomAccesible < Test::Unit::TestCase
6
+
7
+ class FullImpl
8
+
9
+ include RandomAccessible
10
+
11
+ def initialize(ary)
12
+ @a = ary
13
+ @size = ary.size
14
+ end
15
+
16
+ def read_access(pos)
17
+ if pos < 0 || @size <= pos
18
+ raise ErrorForTest, "size=#{@size} pos=#{pos}"
19
+ end
20
+ @a.at(pos)
21
+ end
22
+
23
+ def replace_access(pos, obj)
24
+ if pos < 0 || @size <= pos
25
+ raise ErrorForTest, "size=#{@size} pos=#{pos}"
26
+ end
27
+ @a[pos] = obj
28
+ end
29
+
30
+ def expand(n)
31
+ @size += n
32
+ end
33
+
34
+ def shrink(n)
35
+ @size -= n
36
+ @a.pop(n)
37
+ end
38
+
39
+ def size
40
+ @size
41
+ end
42
+
43
+ end
44
+
45
+ class HashWrapper
46
+
47
+ include RandomAccessible
48
+
49
+ def initialize(ary = nil)
50
+ @h = Hash.new
51
+ if ary.nil?
52
+ @size = 0
53
+ else
54
+ ary.each_with_index do |el, i|
55
+ @h[i] = el
56
+ end
57
+ @size = ary.size
58
+ end
59
+ end
60
+
61
+ def read_access(pos)
62
+ raise if pos < 0 && @size <= pos
63
+ return @h[pos]
64
+ end
65
+
66
+ def replace_access(pos, val)
67
+ raise if pos < 0 && @size <= pos
68
+ @h[pos] = val
69
+ end
70
+
71
+ def expand(n)
72
+ n.times do
73
+ @h[@size] = nil
74
+ @size += 1
75
+ end
76
+ end
77
+
78
+ def shrink(n)
79
+ n.times do
80
+ @h.delete(@size - 1)
81
+ @size -= 1
82
+ end
83
+ end
84
+
85
+ attr_reader :size
86
+
87
+ end
88
+
89
+ FULL_IMPLS = [Array, FullImpl, HashWrapper]
90
+
91
+ def test_collect!
92
+ FULL_IMPLS.each do |klass|
93
+ impl = klass.new([1, 2, 3])
94
+ impl.collect! do |el|
95
+ el * 3
96
+ end
97
+ assert_equal([3, 6, 9], impl)
98
+ assert_equal(3, impl.size)
99
+
100
+ impl = klass.new([1, 2, 3])
101
+ e = impl.map!
102
+ e.each do |el|
103
+ el ** 2
104
+ end
105
+ assert_equal([1, 4, 9], impl)
106
+ assert_equal(3, impl.size)
107
+ end
108
+ end
109
+
110
+ def test_compact!
111
+ FULL_IMPLS.each do |klass|
112
+ impl = klass.new([1, nil, 2, nil, 3, nil])
113
+ assert_same(impl, impl.compact!)
114
+ assert_equal([1, 2, 3], impl)
115
+ assert_equal(3, impl.size)
116
+ assert_equal(nil, impl.compact!)
117
+ assert_equal([1, 2, 3], impl)
118
+ assert_equal(3, impl.size)
119
+ end
120
+ end
121
+
122
+ def test_delete
123
+ FULL_IMPLS.each do |klass|
124
+ impl = klass.new([1, 2, 3, 2.0, 1])
125
+ assert_equal(2, impl.delete(2))
126
+ assert_equal([1, 3, 1], impl)
127
+ assert_equal(3, impl.size)
128
+
129
+ impl = klass.new([1, 2.0, 3, 2.0, 1])
130
+ assert_equal(2, impl.delete(2))
131
+ assert_equal([1, 3, 1], impl)
132
+ assert_equal(3, impl.size)
133
+
134
+ assert_equal(nil, impl.delete(2))
135
+ assert_equal([1, 3, 1], impl)
136
+ assert_equal(3, impl.size)
137
+
138
+ impl = klass.new([1, 2.0, 3, 2.0, 1])
139
+ assert_equal(2, impl.delete(2) { "foo" * 2 })
140
+ assert_equal([1, 3, 1], impl)
141
+ assert_equal(3, impl.size)
142
+
143
+ assert_equal("barbar", impl.delete(2) { "bar" * 2 })
144
+ assert_equal([1, 3, 1], impl)
145
+ assert_equal(3, impl.size)
146
+ end
147
+ end
148
+
149
+ def test_delete_at
150
+ FULL_IMPLS.each do |klass|
151
+ msg = "Error in #{klass.name}"
152
+ impl = klass.new([1, 2, 3, 4, 5])
153
+ assert_equal(2, impl.delete_at(1), msg)
154
+ assert_equal([1, 3, 4, 5], impl, msg)
155
+ assert_equal(4, impl.size, msg)
156
+
157
+ assert_equal(1, impl.delete_at(-4), msg)
158
+ assert_equal([3, 4, 5], impl, msg)
159
+ assert_equal(3, impl.size, msg)
160
+
161
+ assert_equal(nil, impl.delete_at(-4), msg)
162
+ assert_equal([3, 4, 5], impl, msg)
163
+ assert_equal(3, impl.size, msg)
164
+ assert_equal(nil, impl.delete_at(3), msg)
165
+ assert_equal([3, 4, 5], impl, msg)
166
+ assert_equal(3, impl.size, msg)
167
+ end
168
+ end
169
+
170
+ def test_delete_if
171
+ FULL_IMPLS.each do |klass|
172
+ msg = "Error in #{klass.name}"
173
+ impl = klass.new([1, 2, 3, 4, 5])
174
+ assert_same(impl, impl.delete_if { |x| x % 2 != 0 }, msg)
175
+ assert_equal([2, 4], impl, msg)
176
+ assert_equal(2, impl.size, msg)
177
+ assert_same(impl, impl.delete_if { |x| x % 2 != 0 }, msg)
178
+ assert_equal([2, 4], impl, msg)
179
+ assert_equal(2, impl.size, msg)
180
+
181
+ impl = klass.new([1, 2, 3, 4, 5])
182
+ e = impl.delete_if
183
+ e.each { |x| x % 2 != 0 }
184
+ assert_equal([2, 4], impl, msg)
185
+ assert_equal(2, impl.size, msg)
186
+ end
187
+ end
188
+
189
+ def test_reject!
190
+ FULL_IMPLS.each do |klass|
191
+ msg = "Error in #{klass.name}"
192
+ impl = klass.new([1, 2, 3, 4, 5])
193
+ assert_same(impl, impl.reject! { |x| x % 2 != 0 }, msg)
194
+ assert_equal([2, 4], impl, msg)
195
+ assert_equal(2, impl.size, msg)
196
+ assert_same(nil, impl.reject! { |x| x % 2 != 0 }, msg)
197
+ assert_equal([2, 4], impl, msg)
198
+ assert_equal(2, impl.size, msg)
199
+
200
+ impl = klass.new([1, 2, 3, 4, 5])
201
+ e = impl.reject!
202
+ e.each { |x| x % 2 != 0 }
203
+ assert_equal([2, 4], impl, msg)
204
+ assert_equal(2, impl.size, msg)
205
+ end
206
+ end
207
+
208
+ # TODO: Delete me.
209
+ def test_fill_start_length
210
+ FULL_IMPLS.each do |klass|
211
+ impl = klass.new([0, 1, 2, 3 ,4])
212
+ impl.fill(-1, 0, 3)
213
+ assert_equal([-1, -1, -1, 3, 4], impl)
214
+ assert_equal(5, impl.size)
215
+
216
+ impl = klass.new([0, 1, 2, 3 ,4])
217
+ impl.fill(-1, 2, 3)
218
+ assert_equal([0, 1, -1, -1, -1], impl)
219
+ assert_equal(5, impl.size)
220
+
221
+ impl = klass.new([0, 1, 2, 3 ,4])
222
+ impl.fill(-1, 2, 5)
223
+ assert_equal([0, 1, -1, -1, -1, -1, -1], impl)
224
+ assert_equal(7, impl.size)
225
+
226
+ impl = klass.new([0, 1, 2, 3 ,4])
227
+ impl.fill(-1, 7, 3)
228
+ assert_equal([0, 1, 2, 3, 4, nil, nil, -1, -1, -1], impl)
229
+ assert_equal(10, impl.size)
230
+ end
231
+ end
232
+
233
+ def test_flatten!
234
+ FULL_IMPLS.each do |klass|
235
+ impl = klass.new([1, [2, 3, [4], 5]])
236
+ assert_same(impl, impl.flatten!(1))
237
+ assert_equal([1, 2, 3, [4], 5], impl)
238
+ assert_equal(5, impl.size)
239
+
240
+ impl = klass.new([1, 2, 3])
241
+ assert_equal(nil, impl.flatten!)
242
+ assert_equal([1, 2, 3], impl)
243
+ assert_equal(3, impl.size)
244
+ end
245
+ end
246
+
247
+ def test_keep_if
248
+ FULL_IMPLS.each do |klass|
249
+ msg = "Error in #{klass.name}"
250
+ impl = klass.new([1, 2, 3, 4, 5])
251
+ impl.keep_if { |x| x % 2 == 0 }
252
+ assert_equal([2, 4], impl, msg)
253
+ assert_equal(2, impl.size, msg)
254
+ impl.keep_if { |x| x % 2 == 0 }
255
+ assert_equal([2, 4], impl, msg)
256
+ assert_equal(2, impl.size, msg)
257
+
258
+ impl = klass.new([1, 2, 3, 4, 5])
259
+ e = impl.keep_if
260
+ e.each { |x| x % 2 == 0 }
261
+ assert_equal([2, 4], impl, msg)
262
+ assert_equal(2, impl.size, msg)
263
+ end
264
+ end
265
+
266
+ def test_pop
267
+ FULL_IMPLS.each do |klass|
268
+ impl = klass.new([1, 2, 3, 4, 5])
269
+ assert_equal(5, impl.pop)
270
+ assert_equal([1, 2, 3, 4], impl)
271
+ assert_equal(4, impl.size)
272
+
273
+ assert_equal([3, 4], impl.pop(2))
274
+ assert_equal([1, 2], impl)
275
+ assert_equal(2, impl.size)
276
+
277
+ assert_equal([1, 2], impl.pop(3))
278
+ assert_equal([], impl)
279
+ assert_equal(0, impl.size)
280
+
281
+ assert_equal(nil, impl.pop)
282
+ assert_equal([], impl)
283
+ assert_equal(0, impl.size)
284
+
285
+ assert_equal([], impl.pop(3))
286
+ assert_equal([], impl)
287
+ assert_equal(0, impl.size)
288
+ end
289
+ end
290
+
291
+ def test_push
292
+ FULL_IMPLS.each do |klass|
293
+ impl = klass.new([1, 2, 3])
294
+ impl.push(-1)
295
+ assert_equal([1, 2, 3, -1], impl)
296
+ assert_equal(4, impl.size)
297
+
298
+ impl.push(-2, -3)
299
+ assert_equal([1, 2, 3, -1, -2, -3], impl)
300
+ assert_equal(6, impl.size)
301
+ end
302
+ end
303
+
304
+ def test_reverse!
305
+ FULL_IMPLS.each do |klass|
306
+ impl = klass.new([1, 2, 3])
307
+ assert_same(impl, impl.reverse!)
308
+ assert_equal([3, 2, 1], impl)
309
+ assert_equal(3, impl.size)
310
+ end
311
+ end
312
+
313
+ def test_rotate!
314
+ FULL_IMPLS.each do |klass|
315
+ impl = klass.new([1, 2, 3, 4])
316
+ impl.rotate!
317
+ assert_equal([2, 3, 4, 1], impl)
318
+ impl.rotate!(2)
319
+ assert_equal([4, 1, 2, 3], impl)
320
+ impl.rotate!(-3)
321
+ assert_equal([1, 2, 3, 4], impl)
322
+ end
323
+ end
324
+
325
+ def test_select!
326
+ FULL_IMPLS.each do |klass|
327
+ msg = "Error in #{klass.name}"
328
+ impl = klass.new([1, 2, 3, 4, 5])
329
+ impl.select! { |x| x % 2 == 0 }
330
+ assert_equal([2, 4], impl, msg)
331
+ assert_equal(2, impl.size, msg)
332
+ impl.select! { |x| x % 2 == 0 }
333
+ assert_equal([2, 4], impl, msg)
334
+ assert_equal(2, impl.size, msg)
335
+
336
+ impl = klass.new([1, 2, 3, 4, 5])
337
+ e = impl.select!
338
+ e.each { |x| x % 2 == 0 }
339
+ assert_equal([2, 4], impl, msg)
340
+ assert_equal(2, impl.size, msg)
341
+ end
342
+ end
343
+
344
+ def test_shuffle!
345
+ FULL_IMPLS.each do |klass|
346
+ orig = [1, 2, 3, 4, 5]
347
+ impl = klass.new(orig.clone)
348
+ res = 10000.times do
349
+ impl.shuffle!
350
+ break false if orig != impl
351
+ end
352
+ assert(!res, "#{klass.name}#shuffle! failed.")
353
+ assert_equal(5, impl.size)
354
+ impl.sort!
355
+ assert_equal([1, 2, 3, 4, 5], impl)
356
+ end
357
+ end
358
+
359
+ def test_slice_pos!
360
+ FULL_IMPLS.each do |klass|
361
+ impl = klass.new([1, 2, 3])
362
+ assert_equal(2, impl.slice!(1))
363
+ assert_equal([1, 3], impl)
364
+ assert_equal(2, impl.size)
365
+
366
+ assert_equal(3, impl.slice!(-1))
367
+ assert_equal([1], impl)
368
+ assert_equal(1, impl.size)
369
+
370
+ assert_equal(nil, impl.slice!(100))
371
+ assert_equal([1], impl)
372
+ assert_equal(1, impl.size)
373
+ end
374
+ end
375
+
376
+ def test_slice_range!
377
+ FULL_IMPLS.each do |klass|
378
+ msg = "Error in #{klass.name}"
379
+ impl = klass.new([1, 2, 3, 4, 5])
380
+ assert_equal([2, 3], impl.slice!(1..2), msg)
381
+ assert_equal([1, 4, 5], impl, msg)
382
+ assert_equal(3, impl.size, msg)
383
+
384
+ impl = klass.new([1, 2, 3, 4, 5])
385
+ assert_equal([], impl.slice!(5..6), msg)
386
+ assert_equal([1, 2, 3, 4, 5], impl, msg)
387
+ assert_equal(5, impl.size, msg)
388
+
389
+ impl = klass.new([1, 2, 3, 4, 5])
390
+ assert_equal(nil, impl.slice!(6..100), msg)
391
+ assert_equal([1, 2, 3, 4, 5], impl, msg)
392
+ assert_equal(5, impl.size, msg)
393
+
394
+ impl = klass.new([1, 2, 3, 4, 5])
395
+ assert_equal([2, 3], impl.slice!(1...3), msg)
396
+ assert_equal([1, 4, 5], impl, msg)
397
+ assert_equal(3, impl.size, msg)
398
+
399
+ impl = klass.new([1, 2, 3, 4, 5])
400
+ assert_equal([], impl.slice!(5...7), msg)
401
+ assert_equal([1, 2, 3, 4, 5], impl, msg)
402
+ assert_equal(5, impl.size, msg)
403
+
404
+ impl = klass.new([1, 2, 3, 4, 5])
405
+ assert_equal(nil, impl.slice!(6...100), msg)
406
+ assert_equal([1, 2, 3, 4, 5], impl, msg)
407
+ assert_equal(5, impl.size, msg)
408
+ end
409
+ end
410
+
411
+ def test_shift
412
+ FULL_IMPLS.each do |klass|
413
+ impl = klass.new([1, 2, 3, 4, 5])
414
+ assert_equal(1, impl.shift)
415
+ assert_equal([2, 3, 4, 5], impl)
416
+ assert_equal(4, impl.size)
417
+
418
+ impl = klass.new([1, 2, 3, 4, 5])
419
+ assert_equal([1, 2, 3], impl.shift(3))
420
+ assert_equal([4, 5], impl)
421
+ assert_equal(2, impl.size)
422
+
423
+ impl = klass.new([1, 2, 3, 4, 5])
424
+ assert_equal([1, 2, 3, 4, 5], impl.shift(8))
425
+ assert_equal([], impl)
426
+ assert_equal(0, impl.size)
427
+
428
+ impl = klass.new([])
429
+ assert_equal(nil, impl.shift)
430
+ assert_equal([], impl.shift(1))
431
+ assert_equal([], impl)
432
+ assert_equal(0, impl.size)
433
+ end
434
+ end
435
+
436
+ def test_sort!
437
+ FULL_IMPLS.each do |klass|
438
+ impl = klass.new([27, 14, 45, 3, 11])
439
+ assert_same(impl, impl.sort!)
440
+ assert_equal([3, 11, 14, 27, 45], impl)
441
+ assert_equal(5, impl.size)
442
+
443
+ assert_same(impl, impl.sort! { |a, b| a % 5 <=> b % 5})
444
+ assert_equal([45, 11, 27, 3, 14], impl)
445
+ assert_equal(5, impl.size)
446
+ end
447
+ end
448
+
449
+ def test_sort_by!
450
+ FULL_IMPLS.each do |klass|
451
+ msg = "Error in #{klass.name}"
452
+ impl = klass.new([27, 14, 45, 3, 11])
453
+ e = impl.sort_by!
454
+ e.each { |a| -a }
455
+ assert_equal([45, 27, 14, 11, 3], impl)
456
+ assert_equal(5, impl.size)
457
+
458
+ impl = klass.new([27, 14, 45, 3, 11])
459
+ assert_same(impl, impl.sort_by! { |a| a % 5 })
460
+ assert_equal([45, 11, 27, 3, 14], impl)
461
+ assert_equal(5, impl.size)
462
+ end
463
+ end
464
+
465
+ def test_uniq!
466
+ FULL_IMPLS.each do |klass|
467
+ msg = "Error in #{klass.name}"
468
+ impl = klass.new([1, 3, 2, 2, 3])
469
+ assert_same(impl, impl.uniq!, msg)
470
+ assert_equal([1, 3, 2], impl, msg)
471
+ assert_equal(3, impl.size, msg)
472
+ assert_equal(nil, impl.uniq!, msg)
473
+ assert_equal([1, 3, 2], impl, msg)
474
+ assert_equal(3, impl.size, msg)
475
+
476
+ impl = klass.new([1, -3, 2, -2, 3])
477
+ assert_same(impl, impl.uniq! { |n| n.abs }, msg)
478
+ assert_equal([1, -3, 2], impl, msg)
479
+ assert_equal(3, impl.size, msg)
480
+ assert_equal(nil, impl.uniq! { |n| n.abs }, msg)
481
+ assert_equal([1, -3, 2], impl, msg)
482
+ assert_equal(3, impl.size, msg)
483
+ end
484
+ end
485
+
486
+ def test_unshift
487
+ FULL_IMPLS.each do |klass|
488
+ impl = klass.new([1, 2, 3])
489
+ impl.unshift(-1)
490
+ assert_equal([-1, 1, 2, 3], impl)
491
+ assert_equal(4, impl.size)
492
+ end
493
+ end
494
+
495
+ end