array-compositing 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,1098 @@
1
+
2
+ require_relative '../../lib/array-compositing.rb'
3
+
4
+ describe ::Array::Compositing do
5
+
6
+ ################
7
+ # initialize #
8
+ ################
9
+
10
+ it 'can add initialize with an ancestor, inheriting its values and linking to it as a child' do
11
+
12
+ cascading_composite_array = ::Array::Compositing.new
13
+
14
+ cascading_composite_array.instance_variable_get( :@parent_composite_object ).should == nil
15
+ cascading_composite_array.should == [ ]
16
+ cascading_composite_array.push( :A, :B, :C, :D )
17
+
18
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
19
+ sub_cascading_composite_array.instance_variable_get( :@parent_composite_object ).should == cascading_composite_array
20
+ sub_cascading_composite_array.should == [ :A, :B, :C, :D ]
21
+
22
+ end
23
+
24
+ ##################################################################################################
25
+ # private #####################################################################################
26
+ ##################################################################################################
27
+
28
+ #########
29
+ # []= #
30
+ #########
31
+
32
+ it 'can add elements' do
33
+
34
+ cascading_composite_array = ::Array::Compositing.new
35
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
36
+
37
+ cascading_composite_array[ 0 ] = :A
38
+ cascading_composite_array.should == [ :A ]
39
+ sub_cascading_composite_array.should == [ :A ]
40
+
41
+ cascading_composite_array[ 1 ] = :B
42
+ cascading_composite_array.should == [ :A, :B ]
43
+ sub_cascading_composite_array.should == [ :A, :B ]
44
+
45
+ sub_cascading_composite_array[ 0 ] = :C
46
+ cascading_composite_array.should == [ :A, :B ]
47
+ sub_cascading_composite_array.should == [ :C, :B ]
48
+
49
+ sub_cascading_composite_array[ 0 ] = :B
50
+ cascading_composite_array.should == [ :A, :B ]
51
+ sub_cascading_composite_array.should == [ :B, :B ]
52
+
53
+ sub_cascading_composite_array[ 2 ] = :C
54
+ cascading_composite_array.should == [ :A, :B ]
55
+ sub_cascading_composite_array.should == [ :B, :B, :C ]
56
+
57
+ cascading_composite_array[ 0 ] = :D
58
+ cascading_composite_array.should == [ :D, :B ]
59
+ sub_cascading_composite_array.should == [ :B, :B, :C ]
60
+
61
+ end
62
+
63
+ ############
64
+ # insert #
65
+ ############
66
+
67
+ it 'can insert elements' do
68
+
69
+ cascading_composite_array = ::Array::Compositing.new
70
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
71
+
72
+ cascading_composite_array.insert( 3, :D )
73
+ cascading_composite_array.should == [ nil, nil, nil, :D ]
74
+ sub_cascading_composite_array.should == [ nil, nil, nil, :D ]
75
+
76
+ cascading_composite_array.insert( 1, :B )
77
+ cascading_composite_array.should == [ nil, :B, nil, nil, :D ]
78
+ sub_cascading_composite_array.should == [ nil, :B, nil, nil, :D ]
79
+
80
+ cascading_composite_array.insert( 2, :C )
81
+ cascading_composite_array.should == [ nil, :B, :C, nil, nil, :D ]
82
+ sub_cascading_composite_array.should == [ nil, :B, :C, nil, nil, :D ]
83
+
84
+ sub_cascading_composite_array.insert( 0, :E )
85
+ cascading_composite_array.should == [ nil, :B, :C, nil, nil, :D ]
86
+ sub_cascading_composite_array.should == [ :E, nil, :B, :C, nil, nil, :D ]
87
+
88
+ sub_cascading_composite_array.insert( 4, :F )
89
+ cascading_composite_array.should == [ nil, :B, :C, nil, nil, :D ]
90
+ sub_cascading_composite_array.should == [ :E, nil, :B, :C, :F, nil, nil, :D ]
91
+
92
+ end
93
+
94
+ ##########
95
+ # push #
96
+ # << #
97
+ ##########
98
+
99
+ it 'can add elements' do
100
+
101
+ cascading_composite_array = ::Array::Compositing.new
102
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
103
+
104
+ cascading_composite_array << :A
105
+ cascading_composite_array.should == [ :A ]
106
+ sub_cascading_composite_array.should == [ :A ]
107
+
108
+ cascading_composite_array << :B
109
+ cascading_composite_array.should == [ :A, :B ]
110
+ sub_cascading_composite_array.should == [ :A, :B ]
111
+
112
+ sub_cascading_composite_array << :C
113
+ cascading_composite_array.should == [ :A, :B ]
114
+ sub_cascading_composite_array.should == [ :A, :B, :C ]
115
+
116
+ sub_cascading_composite_array << :B
117
+ cascading_composite_array.should == [ :A, :B ]
118
+ sub_cascading_composite_array.should == [ :A, :B, :C, :B ]
119
+
120
+ end
121
+
122
+ ############
123
+ # concat #
124
+ # + #
125
+ ############
126
+
127
+ it 'can add elements' do
128
+
129
+ # NOTE: this breaks + by causing it to modify the array like +=
130
+ # The alternative was worse.
131
+
132
+ cascading_composite_array = ::Array::Compositing.new
133
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
134
+
135
+ cascading_composite_array.concat( [ :A ] )
136
+ cascading_composite_array.should == [ :A ]
137
+ sub_cascading_composite_array.should == [ :A ]
138
+
139
+ cascading_composite_array += [ :B ]
140
+ cascading_composite_array.should == [ :A, :B ]
141
+ sub_cascading_composite_array.should == [ :A, :B ]
142
+
143
+ sub_cascading_composite_array.concat( [ :C ] )
144
+ cascading_composite_array.should == [ :A, :B ]
145
+ sub_cascading_composite_array.should == [ :A, :B, :C ]
146
+
147
+ sub_cascading_composite_array += [ :B ]
148
+ cascading_composite_array.should == [ :A, :B ]
149
+ sub_cascading_composite_array.should == [ :A, :B, :C, :B ]
150
+
151
+ end
152
+
153
+ ####################
154
+ # delete_objects #
155
+ ####################
156
+
157
+ it 'can delete multiple elements' do
158
+
159
+ cascading_composite_array = ::Array::Compositing.new
160
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
161
+
162
+ cascading_composite_array += [ :A, :B ]
163
+ cascading_composite_array.should == [ :A, :B ]
164
+ sub_cascading_composite_array.should == [ :A, :B ]
165
+
166
+ cascading_composite_array.delete_objects( :A, :B )
167
+ cascading_composite_array.should == [ ]
168
+ sub_cascading_composite_array.should == [ ]
169
+
170
+ sub_cascading_composite_array += [ :B, :C, :D ]
171
+ cascading_composite_array.should == [ ]
172
+ sub_cascading_composite_array.should == [ :B, :C, :D ]
173
+
174
+ sub_cascading_composite_array.delete_objects( :C, :B )
175
+ cascading_composite_array.should == [ ]
176
+ sub_cascading_composite_array.should == [ :D ]
177
+
178
+ end
179
+
180
+ #######
181
+ # - #
182
+ #######
183
+
184
+ it 'can exclude elements' do
185
+
186
+ cascading_composite_array = ::Array::Compositing.new
187
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
188
+
189
+ cascading_composite_array.push( :A )
190
+ cascading_composite_array.should == [ :A ]
191
+ sub_cascading_composite_array.should == [ :A ]
192
+
193
+ cascading_composite_array -= [ :A ]
194
+ cascading_composite_array.should == [ ]
195
+ sub_cascading_composite_array.should == [ ]
196
+
197
+ cascading_composite_array.push( :B )
198
+ cascading_composite_array.should == [ :B ]
199
+ sub_cascading_composite_array.should == [ :B ]
200
+
201
+ sub_cascading_composite_array.push( :C )
202
+ cascading_composite_array.should == [ :B ]
203
+ sub_cascading_composite_array.should == [ :B, :C ]
204
+
205
+ sub_cascading_composite_array -= [ :B ]
206
+ cascading_composite_array.should == [ :B ]
207
+ sub_cascading_composite_array.should == [ :C ]
208
+
209
+ end
210
+
211
+ ############
212
+ # delete #
213
+ ############
214
+
215
+ it 'can delete elements' do
216
+
217
+ cascading_composite_array = ::Array::Compositing.new
218
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
219
+
220
+ cascading_composite_array.push( :A )
221
+ cascading_composite_array.should == [ :A ]
222
+ sub_cascading_composite_array.should == [ :A ]
223
+
224
+ cascading_composite_array.delete( :A )
225
+ cascading_composite_array.should == [ ]
226
+ sub_cascading_composite_array.should == [ ]
227
+
228
+ cascading_composite_array.push( :B )
229
+ cascading_composite_array.should == [ :B ]
230
+ sub_cascading_composite_array.should == [ :B ]
231
+
232
+ sub_cascading_composite_array.push( :C )
233
+ cascading_composite_array.should == [ :B ]
234
+ sub_cascading_composite_array.should == [ :B, :C ]
235
+
236
+ sub_cascading_composite_array.delete( :B )
237
+ cascading_composite_array.should == [ :B ]
238
+ sub_cascading_composite_array.should == [ :C ]
239
+
240
+ end
241
+
242
+ ###############
243
+ # delete_at #
244
+ ###############
245
+
246
+ it 'can delete by indexes' do
247
+
248
+ cascading_composite_array = ::Array::Compositing.new
249
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
250
+
251
+ cascading_composite_array.push( :A )
252
+ cascading_composite_array.should == [ :A ]
253
+ sub_cascading_composite_array.should == [ :A ]
254
+
255
+ cascading_composite_array.delete_at( 0 )
256
+ cascading_composite_array.should == [ ]
257
+ sub_cascading_composite_array.should == [ ]
258
+
259
+ cascading_composite_array.push( :B )
260
+ cascading_composite_array.should == [ :B ]
261
+ sub_cascading_composite_array.should == [ :B ]
262
+
263
+ sub_cascading_composite_array.push( :C )
264
+ cascading_composite_array.should == [ :B ]
265
+ sub_cascading_composite_array.should == [ :B, :C ]
266
+
267
+ sub_cascading_composite_array.delete_at( 0 )
268
+ cascading_composite_array.should == [ :B ]
269
+ sub_cascading_composite_array.should == [ :C ]
270
+
271
+ end
272
+
273
+ #######################
274
+ # delete_at_indexes #
275
+ #######################
276
+
277
+ it 'can delete by indexes' do
278
+
279
+ cascading_composite_array = ::Array::Compositing.new
280
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
281
+
282
+ cascading_composite_array.push( :A, :B, :C )
283
+ cascading_composite_array.should == [ :A, :B, :C ]
284
+ sub_cascading_composite_array.should == [ :A, :B, :C ]
285
+
286
+ cascading_composite_array.delete_at_indexes( 0, 1 )
287
+ cascading_composite_array.should == [ :C ]
288
+ sub_cascading_composite_array.should == [ :C ]
289
+
290
+ sub_cascading_composite_array.push( :C, :B )
291
+ cascading_composite_array.should == [ :C ]
292
+ sub_cascading_composite_array.should == [ :C, :C, :B ]
293
+
294
+ sub_cascading_composite_array.delete_at_indexes( 0, 1, 2 )
295
+ cascading_composite_array.should == [ :C ]
296
+ sub_cascading_composite_array.should == [ ]
297
+
298
+ end
299
+
300
+ ###############
301
+ # delete_if #
302
+ ###############
303
+
304
+ it 'can delete by block' do
305
+
306
+ cascading_composite_array = ::Array::Compositing.new
307
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
308
+
309
+ cascading_composite_array.push( :A, :B, :C )
310
+ cascading_composite_array.should == [ :A, :B, :C ]
311
+ sub_cascading_composite_array.should == [ :A, :B, :C ]
312
+ cascading_composite_array.delete_if do |object|
313
+ object != :C
314
+ end
315
+ cascading_composite_array.should == [ :C ]
316
+ sub_cascading_composite_array.should == [ :C ]
317
+
318
+ sub_cascading_composite_array.push( :C, :B )
319
+ cascading_composite_array.should == [ :C ]
320
+ sub_cascading_composite_array.should == [ :C, :C, :B ]
321
+ sub_cascading_composite_array.delete_if do |object|
322
+ object != nil
323
+ end
324
+ sub_cascading_composite_array.should == [ ]
325
+ cascading_composite_array.should == [ :C ]
326
+
327
+ cascading_composite_array.delete_if.is_a?( Enumerator ).should == true
328
+
329
+ end
330
+
331
+ #############
332
+ # keep_if #
333
+ #############
334
+
335
+ it 'can keep by block' do
336
+
337
+ cascading_composite_array = ::Array::Compositing.new
338
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
339
+
340
+ cascading_composite_array.push( :A, :B, :C )
341
+ cascading_composite_array.should == [ :A, :B, :C ]
342
+ sub_cascading_composite_array.should == [ :A, :B, :C ]
343
+ cascading_composite_array.keep_if do |object|
344
+ object == :C
345
+ end
346
+ cascading_composite_array.should == [ :C ]
347
+ sub_cascading_composite_array.should == [ :C ]
348
+
349
+ sub_cascading_composite_array.push( :C, :B )
350
+ cascading_composite_array.should == [ :C ]
351
+ sub_cascading_composite_array.should == [ :C, :C, :B ]
352
+ sub_cascading_composite_array.keep_if do |object|
353
+ object == nil
354
+ end
355
+ cascading_composite_array.should == [ :C ]
356
+ sub_cascading_composite_array.should == [ ]
357
+
358
+ end
359
+
360
+ ##############
361
+ # compact! #
362
+ ##############
363
+
364
+ it 'can compact' do
365
+
366
+ cascading_composite_array = ::Array::Compositing.new
367
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
368
+
369
+ cascading_composite_array.push( :A, nil, :B, nil, :C, nil )
370
+ cascading_composite_array.should == [ :A, nil, :B, nil, :C, nil ]
371
+ sub_cascading_composite_array.should == [ :A, nil, :B, nil, :C, nil ]
372
+ cascading_composite_array.compact!
373
+ cascading_composite_array.should == [ :A, :B, :C ]
374
+ sub_cascading_composite_array.should == [ :A, :B, :C ]
375
+
376
+ sub_cascading_composite_array.push( nil, nil, :D )
377
+ cascading_composite_array.should == [ :A, :B, :C ]
378
+ sub_cascading_composite_array.should == [ :A, :B, :C, nil, nil, :D ]
379
+ sub_cascading_composite_array.compact!
380
+ cascading_composite_array.should == [ :A, :B, :C ]
381
+ sub_cascading_composite_array.should == [ :A, :B, :C, :D ]
382
+
383
+ end
384
+
385
+ ##############
386
+ # flatten! #
387
+ ##############
388
+
389
+ it 'can flatten' do
390
+
391
+ cascading_composite_array = ::Array::Compositing.new
392
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
393
+
394
+ cascading_composite_array.push( :A, [ :F_A, :F_B ], :B, [ :F_C ], :C, [ :F_D ], [ :F_E ] )
395
+ cascading_composite_array.should == [ :A, [ :F_A, :F_B ], :B, [ :F_C ], :C, [ :F_D ], [ :F_E ] ]
396
+ sub_cascading_composite_array.should == [ :A, [ :F_A, :F_B ], :B, [ :F_C ], :C, [ :F_D ], [ :F_E ] ]
397
+ cascading_composite_array.flatten!
398
+ cascading_composite_array.should == [ :A, :F_A, :F_B, :B, :F_C, :C, :F_D, :F_E ]
399
+ sub_cascading_composite_array.should == [ :A, :F_A, :F_B, :B, :F_C, :C, :F_D, :F_E ]
400
+
401
+ sub_cascading_composite_array.push( [ :F_F, :F_G ], :D, [ :F_H ] )
402
+ cascading_composite_array.should == [ :A, :F_A, :F_B, :B, :F_C, :C, :F_D, :F_E ]
403
+ sub_cascading_composite_array.should == [ :A, :F_A, :F_B, :B, :F_C, :C, :F_D, :F_E, [ :F_F, :F_G ], :D, [ :F_H ] ]
404
+ sub_cascading_composite_array.flatten!
405
+ cascading_composite_array.should == [ :A, :F_A, :F_B, :B, :F_C, :C, :F_D, :F_E ]
406
+ sub_cascading_composite_array.should == [ :A, :F_A, :F_B, :B, :F_C, :C, :F_D, :F_E, :F_F, :F_G, :D, :F_H ]
407
+
408
+ end
409
+
410
+ #############
411
+ # reject! #
412
+ #############
413
+
414
+ it 'can reject' do
415
+
416
+ cascading_composite_array = ::Array::Compositing.new
417
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
418
+
419
+ cascading_composite_array.push( :A, :B, :C )
420
+ cascading_composite_array.should == [ :A, :B, :C ]
421
+ sub_cascading_composite_array.should == [ :A, :B, :C ]
422
+ cascading_composite_array.reject! do |object|
423
+ object != :C
424
+ end
425
+ cascading_composite_array.should == [ :C ]
426
+ sub_cascading_composite_array.should == [ :C ]
427
+
428
+ sub_cascading_composite_array.push( :C, :B )
429
+ cascading_composite_array.should == [ :C ]
430
+ sub_cascading_composite_array.should == [ :C, :C, :B ]
431
+ sub_cascading_composite_array.reject! do |object|
432
+ object != nil
433
+ end
434
+ sub_cascading_composite_array.should == [ ]
435
+ cascading_composite_array.should == [ :C ]
436
+
437
+ cascading_composite_array.reject!.is_a?( Enumerator ).should == true
438
+
439
+ end
440
+
441
+ #############
442
+ # replace #
443
+ #############
444
+
445
+ it 'can replace self' do
446
+
447
+ cascading_composite_array = ::Array::Compositing.new
448
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
449
+
450
+ cascading_composite_array.push( :A, :B, :C )
451
+ cascading_composite_array.should == [ :A, :B, :C ]
452
+ sub_cascading_composite_array.should == [ :A, :B, :C ]
453
+ cascading_composite_array.replace( [ :D, :E, :F ] )
454
+ cascading_composite_array.should == [ :D, :E, :F ]
455
+ sub_cascading_composite_array.should == [ :D, :E, :F ]
456
+
457
+ cascading_composite_array.should == [ :D, :E, :F ]
458
+ sub_cascading_composite_array.should == [ :D, :E, :F ]
459
+ sub_cascading_composite_array.replace( [ :G, :H, :I ] )
460
+ cascading_composite_array.should == [ :D, :E, :F ]
461
+ sub_cascading_composite_array.should == [ :G, :H, :I ]
462
+
463
+ end
464
+
465
+ ##############
466
+ # reverse! #
467
+ ##############
468
+
469
+ it 'can reverse self' do
470
+
471
+ cascading_composite_array = ::Array::Compositing.new
472
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
473
+
474
+ cascading_composite_array.push( :A, :B, :C )
475
+ cascading_composite_array.should == [ :A, :B, :C ]
476
+ sub_cascading_composite_array.should == [ :A, :B, :C ]
477
+ cascading_composite_array.reverse!
478
+ cascading_composite_array.should == [ :C, :B, :A ]
479
+ sub_cascading_composite_array.should == [ :C, :B, :A ]
480
+
481
+ cascading_composite_array.should == [ :C, :B, :A ]
482
+ sub_cascading_composite_array.should == [ :C, :B, :A ]
483
+ sub_cascading_composite_array.reverse!
484
+ cascading_composite_array.should == [ :C, :B, :A ]
485
+ sub_cascading_composite_array.should == [ :A, :B, :C ]
486
+
487
+ end
488
+
489
+ #############
490
+ # rotate! #
491
+ #############
492
+
493
+ it 'can rotate self' do
494
+
495
+ cascading_composite_array = ::Array::Compositing.new
496
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
497
+
498
+ cascading_composite_array.push( :A, :B, :C )
499
+ cascading_composite_array.should == [ :A, :B, :C ]
500
+ sub_cascading_composite_array.should == [ :A, :B, :C ]
501
+
502
+ cascading_composite_array.rotate!
503
+ cascading_composite_array.should == [ :B, :C, :A ]
504
+ sub_cascading_composite_array.should == [ :B, :C, :A ]
505
+
506
+ cascading_composite_array.rotate!( -1 )
507
+ cascading_composite_array.should == [ :A, :B, :C ]
508
+ sub_cascading_composite_array.should == [ :A, :B, :C ]
509
+
510
+ sub_cascading_composite_array.rotate!( 2 )
511
+ cascading_composite_array.should == [ :A, :B, :C ]
512
+ sub_cascading_composite_array.should == [ :C, :A, :B ]
513
+
514
+ end
515
+
516
+ #############
517
+ # select! #
518
+ #############
519
+
520
+ it 'can keep by select' do
521
+
522
+ cascading_composite_array = ::Array::Compositing.new
523
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
524
+
525
+ cascading_composite_array.push( :A, :B, :C )
526
+ cascading_composite_array.should == [ :A, :B, :C ]
527
+ sub_cascading_composite_array.should == [ :A, :B, :C ]
528
+ cascading_composite_array.select! do |object|
529
+ object == :C
530
+ end
531
+ cascading_composite_array.should == [ :C ]
532
+ sub_cascading_composite_array.should == [ :C ]
533
+
534
+ sub_cascading_composite_array.push( :C, :B )
535
+ cascading_composite_array.should == [ :C ]
536
+ sub_cascading_composite_array.should == [ :C, :C, :B ]
537
+ sub_cascading_composite_array.select! do |object|
538
+ object == nil
539
+ end
540
+ cascading_composite_array.should == [ :C ]
541
+ sub_cascading_composite_array.should == [ ]
542
+
543
+ cascading_composite_array.select!.is_a?( Enumerator ).should == true
544
+
545
+ end
546
+
547
+ ##############
548
+ # shuffle! #
549
+ ##############
550
+
551
+ it 'can shuffle self' do
552
+
553
+ cascading_composite_array = ::Array::Compositing.new
554
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
555
+
556
+ cascading_composite_array.push( :A, :B, :C )
557
+ cascading_composite_array.should == [ :A, :B, :C ]
558
+ sub_cascading_composite_array.should == cascading_composite_array
559
+
560
+ prior_version = cascading_composite_array.dup
561
+ attempts = [ ]
562
+ 50.times do
563
+ cascading_composite_array.shuffle!
564
+ attempts.push( cascading_composite_array == prior_version )
565
+ prior_version = cascading_composite_array.dup
566
+ end
567
+ attempts_correct = attempts.select { |member| member == false }.count
568
+ ( attempts_correct >= 10 ).should == true
569
+ sub_cascading_composite_array.should == cascading_composite_array
570
+ first_shuffle_version = cascading_composite_array
571
+
572
+ cascading_composite_array.should == first_shuffle_version
573
+ attempts = [ ]
574
+ 50.times do
575
+ sub_cascading_composite_array.shuffle!
576
+ attempts.push( sub_cascading_composite_array == cascading_composite_array )
577
+ prior_version = cascading_composite_array.dup
578
+ end
579
+ attempts_correct = attempts.select { |member| member == false }.count
580
+ ( attempts_correct >= 10 ).should == true
581
+
582
+ end
583
+
584
+ ##############
585
+ # collect! #
586
+ # map! #
587
+ ##############
588
+
589
+ it 'can replace by collect/map' do
590
+
591
+ cascading_composite_array = ::Array::Compositing.new
592
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
593
+
594
+ cascading_composite_array.push( :A, :B, :C )
595
+ cascading_composite_array.should == [ :A, :B, :C ]
596
+ sub_cascading_composite_array.should == [ :A, :B, :C ]
597
+ cascading_composite_array.collect! do |object|
598
+ :C
599
+ end
600
+ cascading_composite_array.should == [ :C, :C, :C ]
601
+ sub_cascading_composite_array.should == [ :C, :C, :C ]
602
+
603
+ sub_cascading_composite_array.collect! do |object|
604
+ :A
605
+ end
606
+ cascading_composite_array.should == [ :C, :C, :C ]
607
+ sub_cascading_composite_array.should == [ :A, :A, :A ]
608
+
609
+ cascading_composite_array.collect!.is_a?( Enumerator ).should == true
610
+
611
+ end
612
+
613
+ ###########
614
+ # sort! #
615
+ ###########
616
+
617
+ it 'can replace by collect/map' do
618
+
619
+ cascading_composite_array = ::Array::Compositing.new
620
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
621
+
622
+ cascading_composite_array.push( :A, :B, :C )
623
+ cascading_composite_array.should == [ :A, :B, :C ]
624
+ sub_cascading_composite_array.should == [ :A, :B, :C ]
625
+ cascading_composite_array.sort! do |a, b|
626
+ if a < b
627
+ 1
628
+ elsif a > b
629
+ -1
630
+ elsif a == b
631
+ 0
632
+ end
633
+ end
634
+ cascading_composite_array.should == [ :C, :B, :A ]
635
+ sub_cascading_composite_array.should == [ :C, :B, :A ]
636
+
637
+ sub_cascading_composite_array.sort! do |a, b|
638
+ if a < b
639
+ -1
640
+ elsif a > b
641
+ 1
642
+ elsif a == b
643
+ 0
644
+ end
645
+ end
646
+ cascading_composite_array.should == [ :C, :B, :A ]
647
+ sub_cascading_composite_array.should == [ :A, :B, :C ]
648
+
649
+ cascading_composite_array.sort!
650
+ cascading_composite_array.should == [ :A, :B, :C ]
651
+ sub_cascading_composite_array.should == [ :A, :B, :C ]
652
+
653
+ end
654
+
655
+ ##############
656
+ # sort_by! #
657
+ ##############
658
+
659
+ it 'can replace by collect/map' do
660
+
661
+ cascading_composite_array = ::Array::Compositing.new
662
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
663
+
664
+ cascading_composite_array.push( :A, :B, :C )
665
+ cascading_composite_array.should == [ :A, :B, :C ]
666
+ sub_cascading_composite_array.should == [ :A, :B, :C ]
667
+ cascading_composite_array.sort_by! do |object|
668
+ case object
669
+ when :A
670
+ :B
671
+ when :B
672
+ :A
673
+ when :C
674
+ :C
675
+ end
676
+ end
677
+ cascading_composite_array.should == [ :B, :A, :C ]
678
+ sub_cascading_composite_array.should == [ :B, :A, :C ]
679
+
680
+ sub_cascading_composite_array.sort_by! do |object|
681
+ case object
682
+ when :A
683
+ :C
684
+ when :B
685
+ :B
686
+ when :C
687
+ :A
688
+ end
689
+ end
690
+ cascading_composite_array.should == [ :B, :A, :C ]
691
+ sub_cascading_composite_array.should == [ :C, :B, :A ]
692
+
693
+ cascading_composite_array.sort_by!.is_a?( Enumerator ).should == true
694
+
695
+ end
696
+
697
+ ###########
698
+ # uniq! #
699
+ ###########
700
+
701
+ it 'can remove non-unique elements' do
702
+
703
+ cascading_composite_array = ::Array::Compositing.new
704
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
705
+
706
+ cascading_composite_array.push( :A, :B, :C, :C, :C, :B, :A )
707
+ cascading_composite_array.should == [ :A, :B, :C, :C, :C, :B, :A ]
708
+ sub_cascading_composite_array.should == [ :A, :B, :C, :C, :C, :B, :A ]
709
+ cascading_composite_array.uniq!
710
+ cascading_composite_array.should == [ :A, :B, :C ]
711
+ sub_cascading_composite_array.should == [ :A, :B, :C ]
712
+
713
+ sub_cascading_composite_array.push( :C, :B )
714
+ cascading_composite_array.should == [ :A, :B, :C ]
715
+ sub_cascading_composite_array.should == [ :A, :B, :C, :C, :B ]
716
+ sub_cascading_composite_array.uniq!
717
+ cascading_composite_array.should == [ :A, :B, :C ]
718
+ sub_cascading_composite_array.should == [ :A, :B, :C ]
719
+
720
+ end
721
+
722
+ #############
723
+ # unshift #
724
+ #############
725
+
726
+ it 'can unshift onto the first element' do
727
+
728
+ cascading_composite_array = ::Array::Compositing.new
729
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
730
+
731
+ cascading_composite_array += :A
732
+ cascading_composite_array.should == [ :A ]
733
+ sub_cascading_composite_array.should == [ :A ]
734
+
735
+ cascading_composite_array.unshift( :B )
736
+ cascading_composite_array.should == [ :B, :A ]
737
+ sub_cascading_composite_array.should == [ :B, :A ]
738
+
739
+ sub_cascading_composite_array.unshift( :C )
740
+ cascading_composite_array.should == [ :B, :A ]
741
+ sub_cascading_composite_array.should == [ :C, :B, :A ]
742
+
743
+ end
744
+
745
+ #########
746
+ # pop #
747
+ #########
748
+
749
+ it 'can pop the final element' do
750
+
751
+ cascading_composite_array = ::Array::Compositing.new
752
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
753
+
754
+ cascading_composite_array += :A
755
+ cascading_composite_array.should == [ :A ]
756
+ sub_cascading_composite_array.should == [ :A ]
757
+
758
+ cascading_composite_array.pop.should == :A
759
+ cascading_composite_array.should == [ ]
760
+ sub_cascading_composite_array.should == [ ]
761
+
762
+ cascading_composite_array += :B
763
+ cascading_composite_array.should == [ :B ]
764
+ sub_cascading_composite_array.should == [ :B ]
765
+
766
+ sub_cascading_composite_array += :C
767
+ cascading_composite_array.should == [ :B ]
768
+ sub_cascading_composite_array.should == [ :B, :C ]
769
+ sub_cascading_composite_array.pop.should == :C
770
+ cascading_composite_array.should == [ :B ]
771
+ sub_cascading_composite_array.should == [ :B ]
772
+
773
+ end
774
+
775
+ ###########
776
+ # shift #
777
+ ###########
778
+
779
+ it 'can shift the first element' do
780
+
781
+ cascading_composite_array = ::Array::Compositing.new
782
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
783
+
784
+ cascading_composite_array += :A
785
+ cascading_composite_array.should == [ :A ]
786
+ sub_cascading_composite_array.should == [ :A ]
787
+
788
+ cascading_composite_array.shift.should == :A
789
+ cascading_composite_array.should == [ ]
790
+ sub_cascading_composite_array.should == [ ]
791
+
792
+ cascading_composite_array += :B
793
+ cascading_composite_array.should == [ :B ]
794
+ sub_cascading_composite_array.should == [ :B ]
795
+
796
+ sub_cascading_composite_array += :C
797
+ cascading_composite_array.should == [ :B ]
798
+ sub_cascading_composite_array.should == [ :B, :C ]
799
+ sub_cascading_composite_array.shift.should == :B
800
+ cascading_composite_array.should == [ :B ]
801
+ sub_cascading_composite_array.should == [ :C ]
802
+
803
+ end
804
+
805
+ ############
806
+ # slice! #
807
+ ############
808
+
809
+ it 'can slice elements' do
810
+
811
+ cascading_composite_array = ::Array::Compositing.new
812
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
813
+
814
+ cascading_composite_array += :A
815
+ cascading_composite_array.should == [ :A ]
816
+ sub_cascading_composite_array.should == [ :A ]
817
+
818
+ cascading_composite_array.slice!( 0, 1 ).should == [ :A ]
819
+ cascading_composite_array.should == [ ]
820
+ sub_cascading_composite_array.should == [ ]
821
+
822
+ cascading_composite_array += :B
823
+ cascading_composite_array.should == [ :B ]
824
+ sub_cascading_composite_array.should == [ :B ]
825
+
826
+ sub_cascading_composite_array += :C
827
+ cascading_composite_array.should == [ :B ]
828
+ sub_cascading_composite_array.should == [ :B, :C ]
829
+
830
+ sub_cascading_composite_array.slice!( 0, 1 ).should == [ :B ]
831
+ cascading_composite_array.should == [ :B ]
832
+ sub_cascading_composite_array.should == [ :C ]
833
+
834
+ end
835
+
836
+ ###########
837
+ # clear #
838
+ ###########
839
+
840
+ it 'can clear, causing present elements to be excluded' do
841
+
842
+ cascading_composite_array = ::Array::Compositing.new
843
+ sub_cascading_composite_array = ::Array::Compositing.new( cascading_composite_array )
844
+
845
+ cascading_composite_array += :A
846
+ cascading_composite_array.should == [ :A ]
847
+ sub_cascading_composite_array.should == [ :A ]
848
+
849
+ cascading_composite_array.clear
850
+ cascading_composite_array.should == [ ]
851
+ sub_cascading_composite_array.should == [ ]
852
+
853
+ cascading_composite_array += :B
854
+ cascading_composite_array.should == [ :B ]
855
+ sub_cascading_composite_array.should == [ :B ]
856
+
857
+ sub_cascading_composite_array += :C
858
+ cascading_composite_array.should == [ :B ]
859
+ sub_cascading_composite_array.should == [ :B, :C ]
860
+
861
+ sub_cascading_composite_array.clear
862
+ cascading_composite_array.should == [ :B ]
863
+ sub_cascading_composite_array.should == [ ]
864
+
865
+ end
866
+
867
+ ##################
868
+ # pre_set_hook #
869
+ ##################
870
+
871
+ it 'has a hook that is called before setting a value; return value is used in place of object' do
872
+
873
+ class ::Array::Compositing::SubMockPreSet < ::Array::Compositing
874
+
875
+ def pre_set_hook( index, object, is_insert = false )
876
+ return :some_other_value
877
+ end
878
+
879
+ end
880
+
881
+ cascading_composite_array = ::Array::Compositing::SubMockPreSet.new
882
+
883
+ cascading_composite_array.push( :some_value )
884
+
885
+ cascading_composite_array.should == [ :some_other_value ]
886
+
887
+ end
888
+
889
+ ###################
890
+ # post_set_hook #
891
+ ###################
892
+
893
+ it 'has a hook that is called after setting a value' do
894
+
895
+ class ::Array::Compositing::SubMockPostSet < ::Array::Compositing
896
+
897
+ def post_set_hook( index, object, is_insert = false )
898
+ return :some_other_value
899
+ end
900
+
901
+ end
902
+
903
+ cascading_composite_array = ::Array::Compositing::SubMockPostSet.new
904
+
905
+ cascading_composite_array.push( :some_value ).should == [ :some_other_value ]
906
+
907
+ cascading_composite_array.should == [ :some_value ]
908
+
909
+ end
910
+
911
+ ##################
912
+ # pre_get_hook #
913
+ ##################
914
+
915
+ it 'has a hook that is called before getting a value; if return value is false, get does not occur' do
916
+
917
+ class ::Array::Compositing::SubMockPreGet < ::Array::Compositing
918
+
919
+ def pre_get_hook( index )
920
+ return false
921
+ end
922
+
923
+ end
924
+
925
+ cascading_composite_array = ::Array::Compositing::SubMockPreGet.new
926
+
927
+ cascading_composite_array.push( :some_value )
928
+ cascading_composite_array[ 0 ].should == nil
929
+
930
+ cascading_composite_array.should == [ :some_value ]
931
+
932
+ end
933
+
934
+ ###################
935
+ # post_get_hook #
936
+ ###################
937
+
938
+ it 'has a hook that is called after getting a value' do
939
+
940
+ class ::Array::Compositing::SubMockPostGet < ::Array::Compositing
941
+
942
+ def post_get_hook( index, object )
943
+ return :some_other_value
944
+ end
945
+
946
+ end
947
+
948
+ cascading_composite_array = ::Array::Compositing::SubMockPostGet.new
949
+
950
+ cascading_composite_array.push( :some_value )
951
+ cascading_composite_array[ 0 ].should == :some_other_value
952
+
953
+ cascading_composite_array.should == [ :some_value ]
954
+
955
+ end
956
+
957
+ #####################
958
+ # pre_delete_hook #
959
+ #####################
960
+
961
+ it 'has a hook that is called before deleting an index; if return value is false, delete does not occur' do
962
+
963
+ class ::Array::Compositing::SubMockPreDelete < ::Array::Compositing
964
+
965
+ def pre_delete_hook( index )
966
+ return false
967
+ end
968
+
969
+ end
970
+
971
+ cascading_composite_array = ::Array::Compositing::SubMockPreDelete.new
972
+
973
+ cascading_composite_array.push( :some_value )
974
+ cascading_composite_array.delete_at( 0 )
975
+
976
+ cascading_composite_array.should == [ :some_value ]
977
+
978
+ end
979
+
980
+ ######################
981
+ # post_delete_hook #
982
+ ######################
983
+
984
+ it 'has a hook that is called after deleting an index' do
985
+
986
+ class ::Array::Compositing::SubMockPostDelete < ::Array::Compositing
987
+
988
+ def post_delete_hook( index, object )
989
+ return :some_other_value
990
+ end
991
+
992
+ end
993
+
994
+ cascading_composite_array = ::Array::Compositing::SubMockPostDelete.new
995
+
996
+ cascading_composite_array.push( :some_value )
997
+ cascading_composite_array.delete_at( 0 ).should == :some_other_value
998
+
999
+ cascading_composite_array.should == [ ]
1000
+
1001
+ end
1002
+
1003
+ ########################
1004
+ # child_pre_set_hook #
1005
+ ########################
1006
+
1007
+ it 'has a hook that is called before setting a value that has been passed by a parent; return value is used in place of object' do
1008
+
1009
+ class ::Array::Compositing::SubMockChildPreSet < ::Array::Compositing
1010
+
1011
+ def child_pre_set_hook( index, object, is_insert = false )
1012
+ return :some_other_value
1013
+ end
1014
+
1015
+ end
1016
+
1017
+ cascading_composite_array = ::Array::Compositing::SubMockChildPreSet.new
1018
+ sub_cascading_composite_array = ::Array::Compositing::SubMockChildPreSet.new( cascading_composite_array )
1019
+ cascading_composite_array.push( :some_value )
1020
+
1021
+ sub_cascading_composite_array.should == [ :some_other_value ]
1022
+
1023
+ end
1024
+
1025
+ #########################
1026
+ # child_post_set_hook #
1027
+ #########################
1028
+
1029
+ it 'has a hook that is called after setting a value passed by a parent' do
1030
+
1031
+ class ::Array::Compositing::SubMockChildPostSet < ::Array::Compositing
1032
+
1033
+ def child_post_set_hook( index, object, is_insert = false )
1034
+ push( :some_other_value )
1035
+ end
1036
+
1037
+ end
1038
+
1039
+ cascading_composite_array = ::Array::Compositing::SubMockChildPostSet.new
1040
+ sub_cascading_composite_array = ::Array::Compositing::SubMockChildPostSet.new( cascading_composite_array )
1041
+ cascading_composite_array.push( :some_value )
1042
+
1043
+ cascading_composite_array.should == [ :some_value ]
1044
+ sub_cascading_composite_array.should == [ :some_value, :some_other_value ]
1045
+
1046
+ end
1047
+
1048
+ ###########################
1049
+ # child_pre_delete_hook #
1050
+ ###########################
1051
+
1052
+ it 'has a hook that is called before deleting an index that has been passed by a parent; if return value is false, delete does not occur' do
1053
+
1054
+ class ::Array::Compositing::SubMockChildPreDelete < ::Array::Compositing
1055
+
1056
+ def child_pre_delete_hook( index )
1057
+ false
1058
+ end
1059
+
1060
+ end
1061
+
1062
+ cascading_composite_array = ::Array::Compositing::SubMockChildPreDelete.new
1063
+ sub_cascading_composite_array = ::Array::Compositing::SubMockChildPreDelete.new( cascading_composite_array )
1064
+ cascading_composite_array.push( :some_value )
1065
+ cascading_composite_array.delete( :some_value )
1066
+
1067
+ cascading_composite_array.should == [ ]
1068
+
1069
+ sub_cascading_composite_array.should == [ :some_value ]
1070
+
1071
+ end
1072
+
1073
+ ############################
1074
+ # child_post_delete_hook #
1075
+ ############################
1076
+
1077
+ it 'has a hook that is called after deleting an index passed by a parent' do
1078
+
1079
+ class ::Array::Compositing::SubMockChildPostDelete < ::Array::Compositing
1080
+
1081
+ def child_post_delete_hook( index, object )
1082
+ delete( :some_other_value )
1083
+ end
1084
+
1085
+ end
1086
+
1087
+ cascading_composite_array = ::Array::Compositing::SubMockChildPostDelete.new
1088
+ sub_cascading_composite_array = ::Array::Compositing::SubMockChildPostDelete.new( cascading_composite_array )
1089
+ cascading_composite_array.push( :some_value )
1090
+ sub_cascading_composite_array.push( :some_other_value )
1091
+ cascading_composite_array.delete( :some_value )
1092
+
1093
+ cascading_composite_array.should == [ ]
1094
+ sub_cascading_composite_array.should == [ ]
1095
+
1096
+ end
1097
+
1098
+ end