@@ -75,3 +75,172 @@ test('@aureooms/js-fingertree github issue #73', t => {
75
75
t . deepEqual ( list ( s ) , list ( 'ab' + c + 'de' ) ) ;
76
76
}
77
77
} ) ;
78
+
79
+ test ( 'Seq#slice' , t => {
80
+
81
+ const s = Seq . from ( 'abcde' ) ;
82
+ t . deepEqual ( list ( 'abcde' ) , list ( s . slice ( 0 , 5 ) ) ) ;
83
+ t . deepEqual ( list ( 'abcd' ) , list ( s . slice ( 0 , 4 ) ) ) ;
84
+ t . deepEqual ( list ( 'bcde' ) , list ( s . slice ( 1 , 5 ) ) ) ;
85
+ t . deepEqual ( list ( 'bcd' ) , list ( s . slice ( 1 , 4 ) ) ) ;
86
+ t . deepEqual ( list ( 'cde' ) , list ( s . slice ( 2 , 5 ) ) ) ;
87
+
88
+ } ) ;
89
+
90
+ // Examples from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice
91
+ test ( 'Seq#slice (MDN Return a portion of an existing array)' , t => {
92
+ const fruits = Seq . from ( [ 'Banana' , 'Orange' , 'Lemon' , 'Apple' , 'Mango' ] ) ;
93
+ const citrus = fruits . slice ( 1 , 3 ) ;
94
+
95
+ t . deepEqual ( [ 'Banana' , 'Orange' , 'Lemon' , 'Apple' , 'Mango' ] , list ( fruits ) ) ;
96
+ t . deepEqual ( [ 'Orange' , 'Lemon' ] , list ( citrus ) ) ;
97
+ } ) ;
98
+
99
+ test ( 'Seq#slice (MDN Using slice)' , t => {
100
+
101
+ const myHonda = { color : 'red' , wheels : 4 , engine : { cylinders : 4 , size : 2.2 } }
102
+ const myCar = Seq . from ( [ myHonda , 2 , 'cherry condition' , 'purchased 1997' ] ) ;
103
+ const newCar = myCar . slice ( 0 , 2 )
104
+
105
+ t . deepEqual ( [ myHonda , 2 , 'cherry condition' , 'purchased 1997' ] , list ( myCar ) ) ;
106
+ t . deepEqual ( [ myHonda , 2 ] , list ( newCar ) ) ;
107
+
108
+ t . is ( 'red' , myCar . get ( 0 ) . color ) ;
109
+ t . is ( 'red' , newCar . get ( 0 ) . color ) ;
110
+
111
+ myCar . get ( 0 ) . color = 'purple' ;
112
+ t . is ( 'purple' , myCar . get ( 0 ) . color ) ;
113
+ t . is ( 'purple' , newCar . get ( 0 ) . color ) ;
114
+
115
+ newCar . get ( 0 ) . color = 'green' ;
116
+ t . is ( 'green' , myCar . get ( 0 ) . color ) ;
117
+ t . is ( 'green' , newCar . get ( 0 ) . color ) ;
118
+
119
+ } ) ;
120
+
121
+ test ( 'Seq#remove' , t => {
122
+
123
+ const string = 'abcde' ;
124
+ const s = Seq . from ( string ) ;
125
+ for ( const i of range ( 0 , string . length ) ) {
126
+ const result = s . remove ( i ) ;
127
+ t . deepEqual ( list ( string . slice ( 0 , i ) + string . slice ( i + 1 ) ) , list ( result ) ) ;
128
+ }
129
+
130
+ } ) ;
131
+
132
+ test ( 'Seq#insert' , t => {
133
+
134
+ const string = 'abcde' ;
135
+ const s = Seq . from ( string ) ;
136
+
137
+ for ( const i of range ( 0 , string . length ) ) {
138
+ const result = s . insert ( i , string [ i ] . toUpperCase ( ) ) ;
139
+ t . deepEqual ( list ( string . slice ( 0 , i ) + string [ i ] . toUpperCase ( ) + string . slice ( i ) ) , list ( result ) ) ;
140
+ }
141
+
142
+ } ) ;
143
+
144
+ test ( 'Seq#splice' , t => {
145
+
146
+ const string = 'abcde' ;
147
+ const s = Seq . from ( string ) ;
148
+ for ( const i of range ( - string . length , string . length ) ) {
149
+ const [ result , removed ] = s . splice ( i , 1 ) ;
150
+ const _i = i < 0 ? i + string . length : i ;
151
+ t . deepEqual ( list ( string . slice ( 0 , _i ) + string . slice ( _i + 1 ) ) , list ( result ) ) ;
152
+ t . deepEqual ( list ( string [ _i ] ) , list ( removed ) ) ;
153
+ }
154
+
155
+ for ( const i of range ( 0 , string . length ) ) {
156
+ const [ result , removed ] = s . splice ( i , 1 , ...string . slice ( 0 , i + 1 ) . toUpperCase ( ) ) ;
157
+ t . deepEqual ( list ( string . slice ( 0 , i ) + string . slice ( 0 , i + 1 ) . toUpperCase ( ) + string . slice ( i + 1 ) ) , list ( result ) ) ;
158
+ t . deepEqual ( list ( string [ i ] ) , list ( removed ) ) ;
159
+ }
160
+
161
+ for ( const i of range ( 0 , string . length ) ) {
162
+ const [ result , removed ] = s . splice ( i , 0 , ...string . slice ( 0 , i + 1 ) . toUpperCase ( ) ) ;
163
+ t . deepEqual ( list ( string . slice ( 0 , i ) + string . slice ( 0 , i + 1 ) . toUpperCase ( ) + string . slice ( i ) ) , list ( result ) ) ;
164
+ t . deepEqual ( [ ] , list ( removed ) ) ;
165
+ }
166
+
167
+ for ( const i of range ( 0 , string . length ) ) {
168
+ const [ result , removed ] = s . splice ( i , undefined , ...string . slice ( 0 , i + 1 ) . toUpperCase ( ) ) ;
169
+ t . deepEqual ( list ( string . slice ( 0 , i ) + string . slice ( 0 , i + 1 ) . toUpperCase ( ) ) , list ( result ) ) ;
170
+ t . deepEqual ( list ( string . slice ( i ) ) , list ( removed ) ) ;
171
+ }
172
+
173
+ } ) ;
174
+
175
+ // Examples from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
176
+ test ( 'Seq#splice (MDN Remove 0 (zero) elements before index 2, and insert "drum")' , t => {
177
+ const myFish = Seq . from ( [ 'angel' , 'clown' , 'mandarin' , 'sturgeon' ] ) ;
178
+ const [ result , removed ] = myFish . splice ( 2 , 0 , 'drum' ) ;
179
+
180
+ t . deepEqual ( [ 'angel' , 'clown' , 'mandarin' , 'sturgeon' ] , list ( myFish ) ) ;
181
+ t . deepEqual ( [ "angel" , "clown" , "drum" , "mandarin" , "sturgeon" ] , list ( result ) ) ;
182
+ t . deepEqual ( [ ] , list ( removed ) ) ;
183
+ } ) ;
184
+
185
+ test ( 'Seq#splice (MDN Remove 0 (zero) elements before index 2, and insert "drum" and "guitar")' , t => {
186
+ const myFish = Seq . from ( [ 'angel' , 'clown' , 'mandarin' , 'sturgeon' ] ) ;
187
+ const [ result , removed ] = myFish . splice ( 2 , 0 , 'drum' , 'guitar' ) ;
188
+
189
+ t . deepEqual ( [ 'angel' , 'clown' , 'mandarin' , 'sturgeon' ] , list ( myFish ) ) ;
190
+ t . deepEqual ( [ "angel" , "clown" , "drum" , "guitar" , "mandarin" , "sturgeon" ] , list ( result ) ) ;
191
+ t . deepEqual ( [ ] , list ( removed ) ) ;
192
+ } ) ;
193
+
194
+ test ( 'Seq#splice (MDN Remove 1 element at index 3)' , t => {
195
+ const myFish = Seq . from ( [ 'angel' , 'clown' , 'drum' , 'mandarin' , 'sturgeon' ] ) ;
196
+ const [ result , removed ] = myFish . splice ( 3 , 1 ) ;
197
+
198
+ t . deepEqual ( [ 'angel' , 'clown' , 'drum' , 'mandarin' , 'sturgeon' ] , list ( myFish ) ) ;
199
+ t . deepEqual ( [ "angel" , "clown" , "drum" , "sturgeon" ] , list ( result ) ) ;
200
+ t . deepEqual ( [ "mandarin" ] , list ( removed ) ) ;
201
+ } ) ;
202
+
203
+ test ( 'Seq#splice (MDN Remove 1 element at index 2, and insert "trumpet")' , t => {
204
+ const myFish = Seq . from ( [ 'angel' , 'clown' , 'drum' , 'sturgeon' ] ) ;
205
+ const [ result , removed ] = myFish . splice ( 2 , 1 , 'trumpet' ) ;
206
+
207
+ t . deepEqual ( [ 'angel' , 'clown' , 'drum' , 'sturgeon' ] , list ( myFish ) ) ;
208
+ t . deepEqual ( [ "angel" , "clown" , "trumpet" , "sturgeon" ] , list ( result ) ) ;
209
+ t . deepEqual ( [ "drum" ] , list ( removed ) ) ;
210
+ } ) ;
211
+
212
+ test ( 'Seq#splice (MDN Remove 2 elements from index 0, and insert "parrot", "anemone" and "blue")' , t => {
213
+ const myFish = Seq . from ( [ 'angel' , 'clown' , 'trumpet' , 'sturgeon' ] ) ;
214
+ const [ result , removed ] = myFish . splice ( 0 , 2 , 'parrot' , 'anemone' , 'blue' ) ;
215
+
216
+ t . deepEqual ( [ 'angel' , 'clown' , 'trumpet' , 'sturgeon' ] , list ( myFish ) ) ;
217
+ t . deepEqual ( [ "parrot" , "anemone" , "blue" , "trumpet" , "sturgeon" ] , list ( result ) ) ;
218
+ t . deepEqual ( [ "angel" , "clown" ] , list ( removed ) ) ;
219
+ } ) ;
220
+
221
+ test ( 'Seq#splice (MDN Remove 2 elements from index 2)' , t => {
222
+ const myFish = Seq . from ( [ 'parrot' , 'anemone' , 'blue' , 'trumpet' , 'sturgeon' ] ) ;
223
+ const [ result , removed ] = myFish . splice ( 2 , 2 ) ;
224
+
225
+ t . deepEqual ( [ 'parrot' , 'anemone' , 'blue' , 'trumpet' , 'sturgeon' ] , list ( myFish ) ) ;
226
+ t . deepEqual ( [ "parrot" , "anemone" , "sturgeon" ] , list ( result ) ) ;
227
+ t . deepEqual ( [ "blue" , "trumpet" ] , list ( removed ) ) ;
228
+ } ) ;
229
+
230
+ test ( 'Seq#splice (MDN Remove 1 element from index -2)' , t => {
231
+ const myFish = Seq . from ( [ 'angel' , 'clown' , 'mandarin' , 'sturgeon' ] ) ;
232
+ const [ result , removed ] = myFish . splice ( - 2 , 1 ) ;
233
+
234
+ t . deepEqual ( [ 'angel' , 'clown' , 'mandarin' , 'sturgeon' ] , list ( myFish ) ) ;
235
+ t . deepEqual ( [ "angel" , "clown" , "sturgeon" ] , list ( result ) ) ;
236
+ t . deepEqual ( [ "mandarin" ] , list ( removed ) ) ;
237
+ } ) ;
238
+
239
+ test ( 'Seq#splice (MDN Remove all elements after index 2 (incl.))' , t => {
240
+ const myFish = Seq . from ( [ 'angel' , 'clown' , 'mandarin' , 'sturgeon' ] ) ;
241
+ const [ result , removed ] = myFish . splice ( 2 ) ;
242
+
243
+ t . deepEqual ( [ 'angel' , 'clown' , 'mandarin' , 'sturgeon' ] , list ( myFish ) ) ;
244
+ t . deepEqual ( [ "angel" , "clown" ] , list ( result ) ) ;
245
+ t . deepEqual ( [ "mandarin" , "sturgeon" ] , list ( removed ) ) ;
246
+ } ) ;
0 commit comments