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,1271 @@
1
+ require 'rational'
2
+ require 'test/unit'
3
+ require 'random-readable'
4
+
5
+
6
+ class TestReadAccessable < Test::Unit::TestCase
7
+
8
+ class ErrorForTest < Exception
9
+ end
10
+
11
+ class ReadAccess
12
+
13
+ include RandomReadable
14
+
15
+ def initialize(ary)
16
+ @a = ary
17
+ end
18
+
19
+ def read_access(pos)
20
+ raise ErrorForTest if pos < 0 || @a.size <= pos
21
+ @a[pos.to_int]
22
+ end
23
+
24
+ end
25
+
26
+ class ReadAccessAndSize
27
+
28
+ include RandomReadable
29
+
30
+ def initialize(ary)
31
+ @a = ary
32
+ end
33
+
34
+ def read_access(pos)
35
+ raise ErrorForTest if pos < 0 || @a.size <= pos
36
+ @a[pos.to_int]
37
+ end
38
+
39
+ def size
40
+ @a.size
41
+ end
42
+
43
+ end
44
+
45
+ class ReadAccessAndLength
46
+
47
+ include RandomReadable
48
+
49
+ def initialize(ary)
50
+ @a = ary
51
+ end
52
+
53
+ def read_access(pos)
54
+ raise ErrorForTest if pos < 0 || @a.size <= pos
55
+ @a[pos.to_int]
56
+ end
57
+
58
+ def length
59
+ @a.length
60
+ end
61
+
62
+ end
63
+
64
+ class HashWrapper
65
+
66
+ include RandomReadable
67
+
68
+ def initialize(ary = nil)
69
+ @h = Hash.new
70
+ if ary.nil?
71
+ @size = 0
72
+ else
73
+ ary.each_with_index do |el, i|
74
+ @h[i] = el
75
+ end
76
+ @size = ary.size
77
+ end
78
+ end
79
+
80
+ def read_access(pos)
81
+ raise if pos < 0 && @size <= pos
82
+ return @h[pos]
83
+ end
84
+
85
+ attr_reader :size
86
+
87
+ end
88
+
89
+ NOSIZE_IMPLS = [ReadAccess]
90
+ FULL_IMPLS = [Array, # To test test cases.
91
+ ReadAccessAndSize,
92
+ ReadAccessAndLength,
93
+ HashWrapper]
94
+
95
+ def test_size_not_implemented
96
+ NOSIZE_IMPLS.each do |klass|
97
+ impl = klass.new([])
98
+ assert_raise NotImplementedError do
99
+ impl.size
100
+ end
101
+ assert_raise NotImplementedError do
102
+ impl.length
103
+ end
104
+ end
105
+ end
106
+
107
+ def test_ampersand
108
+ FULL_IMPLS.each do |klass|
109
+ impl1 = klass.new([1, 1, 2, 3])
110
+ impl2 = klass.new([1, 3, 4])
111
+
112
+ assert_equal([1, 3], impl1 & impl2)
113
+ assert_equal([1, 3], impl1 & [1, 3, 4])
114
+ end
115
+ NOSIZE_IMPLS.each do |klass|
116
+ assert_raise NotImplementedError do
117
+ klass.new([]) & []
118
+ end
119
+ end
120
+ end
121
+
122
+ def test_asterisk_times
123
+ FULL_IMPLS.each do |klass|
124
+ impl = klass.new([1, 2, 3])
125
+ assert_equal([1, 2, 3] * 3, impl * 3)
126
+ end
127
+ NOSIZE_IMPLS.each do |klass|
128
+ assert_raise NotImplementedError do
129
+ klass.new([]) * []
130
+ end
131
+ end
132
+ end
133
+
134
+ def test_asterisk_separator
135
+ FULL_IMPLS.each do |klass|
136
+ impl = klass.new([1, 2, 3])
137
+ assert_equal([1, 2, 3] * 'foo', impl * 'foo')
138
+ end
139
+ NOSIZE_IMPLS.each do |klass|
140
+ assert_raise NotImplementedError do
141
+ klass.new([]) * 'bar'
142
+ end
143
+ end
144
+ end
145
+
146
+ def test_plus
147
+ FULL_IMPLS.each do |klass|
148
+ impl1 = klass.new([1, 2])
149
+ impl2 = klass.new([8, 9])
150
+ assert_equal([1, 2, 8, 9], impl1 + impl2)
151
+ assert_equal([1, 2], impl1)
152
+ assert_equal([8, 9], impl2)
153
+ end
154
+ NOSIZE_IMPLS.each do |klass|
155
+ impl = klass.new([])
156
+ assert_raise NotImplementedError do
157
+ impl + impl
158
+ end
159
+ end
160
+ end
161
+
162
+ def test_minus
163
+ FULL_IMPLS.each do |klass|
164
+ impl1 = klass.new([1, 2, 1, 3, 1, 4, 1, 5])
165
+ impl2 = klass.new([2, 3, 4, 5])
166
+ assert_equal([1, 1, 1, 1], impl1 - impl2)
167
+ end
168
+ NOSIZE_IMPLS.each do |klass|
169
+ impl = klass.new([])
170
+ assert_raise NotImplementedError do
171
+ impl - impl
172
+ end
173
+ end
174
+ end
175
+
176
+ def test_compare
177
+ FULL_IMPLS.each do |klass|
178
+ impl = klass.new([1, 2, 3])
179
+ assert_equal(-1, impl <=> [1, 3, 2])
180
+ assert_equal(1, impl <=> [1, 0, 3])
181
+ assert_equal(0, impl <=> [1, 2, 3])
182
+ assert_equal(1, [1, 3, 2] <=> impl)
183
+ assert_equal(-1, [1, 0, 3] <=> impl)
184
+ assert_equal(0, [1, 2, 3] <=> impl)
185
+ assert_equal(-1, impl <=> [1, 2, 3, 4])
186
+ assert_equal(1, [1, 2, 3, 4] <=> impl)
187
+ assert_equal(1, impl <=> [1, 2])
188
+ assert_equal(-1, [1, 2] <=> impl)
189
+ end
190
+ NOSIZE_IMPLS.each do |klass|
191
+ impl = klass.new([])
192
+ assert_raise NotImplementedError do
193
+ impl <=> []
194
+ end
195
+ assert_raise NotImplementedError do
196
+ [] <=> impl
197
+ end
198
+ end
199
+ end
200
+
201
+ def test_equal
202
+ FULL_IMPLS.each do |klass|
203
+ impl = klass.new([1, 2, 3])
204
+ assert(impl == [1, 2, 3])
205
+ assert(impl == [1.0, 2.0, 3.0])
206
+ assert(impl != [1, 2, 3, 4])
207
+ assert(impl != [1, 2])
208
+ assert(impl != [1, 2, 3.01])
209
+ assert(impl != [1.01, 2, 3])
210
+ end
211
+ NOSIZE_IMPLS.each do |klass|
212
+ impl1 = klass.new([1, 2])
213
+ impl2 = klass.new([1, 2])
214
+ assert(impl1 == impl1)
215
+ assert(impl1 != impl2)
216
+ assert(impl1 != [1, 2])
217
+ assert([1, 2] != impl1)
218
+ end
219
+ end
220
+
221
+ def test_bracket_position
222
+ FULL_IMPLS.each do |klass|
223
+ impl = klass.new((0...10).to_a)
224
+ assert_nil(impl[-11])
225
+ assert_equal(0, impl[-10])
226
+ assert_equal(9, impl[-1])
227
+ assert_equal(0, impl[0])
228
+ assert_equal(9, impl[9])
229
+ assert_nil(impl[10])
230
+ end
231
+ NOSIZE_IMPLS.each do |klass|
232
+ impl = klass.new((0...10).to_a)
233
+ [-11, -10, -1].each do |pos|
234
+ assert_raise NotImplementedError do
235
+ impl[pos]
236
+ end
237
+ end
238
+
239
+ assert_equal(0, impl[0])
240
+ assert_equal(9, impl[9])
241
+
242
+ assert_raise ErrorForTest do
243
+ impl[10]
244
+ end
245
+ end
246
+ end
247
+
248
+ def test_bracket_range
249
+ FULL_IMPLS.each do |klass|
250
+ impl = klass.new((0...10).to_a)
251
+ msg = "Error in #{klass.name}"
252
+
253
+ assert_equal(nil, impl[-12..-11], msg)
254
+ assert_equal(nil, impl[-14..-10], msg)
255
+ assert_equal([0, 1, 2], impl[-10..-8], msg)
256
+ assert_equal([8, 9], impl[-2..-1], msg)
257
+ assert_equal([1, 2, 3], impl[-9..3], msg)
258
+ assert_equal([0, 1], impl[0..1], msg)
259
+ assert_equal([8, 9], impl[8..9], msg)
260
+ assert_equal([8, 9], impl[8..100], msg)
261
+ assert_equal([], impl[10..15], msg)
262
+ assert_equal(nil, impl[11..15], msg)
263
+ assert_equal([], impl[-1..-2], msg)
264
+ assert_equal([], impl[3..0], msg)
265
+ assert_equal([], impl[-1..1], msg)
266
+ assert_equal(nil, impl[15..14], msg)
267
+ assert_equal(nil, impl[-11..-20], msg)
268
+ assert_equal(nil, impl[15..5], msg)
269
+ assert_equal([], impl[-10..-20], msg)
270
+ assert_equal([], impl[1..-20], msg)
271
+
272
+ assert_equal(nil, impl[-12...-10], msg)
273
+ assert_equal(nil, impl[-14...-9], msg)
274
+ assert_equal([0, 1, 2], impl[-10...-7], msg)
275
+ assert_equal([], impl[-2...0], msg)
276
+ assert_equal([1, 2, 3], impl[-9...4], msg)
277
+ assert_equal([0, 1], impl[0...2], msg)
278
+ assert_equal([8, 9], impl[8...10], msg)
279
+ assert_equal([8, 9], impl[8...100], msg)
280
+ assert_equal([], impl[10...15], msg)
281
+ assert_equal(nil, impl[11...15], msg)
282
+ assert_equal([], impl[-1...-1], msg)
283
+ assert_equal([], impl[0...0], msg)
284
+ assert_equal([3, 4, 5, 6, 7, 8], impl[3...-1], msg)
285
+ assert_equal([], impl[-1...2], msg)
286
+ assert_equal(nil, impl[16...15], msg)
287
+ assert_equal(nil, impl[-11...-20], msg)
288
+ assert_equal(nil, impl[15...5], msg)
289
+ assert_equal([], impl[-10...-20], msg)
290
+ assert_equal([], impl[1...-20], msg)
291
+ end
292
+ NOSIZE_IMPLS.each do |klass|
293
+ impl = klass.new((0...10).to_a)
294
+ [-12..-11, -14..-10, -10..-8, -2..-1, -1..1].each do |range|
295
+ assert_raise NotImplementedError do
296
+ impl[range]
297
+ end
298
+ end
299
+
300
+ assert_equal([0, 1], impl[0..1])
301
+ assert_equal([8, 9], impl[8..9])
302
+ assert_equal([], impl[15..10])
303
+ assert_equal([], impl[-1..-2])
304
+
305
+ [8..11, 10..15].each do |range|
306
+ assert_raise ErrorForTest do
307
+ impl[range]
308
+ end
309
+ end
310
+ end
311
+ end
312
+
313
+ def test_bracket_start_and_length
314
+ FULL_IMPLS.each do |klass|
315
+ impl = klass.new((0...10).to_a)
316
+ assert_equal(nil, impl[-12, 2])
317
+ assert_equal(nil, impl[-14, 5])
318
+ assert_equal([0, 1, 2], impl[-10, 3])
319
+ assert_equal([8, 9], impl[-2, 2])
320
+ assert_equal([1, 2, 3], impl[-9, 3])
321
+ assert_equal([0, 1], impl[0, 2])
322
+ assert_equal([5], impl[5, 1])
323
+ assert_equal([8, 9], impl[8, 2])
324
+ assert_equal([8, 9], impl[8, 100])
325
+ assert_equal([], impl[10, 5])
326
+ assert_equal(nil, impl[11, 15])
327
+ assert_equal(nil, impl[-1, -2], "Error in #{klass.name}")
328
+ assert_equal(nil, impl[3, -3])
329
+ assert_equal(nil, impl[15, -1])
330
+ assert_equal(nil, impl[-11, -20])
331
+ assert_equal(nil, impl[15, -10])
332
+ assert_equal(nil, impl[-10, -20])
333
+ end
334
+ NOSIZE_IMPLS.each do |klass|
335
+ impl = klass.new((0...10).to_a)
336
+ [[-12, 2], [-14, 5], [-10, 3], [-2, 2], [-1, 3]].each do |range|
337
+ assert_raise NotImplementedError do
338
+ impl[*range]
339
+ end
340
+ end
341
+
342
+ assert_equal([0, 1], impl[0, 2])
343
+ assert_equal([8, 9], impl[8, 2])
344
+ assert_equal([], impl[15, -6])
345
+ assert_equal([], impl[-1, -2])
346
+
347
+ [[8, 4], [10, 6]].each do |range|
348
+ assert_raise ErrorForTest do
349
+ impl[*range]
350
+ end
351
+ end
352
+ end
353
+ end
354
+
355
+ def test_assoc
356
+ FULL_IMPLS.each do |klass|
357
+ impl = klass.new([[1,15], [2,25], [3,35]])
358
+ assert_equal([1, 15], impl.assoc(1))
359
+ assert_equal([2, 25], impl.assoc(2))
360
+ assert_equal([3, 35], impl.assoc(3))
361
+ assert_nil(impl.assoc(100))
362
+ assert_nil(impl.assoc(15))
363
+ end
364
+ NOSIZE_IMPLS.each do |klass|
365
+ impl = klass.new([[1,15], [2,25], [3,35]])
366
+ assert_equal([1, 15], impl.assoc(1))
367
+ assert_equal([2, 25], impl.assoc(2))
368
+ assert_equal([3, 35], impl.assoc(3))
369
+ [100, 15].each do |n|
370
+ assert_raise ErrorForTest do
371
+ impl.assoc(n)
372
+ end
373
+ end
374
+ end
375
+ end
376
+
377
+ def test_at
378
+ FULL_IMPLS.each do |klass|
379
+ impl = klass.new((0...10).to_a)
380
+ assert_nil(impl.at(-11))
381
+ assert_equal(0, impl.at(-10))
382
+ assert_equal(9, impl.at(-1))
383
+ assert_equal(0, impl.at(0))
384
+ assert_equal(9, impl.at(9))
385
+ assert_nil(impl.at(10))
386
+ end
387
+ NOSIZE_IMPLS.each do |klass|
388
+ impl = klass.new((0...10).to_a)
389
+ [-11, -10, -1].each do |pos|
390
+ assert_raise NotImplementedError do
391
+ impl.at(pos)
392
+ end
393
+ end
394
+
395
+ assert_equal(0, impl.at(0))
396
+ assert_equal(9, impl.at(9))
397
+
398
+ assert_raise ErrorForTest do
399
+ impl.at(10)
400
+ end
401
+ end
402
+ end
403
+
404
+ def test_combination
405
+ FULL_IMPLS.each do |klass|
406
+ impl = klass.new([1, 2, 3, 4])
407
+ assert_equal([], impl.combination(-1).to_a)
408
+ assert_equal([[]], impl.combination(0).to_a)
409
+ assert_equal([[1],[2],[3],[4]], impl.combination(1).to_a)
410
+ assert_equal([[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]],
411
+ impl.combination(2).to_a)
412
+ assert_equal([[1,2,3],[1,2,4],[1,3,4],[2,3,4]],
413
+ impl.combination(3).to_a)
414
+ assert_equal([[1,2,3,4]], impl.combination(4).to_a)
415
+ assert_equal([], impl.combination(5).to_a)
416
+ end
417
+ NOSIZE_IMPLS.each do |klass|
418
+ impl = klass.new([1, 2, 3, 4])
419
+ (-1..5).each do |i|
420
+ assert_raise NotImplementedError do
421
+ impl.combination(i)
422
+ end
423
+ end
424
+ end
425
+ end
426
+
427
+ def test_compact
428
+ FULL_IMPLS.each do |klass|
429
+ impl = klass.new([1, nil, 2, nil, 3, nil])
430
+ assert_equal([1, 2, 3], impl.compact)
431
+ end
432
+ NOSIZE_IMPLS.each do |klass|
433
+ impl = klass.new([1, nil, 2, nil, 3, nil])
434
+ assert_raise NotImplementedError do
435
+ impl.compact
436
+ end
437
+ end
438
+ end
439
+
440
+ def test_cycle
441
+ FULL_IMPLS.each do |klass|
442
+ impl = klass.new([0, 1, 2])
443
+ i = 0
444
+ impl.cycle do |el|
445
+ assert_equal(i % 3, el)
446
+ i += 1
447
+ break if i > 100
448
+ end
449
+ end
450
+ NOSIZE_IMPLS.each do |klass|
451
+ impl = klass.new([0, 1, 2])
452
+ i = 0
453
+ assert_raise ErrorForTest do
454
+ impl.cycle do |el|
455
+ if i < 3
456
+ assert_equal(i, el)
457
+ end
458
+ i += 1
459
+ end
460
+ end
461
+ end
462
+ end
463
+
464
+ def test_each
465
+ FULL_IMPLS.each do |klass|
466
+ impl = klass.new([1, 4, 9, 16])
467
+ i = 1
468
+ impl.each do |el|
469
+ assert_equal(i * i, el)
470
+ i += 1
471
+ end
472
+ assert_equal(4, i - 1)
473
+ assert_equal([1, 4, 9, 16], impl.each.to_a)
474
+ end
475
+ NOSIZE_IMPLS.each do |klass|
476
+ impl = klass.new([])
477
+ assert_raise NotImplementedError do
478
+ impl.each.next
479
+ end
480
+ assert_raise NotImplementedError do
481
+ impl.each do
482
+ assert_fail
483
+ end
484
+ end
485
+ end
486
+ end
487
+
488
+ def test_each_index
489
+ FULL_IMPLS.each do |klass|
490
+ impl = klass.new([1, 2, 3, 4, 5])
491
+ n = 0
492
+ impl.each_index do |i|
493
+ assert_equal(n, i)
494
+ n += 1
495
+ end
496
+ end
497
+ NOSIZE_IMPLS.each do |klass|
498
+ impl = klass.new([])
499
+ assert_raise NotImplementedError do
500
+ impl.each_index do
501
+ assert_fail
502
+ end
503
+ end
504
+ end
505
+ end
506
+
507
+ def test_empty
508
+ FULL_IMPLS.each do |klass|
509
+ impl = klass.new([])
510
+ assert_equal(true, impl.empty?)
511
+
512
+ impl = klass.new([1])
513
+ assert_equal(false, impl.empty?)
514
+ end
515
+ NOSIZE_IMPLS.each do |klass|
516
+ impl = klass.new([])
517
+ assert_equal(false, impl.empty?)
518
+ end
519
+ end
520
+
521
+ def test_eql?
522
+ FULL_IMPLS.each do |klass|
523
+ next if klass == Array
524
+
525
+ impl1 = klass.new(["a", "b", "c"])
526
+ impl2 = klass.new(["a", "b", "c"])
527
+ assert_equal(true, impl1.eql?(impl2))
528
+
529
+ assert_equal(false, impl1.eql?(["a", "b", "c"]))
530
+ assert_equal(false, ["a", "b", "c"].eql?(impl1))
531
+
532
+ impl1 = klass.new(["a", "b", "c"])
533
+ impl2 = klass.new(["a", "b", "d"])
534
+ assert_equal(false, impl1.eql?(impl2))
535
+
536
+ impl1 = klass.new(["a", "b", 1])
537
+ impl2 = klass.new(["a", "b", 1.0])
538
+ assert_equal(false, impl1.eql?(impl2))
539
+ end
540
+ NOSIZE_IMPLS.each do |klass|
541
+ impl1 = klass.new(["a", "b", "c"])
542
+ impl2 = klass.new(["a", "b", "c"])
543
+ assert_equal(false, impl1.eql?(impl2))
544
+ assert_equal(true, impl1.eql?(impl1))
545
+ end
546
+ end
547
+
548
+ def test_fetch
549
+ FULL_IMPLS.each do |klass|
550
+ impl = klass.new([1, 2, 3])
551
+
552
+ assert_equal(1, impl.fetch(-3))
553
+ assert_equal(3, impl.fetch(-1))
554
+ assert_equal(1, impl.fetch(0))
555
+ assert_equal(3, impl.fetch(2))
556
+
557
+ [-4, 3].each do |i|
558
+ assert_raise IndexError do
559
+ impl.fetch(i)
560
+ end
561
+ end
562
+
563
+ assert_equal(-1, impl.fetch(-4, -1))
564
+ assert_equal(1, impl.fetch(-3, -1))
565
+ assert_equal(3, impl.fetch(-1, -1))
566
+ assert_equal(1, impl.fetch(0, -1))
567
+ assert_equal(3, impl.fetch(2, -1))
568
+ assert_equal(-1, impl.fetch(3, -1))
569
+
570
+ assert_equal(-1, impl.fetch(-4) { -1 })
571
+ assert_equal(1, impl.fetch(-3) { -1 })
572
+ assert_equal(3, impl.fetch(-1) { -1 })
573
+ assert_equal(1, impl.fetch(0) { -1 })
574
+ assert_equal(3, impl.fetch(2) { -1 })
575
+ assert_equal(-1, impl.fetch(3) { -1 })
576
+ end
577
+ NOSIZE_IMPLS.each do |klass|
578
+ impl = klass.new([1, 2, 3])
579
+
580
+ assert_equal(1, impl.fetch(0))
581
+ assert_equal(3, impl.fetch(2))
582
+
583
+ assert_equal(1, impl.fetch(0, -1))
584
+ assert_equal(3, impl.fetch(2, -1))
585
+
586
+ assert_equal(1, impl.fetch(0) { -1 })
587
+ assert_equal(3, impl.fetch(2) { -1 })
588
+
589
+ [-4, -3, -1].each do |i|
590
+ assert_raise NotImplementedError do
591
+ impl.fetch(i)
592
+ end
593
+ assert_raise NotImplementedError do
594
+ impl.fetch(i, -1)
595
+ end
596
+ assert_raise NotImplementedError do
597
+ impl.fetch(i) { -1 }
598
+ end
599
+ end
600
+
601
+ assert_raise ErrorForTest do
602
+ impl.fetch(3)
603
+ end
604
+ assert_raise ErrorForTest do
605
+ impl.fetch(3, -1)
606
+ end
607
+ assert_raise ErrorForTest do
608
+ impl.fetch(3) { -1 }
609
+ end
610
+ end
611
+ end
612
+
613
+ def test_first
614
+ FULL_IMPLS.each do |klass|
615
+ impl = klass.new([1, 2, 3])
616
+ assert_equal(1, impl.first)
617
+ assert_equal([], impl.first(0))
618
+ assert_equal([1], impl.first(1))
619
+ assert_equal([1, 2], impl.first(2))
620
+ assert_equal([1, 2, 3], impl.first(3))
621
+ assert_equal([1, 2, 3], impl.first(4))
622
+
623
+ impl = klass.new([])
624
+ assert_equal(nil, impl.first)
625
+ assert_equal([], impl.first(0))
626
+ assert_equal([], impl.first(1))
627
+ end
628
+ NOSIZE_IMPLS.each do |klass|
629
+ impl = klass.new([1, 2, 3])
630
+ assert_equal(1, impl.first)
631
+ assert_equal([], impl.first(0))
632
+ assert_equal([1], impl.first(1))
633
+ assert_equal([1, 2], impl.first(2))
634
+ assert_equal([1, 2, 3], impl.first(3))
635
+ assert_raise ErrorForTest do
636
+ impl.first(4)
637
+ end
638
+
639
+ impl = klass.new([])
640
+ assert_raise(ErrorForTest) { impl.first }
641
+ assert_equal([], impl.first(0))
642
+ assert_raise(ErrorForTest) { impl.first(1) }
643
+ end
644
+ end
645
+
646
+ def test_flatten
647
+ FULL_IMPLS.each do |klass|
648
+ impl = klass.new([1, [2, 3, [4], 5]])
649
+ assert_equal([1, 2, 3, 4, 5], impl.flatten)
650
+ assert_equal([1, 2, 3, [4], 5], impl.flatten(1))
651
+ end
652
+ NOSIZE_IMPLS.each do |klass|
653
+ impl = klass.new([1, [2, 3, [4], 5]])
654
+ assert_raise(NotImplementedError) { impl.flatten }
655
+ assert_raise(NotImplementedError) { impl.flatten(1) }
656
+ end
657
+ end
658
+
659
+ def test_hash
660
+ FULL_IMPLS.each do |klass|
661
+ impl1 = klass.new([1, 2, 3, 4])
662
+ impl2 = klass.new([1, 2, 3, 4])
663
+ assert(impl1.hash == impl2.hash)
664
+
665
+ # Assuming there is no collision.
666
+ impl2 = klass.new([1, 2, 3, 3])
667
+ assert(impl1.hash != impl2.hash)
668
+ end
669
+ NOSIZE_IMPLS.each do |klass|
670
+ # Assuming there is no collision.
671
+ impl1 = klass.new([1, 2, 3, 4])
672
+ impl2 = klass.new([1, 2, 3, 4])
673
+ assert(impl1.hash != impl2.hash)
674
+ end
675
+ end
676
+
677
+ def test_include
678
+ FULL_IMPLS.each do |klass|
679
+ impl = klass.new([1, 2, 3, 4.0])
680
+ assert_equal(true, impl.include?(2))
681
+ assert_equal(true, impl.include?(2.0))
682
+ assert_equal(true, impl.include?(4))
683
+ assert_equal(false, impl.include?(0))
684
+ assert_equal(false, impl.include?(4.01))
685
+ end
686
+ NOSIZE_IMPLS.each do |klass|
687
+ impl = klass.new([1, 2, 3, 4.0])
688
+ assert_raise(NotImplementedError) { impl.include?(0) }
689
+ assert_raise(NotImplementedError) { impl.include?(3) }
690
+ end
691
+ end
692
+
693
+ def test_index
694
+ FULL_IMPLS.each do |klass|
695
+ impl = klass.new([1, 2, 3, 4.0])
696
+ assert_equal(1, impl.index(2))
697
+ assert_equal(1, impl.index(2.0))
698
+ assert_equal(3, impl.index(4))
699
+ assert_equal(nil, impl.index(0))
700
+ assert_equal(nil, impl.index(4.01))
701
+ end
702
+ NOSIZE_IMPLS.each do |klass|
703
+ impl = klass.new([1, 2, 3, 4.0])
704
+ assert_raise(NotImplementedError) { impl.index(0) }
705
+ assert_raise(NotImplementedError) { impl.index(3) }
706
+ end
707
+ end
708
+
709
+ def test_to_s_inspect
710
+ FULL_IMPLS.each do |klass|
711
+ ary = [1, "a", 2.0, [3], Hash.new([4])]
712
+ impl = klass.new(ary)
713
+ assert_equal(ary.to_s, impl.to_s)
714
+ assert_equal(ary.inspect, impl.inspect)
715
+ end
716
+ NOSIZE_IMPLS.each do |klass|
717
+ impl = klass.new([1, "a", 2.0, [3], Hash.new([4])])
718
+ assert_nothing_raised do
719
+ impl.to_s
720
+ impl.inspect
721
+ end
722
+ end
723
+ end
724
+
725
+ def test_join
726
+ FULL_IMPLS.each do |klass|
727
+ ary = [1, "a", 2.0, [3], Hash.new([4])]
728
+ impl = klass.new(ary)
729
+ assert_equal(ary.join, impl.join)
730
+ assert_equal(ary.join('foobar'), impl.join('foobar'))
731
+ temp = $,
732
+ $, = 'bazbaz'
733
+ assert_equal(ary.join, impl.join)
734
+ $, = temp
735
+ end
736
+ NOSIZE_IMPLS.each do |klass|
737
+ impl = klass.new([1, "a", 2.0, [3], Hash.new([4])])
738
+ assert_raise(NotImplementedError) { impl.join }
739
+ assert_raise(NotImplementedError) { impl.join('foobar') }
740
+ temp = $,
741
+ $, = 'bazbaz'
742
+ assert_raise(NotImplementedError) { impl.join }
743
+ $, = temp
744
+ end
745
+ end
746
+
747
+ def test_last
748
+ FULL_IMPLS.each do |klass|
749
+ impl = klass.new([1, 2, 3])
750
+ assert_equal(3, impl.last)
751
+ assert_equal([], impl.last(0))
752
+ assert_equal([3], impl.last(1))
753
+ assert_equal([2, 3], impl.last(2))
754
+ assert_equal([1, 2, 3], impl.last(3))
755
+ assert_equal([1, 2, 3], impl.last(4))
756
+
757
+ impl = klass.new([])
758
+ assert_equal(nil, impl.last)
759
+ assert_equal([], impl.last(0))
760
+ assert_equal([], impl.last(1))
761
+ end
762
+ NOSIZE_IMPLS.each do |klass|
763
+ impl = klass.new([1, 2, 3])
764
+ assert_raise(NotImplementedError) { impl.last }
765
+ assert_raise(NotImplementedError) { impl.last(0) }
766
+ assert_raise(NotImplementedError) { impl.last(1) }
767
+
768
+ impl = klass.new([])
769
+ assert_raise(NotImplementedError) { impl.last }
770
+ assert_raise(NotImplementedError) { impl.last(0) }
771
+ assert_raise(NotImplementedError) { impl.last(1) }
772
+ end
773
+ end
774
+
775
+ def test_size_length
776
+ FULL_IMPLS.each do |klass|
777
+ impl = klass.new([1, 2, 3])
778
+ assert_equal(3, impl.size)
779
+ assert_equal(3, impl.length)
780
+
781
+ impl = klass.new([])
782
+ assert_equal(0, impl.size)
783
+ assert_equal(0, impl.length)
784
+ end
785
+ NOSIZE_IMPLS.each do |klass|
786
+ impl = klass.new([1, 2, 3])
787
+ assert_raise(NotImplementedError) { impl.size }
788
+ assert_raise(NotImplementedError) { impl.length }
789
+
790
+ impl = klass.new([])
791
+ assert_raise(NotImplementedError) { impl.size }
792
+ assert_raise(NotImplementedError) { impl.length }
793
+ end
794
+ end
795
+
796
+ def test_pack
797
+ # TODO
798
+ end
799
+
800
+ def test_permutation
801
+ FULL_IMPLS.each do |klass|
802
+ ary = [1, 2, 3, 4]
803
+ impl = klass.new([1, 2, 3, 4])
804
+ (-1..5).each do |i|
805
+ ary_p = []
806
+ impl_p = []
807
+ ary.permutation(i) do |p|
808
+ ary_p << p
809
+ end
810
+ impl.permutation(i) do |p|
811
+ impl_p << p
812
+ end
813
+ assert_equal(ary_p.sort, impl_p.sort,
814
+ "Failed #{klass.name}\#permutation(#{i})")
815
+
816
+ assert_equal(ary.permutation(i).to_a.sort,
817
+ impl.permutation(i).to_a.sort)
818
+ end
819
+ end
820
+ NOSIZE_IMPLS.each do |klass|
821
+ impl = klass.new([1, 2, 3, 4])
822
+ (-1..5).each do |i|
823
+ assert_raise(NotImplementedError) { impl.permutation(i) }
824
+ end
825
+ end
826
+ end
827
+
828
+ def test_product
829
+ FULL_IMPLS.each do |klass|
830
+ ary = [1, 2, 3, 4]
831
+ impl = klass.new([1, 2, 3, 4])
832
+ [[[4, 5]], [[1, 2]], [[4, 5], [1, 2]]].each do |lists|
833
+ ary_p = []
834
+ impl_p = []
835
+ ary.product(*lists) do |p|
836
+ ary_p << p
837
+ end
838
+ impl.product(*lists) do |p|
839
+ impl_p << p
840
+ end
841
+ assert_equal(ary_p.sort, impl_p.sort,
842
+ "Failed #{klass.name}\#product(#{lists.join(', ')}")
843
+
844
+ assert_equal(ary.product(*lists).to_a.sort,
845
+ impl.product(*lists).to_a.sort)
846
+ end
847
+ end
848
+ NOSIZE_IMPLS.each do |klass|
849
+ impl = klass.new([1, 2, 3, 4])
850
+ [[[4, 5]], [[1, 2]], [[4, 5], [1, 2]]].each do |lists|
851
+ assert_raise(NotImplementedError) { impl.product(*lists) }
852
+ end
853
+ end
854
+ end
855
+
856
+ def test_rassoc
857
+ FULL_IMPLS.each do |klass|
858
+ impl = klass.new([[15, 1], [25, 2], [35, 3]])
859
+ msg = "Failed in #{klass.name}"
860
+ assert_equal([15, 1], impl.rassoc(1), msg)
861
+ assert_equal([25, 2], impl.rassoc(2), msg)
862
+ assert_equal([25, 2], impl.rassoc(2.0), msg)
863
+ assert_equal([35, 3], impl.rassoc(3), msg)
864
+
865
+ assert_equal(nil, impl.rassoc(0), msg)
866
+ assert_equal(nil, impl.rassoc(4), msg)
867
+ end
868
+ NOSIZE_IMPLS.each do |klass|
869
+ impl = klass.new([])
870
+ (0..4).each do |i|
871
+ assert_raise(NotImplementedError) { impl.rassoc(i) }
872
+ end
873
+ end
874
+ end
875
+
876
+ def test_repeated_combination
877
+ FULL_IMPLS.each do |klass|
878
+ ary = [1, 2, 3, 4]
879
+ impl = klass.new([1, 2, 3, 4])
880
+ (-1..5).each do |i|
881
+ ary_p = []
882
+ impl_p = []
883
+ ary.repeated_combination(i) do |p|
884
+ ary_p << p
885
+ end
886
+ impl.repeated_combination(i) do |p|
887
+ impl_p << p
888
+ end
889
+ assert_equal(ary_p.sort, impl_p.sort,
890
+ "Failed #{klass.name}\#repeated_combination(#{i})")
891
+
892
+ assert_equal(ary.repeated_combination(i).to_a.sort,
893
+ impl.repeated_combination(i).to_a.sort)
894
+ end
895
+ end
896
+ NOSIZE_IMPLS.each do |klass|
897
+ impl = klass.new([1, 2, 3, 4])
898
+ (-1..5).each do |i|
899
+ assert_raise(NotImplementedError) { impl.repeated_combination(i) }
900
+ end
901
+ end
902
+ end
903
+
904
+ def test_repeated_permutation
905
+ FULL_IMPLS.each do |klass|
906
+ ary = [1, 2, 3, 4]
907
+ impl = klass.new([1, 2, 3, 4])
908
+ (-1..5).each do |i|
909
+ ary_p = []
910
+ impl_p = []
911
+ ary.repeated_permutation(i) do |p|
912
+ ary_p << p
913
+ end
914
+ impl.repeated_permutation(i) do |p|
915
+ impl_p << p
916
+ end
917
+ assert_equal(ary_p.sort, impl_p.sort,
918
+ "Failed #{klass.name}\#repeated_permutation(#{i})")
919
+
920
+ assert_equal(ary.repeated_permutation(i).to_a.sort,
921
+ impl.repeated_permutation(i).to_a.sort)
922
+ end
923
+ end
924
+ NOSIZE_IMPLS.each do |klass|
925
+ impl = klass.new([1, 2, 3, 4])
926
+ (-1..5).each do |i|
927
+ assert_raise(NotImplementedError) { impl.repeated_permutation(i) }
928
+ end
929
+ end
930
+ end
931
+
932
+ def test_reverse
933
+ FULL_IMPLS.each do |klass|
934
+ impl = klass.new([1, 2, 3, 4])
935
+ assert_equal([4, 3, 2, 1], impl.reverse)
936
+
937
+ impl = klass.new([])
938
+ assert_equal([], impl.reverse)
939
+ end
940
+ NOSIZE_IMPLS.each do |klass|
941
+ impl = klass.new([])
942
+ assert_raise(NotImplementedError) { impl.reverse }
943
+ end
944
+ end
945
+
946
+ def test_reverse_each
947
+ FULL_IMPLS.each do |klass|
948
+ impl = klass.new([1, 2, 3, 4])
949
+ assert_equal([4, 3, 2, 1], impl.reverse)
950
+ ary = []
951
+ impl.reverse_each { |el| ary << el }
952
+ assert_equal([4, 3, 2, 1], ary)
953
+
954
+ impl = klass.new([])
955
+ assert_equal([], impl.reverse)
956
+ impl.reverse_each { |el| assert_fail }
957
+ end
958
+ NOSIZE_IMPLS.each do |klass|
959
+ impl = klass.new([])
960
+ assert_raise(NotImplementedError) do
961
+ impl.reverse_each { |el| } # Nothing to do in this block.
962
+ end
963
+ assert_raise(NotImplementedError) { impl.reverse_each.next }
964
+ end
965
+ end
966
+
967
+ def test_rindex
968
+ FULL_IMPLS.each do |klass|
969
+ msg = "Failed in #{klass.name}"
970
+
971
+ impl = klass.new([1, 0, 0, 1, 0])
972
+ assert_equal(3, impl.rindex(1), msg)
973
+
974
+ impl = klass.new([1, 0, 0, 0, 0])
975
+ assert_equal(0, impl.rindex(1), msg)
976
+
977
+ impl = klass.new([0, 0, 0, 0, 0])
978
+ assert_equal(nil, impl.rindex(1), msg)
979
+
980
+ impl = klass.new([3, 0, 2, 0, 0])
981
+ rindex = impl.rindex do |el|
982
+ el > 1
983
+ end
984
+ assert_equal(2, rindex, msg)
985
+ end
986
+ NOSIZE_IMPLS.each do |klass|
987
+ impl = klass.new([])
988
+ assert_raise(NotImplementedError) { impl.rindex }
989
+ assert_raise(NotImplementedError) do
990
+ impl.rindex { |el| } # Nothing to do in this block.
991
+ end
992
+ end
993
+ end
994
+
995
+ def test_rotate
996
+ FULL_IMPLS.each do |klass|
997
+ ary = ["a" ,"b", "c", "d"]
998
+ impl = klass.new(ary)
999
+ assert_equal(ary.rotate, impl.rotate)
1000
+ (-9..9).each do |i|
1001
+ assert_equal(ary.rotate(i), impl.rotate(i))
1002
+ end
1003
+ end
1004
+ NOSIZE_IMPLS.each do |klass|
1005
+ impl = klass.new(["a" ,"b", "c", "d"])
1006
+ assert_raise(NotImplementedError) { impl.rotate }
1007
+ (-9..9).each do |i|
1008
+ assert_raise(NotImplementedError) { impl.rotate(i) }
1009
+ end
1010
+ end
1011
+ end
1012
+
1013
+ def test_sample
1014
+ FULL_IMPLS.each do |klass|
1015
+ impl = klass.new([1, 2, 3])
1016
+ (0..4).each do |i|
1017
+ sample = impl.sample(i)
1018
+ assert_equal(i > impl.size ? impl.size : i, sample.size,
1019
+ "Failed #{klass.name}#sample(#{i})")
1020
+ read = []
1021
+ sample.each do |el|
1022
+ assert(impl.include?(el))
1023
+ assert(!read.include?(el))
1024
+ read << el
1025
+ end
1026
+
1027
+ if i > 0
1028
+ # res will be Integer if sample always returns a same array
1029
+ # if not, res will be false.
1030
+ res = 10000.times do
1031
+ if sample != impl.sample(i)
1032
+ break false
1033
+ end
1034
+ end
1035
+ assert(!res)
1036
+ end
1037
+ end
1038
+ sample = impl.sample
1039
+ assert(impl.include?(sample))
1040
+
1041
+ impl = klass.new([])
1042
+ assert_equal(nil, impl.sample)
1043
+ assert_equal([], impl.sample(1))
1044
+ end
1045
+ NOSIZE_IMPLS.each do |klass|
1046
+ impl = klass.new([])
1047
+ assert_raise(NotImplementedError) { impl.sample(0) }
1048
+ assert_raise(NotImplementedError) { impl.sample }
1049
+ end
1050
+ end
1051
+
1052
+ def test_shuffle
1053
+ FULL_IMPLS.each do |klass|
1054
+ impl = klass.new([1, 2, 3, 4, 5])
1055
+ shuffle = impl.shuffle
1056
+ assert_equal(impl, shuffle.sort)
1057
+
1058
+ # res will be Integer if sample always returns a same array
1059
+ # if not, res will be false.
1060
+ res = 10000.times do
1061
+ break false if shuffle != impl.shuffle
1062
+ end
1063
+ assert(!res)
1064
+
1065
+ impl = klass.new([])
1066
+ assert_equal(impl, impl.shuffle)
1067
+ end
1068
+ NOSIZE_IMPLS.each do |klass|
1069
+ impl = klass.new([1, 2, 3, 4, 5])
1070
+ assert_raise(NotImplementedError) { impl.shuffle }
1071
+ end
1072
+ end
1073
+
1074
+ def test_slice_position
1075
+ FULL_IMPLS.each do |klass|
1076
+ impl = klass.new((0...10).to_a)
1077
+ assert_nil(impl.slice(-11))
1078
+ assert_equal(0, impl.slice(-10))
1079
+ assert_equal(9, impl.slice(-1))
1080
+ assert_equal(0, impl.slice(0))
1081
+ assert_equal(9, impl.slice(9))
1082
+ assert_nil(impl.slice(10))
1083
+ end
1084
+ NOSIZE_IMPLS.each do |klass|
1085
+ impl = klass.new((0...10).to_a)
1086
+ [-11, -10, -1].each do |pos|
1087
+ assert_raise NotImplementedError do
1088
+ impl.slice(pos)
1089
+ end
1090
+ end
1091
+
1092
+ assert_equal(0, impl.slice(0))
1093
+ assert_equal(9, impl.slice(9))
1094
+
1095
+ assert_raise ErrorForTest do
1096
+ impl.slice(10)
1097
+ end
1098
+ end
1099
+ end
1100
+
1101
+ def test_slice_range
1102
+ FULL_IMPLS.each do |klass|
1103
+ impl = klass.new((0...10).to_a)
1104
+ msg = "Error in #{klass.name}"
1105
+
1106
+ assert_equal(nil, impl.slice(-12..-11), msg)
1107
+ assert_equal(nil, impl.slice(-14..-10), msg)
1108
+ assert_equal([0, 1, 2], impl.slice(-10..-8), msg)
1109
+ assert_equal([8, 9], impl.slice(-2..-1), msg)
1110
+ assert_equal([1, 2, 3], impl.slice(-9..3), msg)
1111
+ assert_equal([0, 1], impl.slice(0..1), msg)
1112
+ assert_equal([8, 9], impl.slice(8..9), msg)
1113
+ assert_equal([8, 9], impl.slice(8..100), msg)
1114
+ assert_equal([], impl.slice(10..15), msg)
1115
+ assert_equal(nil, impl.slice(11..15), msg)
1116
+ assert_equal([], impl.slice(-1..-2), msg)
1117
+ assert_equal([], impl.slice(3..0), msg)
1118
+ assert_equal([], impl.slice(-1..1), msg)
1119
+ assert_equal(nil, impl.slice(15..14), msg)
1120
+ assert_equal(nil, impl.slice(-11..-20), msg)
1121
+ assert_equal(nil, impl.slice(15..5), msg)
1122
+ assert_equal([], impl.slice(-10..-20), msg)
1123
+ assert_equal([], impl.slice(1..-20), msg)
1124
+
1125
+ assert_equal(nil, impl.slice(-12...-10), msg)
1126
+ assert_equal(nil, impl.slice(-14...-9), msg)
1127
+ assert_equal([0, 1, 2], impl.slice(-10...-7), msg)
1128
+ assert_equal([], impl.slice(-2...0), msg)
1129
+ assert_equal([1, 2, 3], impl.slice(-9...4), msg)
1130
+ assert_equal([0, 1], impl.slice(0...2), msg)
1131
+ assert_equal([8, 9], impl.slice(8...10), msg)
1132
+ assert_equal([8, 9], impl.slice(8...100), msg)
1133
+ assert_equal([], impl.slice(10...15), msg)
1134
+ assert_equal(nil, impl.slice(11...15), msg)
1135
+ assert_equal([], impl.slice(-1...-1), msg)
1136
+ assert_equal([], impl.slice(0...0), msg)
1137
+ assert_equal([3, 4, 5, 6, 7, 8], impl.slice(3...-1), msg)
1138
+ assert_equal([], impl.slice(-1...2), msg)
1139
+ assert_equal(nil, impl.slice(16...15), msg)
1140
+ assert_equal(nil, impl.slice(-11...-20), msg)
1141
+ assert_equal(nil, impl.slice(15...5), msg)
1142
+ assert_equal([], impl.slice(-10...-20), msg)
1143
+ assert_equal([], impl.slice(1...-20), msg)
1144
+ end
1145
+ NOSIZE_IMPLS.each do |klass|
1146
+ impl = klass.new((0...10).to_a)
1147
+ [-12..-11, -14..-10, -10..-8, -2..-1, -1..1].each do |range|
1148
+ assert_raise NotImplementedError do
1149
+ impl.slice(range)
1150
+ end
1151
+ end
1152
+
1153
+ assert_equal([0, 1], impl.slice(0..1))
1154
+ assert_equal([8, 9], impl.slice(8..9))
1155
+ assert_equal([], impl.slice(15..10))
1156
+ assert_equal([], impl.slice(-1..-2))
1157
+
1158
+ [8..11, 10..15].each do |range|
1159
+ assert_raise ErrorForTest do
1160
+ impl.slice(range)
1161
+ end
1162
+ end
1163
+ end
1164
+ end
1165
+
1166
+ def test_to_a_and_to_ary
1167
+ FULL_IMPLS.each do |klass|
1168
+ ary = [1, 2, 3, 4, 5]
1169
+ impl = klass.new(ary)
1170
+ assert(ary.eql?(impl.to_a))
1171
+ assert(ary.eql?(impl.to_ary))
1172
+ end
1173
+ NOSIZE_IMPLS.each do |klass|
1174
+ impl = klass.new([])
1175
+ assert_raise(NotImplementedError) { impl.to_a }
1176
+ assert_raise(NotImplementedError) { impl.to_ary }
1177
+ end
1178
+ end
1179
+
1180
+ def test_transpose
1181
+ FULL_IMPLS.each do |klass|
1182
+ impl = klass.new([[1, 2], [3, 4], [5, 6]])
1183
+ assert_equal([[1, 3, 5], [2, 4, 6]], impl.transpose)
1184
+
1185
+ impl = klass.new([])
1186
+ assert_equal([], impl.transpose)
1187
+
1188
+ impl = klass.new([0])
1189
+ assert_raise(TypeError) { impl.transpose }
1190
+
1191
+ impl = klass.new([[1, 2], [3, 4, 5]])
1192
+ assert_raise(IndexError) { impl.transpose }
1193
+ end
1194
+ NOSIZE_IMPLS.each do |klass|
1195
+ impl = klass.new([])
1196
+ assert_raise(NotImplementedError) { impl.transpose }
1197
+ end
1198
+ end
1199
+
1200
+ def test_uniq
1201
+ FULL_IMPLS.each do |klass|
1202
+ impl = klass.new([1, 1, 1, 2, 1])
1203
+ assert_equal([1, 2], impl.uniq)
1204
+
1205
+ impl = klass.new([1, 1.0, Rational(1, 1)])
1206
+ assert_equal([1, 1.0, Rational(1, 1)], impl.uniq)
1207
+ uniq = impl.uniq { |n| n.to_i }
1208
+ assert_equal([1], uniq)
1209
+ end
1210
+ NOSIZE_IMPLS.each do |klass|
1211
+ impl = klass.new([])
1212
+ assert_raise(NotImplementedError) { impl.uniq }
1213
+ end
1214
+ end
1215
+
1216
+ def test_values_at
1217
+ FULL_IMPLS.each do |klass|
1218
+ msg = "Error in #{klass.name}"
1219
+ impl = klass.new([1, 2, 3, 4, 5])
1220
+ assert_equal([1, 3, 5], impl.values_at(0, 2, 4), msg)
1221
+ assert_equal([nil, 1, 5, 1, 5, nil, nil],
1222
+ impl.values_at(-6, -5, -1, 0, 4, 5, 100),
1223
+ msg)
1224
+ assert_equal([2, 3], impl.values_at(1..2), msg)
1225
+ assert_equal([4, 5, nil], impl.values_at(3..10), msg)
1226
+ assert_equal([], impl.values_at(6..7), msg)
1227
+ assert_equal([5, 4, 5, 1],
1228
+ impl.values_at(-1, 3..4, 0), msg)
1229
+ assert_equal([2, 3], impl.values_at(1...3), msg)
1230
+ assert_equal([4, 5], impl.values_at(3...11), msg)
1231
+ assert_equal([], impl.values_at(6...8), msg)
1232
+ assert_equal([5, 4, 5, 1],
1233
+ impl.values_at(-1, 3...5, 0), msg)
1234
+ end
1235
+ NOSIZE_IMPLS.each do |klass|
1236
+ impl = klass.new([1, 2, 3, 4, 5])
1237
+ assert_equal([1, 3, 5], impl.values_at(0, 2, 4))
1238
+ assert_raise(NotImplementedError) { impl.values_at(-6, 0) }
1239
+ assert_raise(ErrorForTest) { impl.values_at(0, 5) }
1240
+ assert_equal([2, 3], impl.values_at(1..2))
1241
+ assert_raise(ErrorForTest) { impl.values_at(3..10) }
1242
+ assert_raise(ErrorForTest) { impl.values_at(6..7) }
1243
+ assert_raise(NotImplementedError) { impl.values_at(-1, 3..4, 0) }
1244
+ end
1245
+ end
1246
+
1247
+ def test_zip
1248
+ FULL_IMPLS.each do |klass|
1249
+ impl = klass.new([1, 2, 3])
1250
+ assert_equal([[1, 4, 7], [2, 5, 8], [3, 6, 9]],
1251
+ impl.zip([4, 5, 6], [7, 8, 9]))
1252
+ end
1253
+ NOSIZE_IMPLS.each do |klass|
1254
+ impl = klass.new([])
1255
+ assert_raise(NotImplementedError) { impl.zip([]) }
1256
+ end
1257
+ end
1258
+
1259
+ def test_or
1260
+ FULL_IMPLS.each do |klass|
1261
+ impl = klass.new([1, 1, 4, 2, 3])
1262
+ assert_equal([1, 4, 2, 3, 5], impl | [4, 5, 5])
1263
+ end
1264
+ NOSIZE_IMPLS.each do |klass|
1265
+ impl = klass.new([])
1266
+ assert_raise(NotImplementedError) { impl | [] }
1267
+ end
1268
+ end
1269
+
1270
+ end
1271
+