random-accessible 0.1.2 → 0.1.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.
@@ -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