compositing-array-sorted 1.0.10

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