compositing-array-sorted 1.0.10

Sign up to get free protection for your applications and to get access to all the features.
@@ -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