data-structure-typed 1.48.7 → 1.48.9

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.
@@ -1,475 +1,373 @@
1
1
  import { Deque } from '../../../../src';
2
- import { bigO } from '../../../utils';
3
2
  import { isDebugTest } from '../../../config';
4
3
 
5
4
  const isDebug = isDebugTest;
6
- describe('Deque Tests', () => {
7
- // Test cases for the Deque class (DoublyLinkedList-based)
8
- describe('Deque (DoublyLinkedList-based)', () => {
9
- let deque: Deque<number>;
10
-
11
- beforeEach(() => {
12
- deque = new Deque<number>();
13
- });
14
-
15
- it('should add elements at the beginning and end', () => {
16
- deque.addFirst(1);
17
- deque.addLast(2);
18
- expect(deque.first).toBe(1);
19
- expect(deque.last).toBe(2);
20
- });
21
-
22
- it('should delete elements from the beginning and end', () => {
23
- deque.addFirst(1);
24
- deque.addLast(2);
25
- deque.pollFirst();
26
- deque.pollLast();
27
- expect(deque.isEmpty()).toBe(true);
28
- });
29
-
30
- it('should handle edge case when removing from an empty deque', () => {
31
- const result = deque.pollFirst();
32
- expect(result).toBeUndefined();
33
- });
34
-
35
- it('should correctly report its size', () => {
36
- deque.addFirst(1);
37
- deque.addLast(2);
38
- expect(deque.size).toBe(2);
39
- });
40
-
41
- it('should handle adding and removing elements alternately', () => {
42
- deque.addFirst(1);
43
- expect(deque.pollFirst()).toBe(1);
44
- deque.addLast(2);
45
- expect(deque.pollLast()).toBe(2);
46
- expect(deque.isEmpty()).toBe(true);
47
- });
48
-
49
- it('should handle adding and removing elements in a cyclic manner', () => {
50
- deque.addFirst(1);
51
- deque.addLast(2);
52
- expect(deque.pollFirst()).toBe(1);
53
- deque.addFirst(3);
54
- expect(deque.pollLast()).toBe(2);
55
- expect(deque.size).toBe(1);
56
- });
57
- // Add more test cases as needed
58
- });
59
-
60
- // // Test cases for the ObjectDeque class
61
- // describe('ObjectDeque', () => {
62
- // let objectDeque: ObjectDeque<string>;
63
- //
64
- // beforeEach(() => {
65
- // objectDeque = new ObjectDeque<string>();
66
- // });
67
- //
68
- // it('should add elements at the beginning and end', () => {
69
- // objectDeque.addFirst('one');
70
- // objectDeque.addLast('two');
71
- // expect(objectDeque.getFirst()).toBe('one');
72
- // expect(objectDeque.getLast()).toBe('two');
73
- // });
74
- //
75
- // it('should delete elements from the beginning and end', () => {
76
- // objectDeque.addFirst('one');
77
- // objectDeque.addLast('two');
78
- // objectDeque.pollFirst();
79
- // objectDeque.pollLast();
80
- // expect(objectDeque.isEmpty()).toBe(true);
81
- // });
82
- //
83
- // it('should handle edge case when removing from an empty deque', () => {
84
- // const result = objectDeque.pollFirst();
85
- // expect(result).toBeUndefined();
86
- // });
87
- //
88
- // it('should correctly report its size', () => {
89
- // objectDeque.addFirst('one');
90
- // objectDeque.addLast('two');
91
- // expect(objectDeque.size).toBe(2);
92
- // });
93
- //
94
- // // Add more test cases as needed
95
- // });
96
- });
97
-
98
- describe('Deque Performance Test', () => {
99
- const dataSize = 10000;
100
- it('should numeric queue be efficient', function () {
101
- const startTime = performance.now();
102
- const queue = new Deque<number>();
103
- for (let i = 0; i < dataSize; i++) {
104
- queue.unshift(i);
105
- }
106
- for (let i = 0; i < dataSize; i++) {
107
- queue.pop();
108
- }
109
- isDebug && console.log(`Queue Deque Test: ${performance.now() - startTime} ms`);
110
- expect(performance.now() - startTime).toBeLessThan(bigO.LINEAR * 100);
111
- });
112
- });
113
5
 
114
- describe('Deque', () => {
6
+ describe('Deque - Basic Operations', () => {
115
7
  let deque: Deque<number>;
116
8
 
117
9
  beforeEach(() => {
118
- deque = new Deque<number>();
119
- });
120
-
121
- it('should initialize an empty deque', () => {
122
- expect(deque.size).toBe(0);
123
- expect(deque.isEmpty()).toBe(true);
10
+ deque = new Deque<number>([1, 2]);
124
11
  });
125
12
 
126
- it('should add elements to the front and back', () => {
127
- deque.addFirst(1);
128
- deque.addLast(2);
129
-
13
+ test('push should add elements to the end', () => {
130
14
  expect(deque.size).toBe(2);
131
- expect(deque.first).toBe(1);
132
15
  expect(deque.last).toBe(2);
133
16
  });
134
17
 
135
- it('should remove elements from the front and back', () => {
136
- deque.addFirst(1);
137
- deque.addLast(2);
138
-
139
- const firstElement = deque.pollFirst();
140
- const lastElement = deque.pollLast();
18
+ test('pop should remove elements from the end', () => {
19
+ expect(deque.pop()).toBe(2);
20
+ expect(deque.size).toBe(1);
21
+ expect(deque.pop()).toBe(1);
22
+ expect(deque.isEmpty()).toBeTruthy();
23
+ });
141
24
 
142
- expect(deque.size).toBe(0);
143
- expect(firstElement).toBe(1);
144
- expect(lastElement).toBe(2);
25
+ test('unshift should add elements to the beginning', () => {
26
+ deque.clear();
27
+ deque.unshift(1);
28
+ deque.unshift(2);
29
+ expect(deque.size).toBe(2);
30
+ expect(deque.first).toBe(2);
145
31
  });
146
32
 
147
- it('should get elements by index', () => {
148
- deque.addLast(1);
149
- deque.addLast(2);
150
- deque.addLast(3);
33
+ test('shift should remove elements from the beginning', () => {
34
+ deque.clear();
35
+ deque.unshift(1);
36
+ deque.unshift(2);
37
+ expect(deque.shift()).toBe(2);
38
+ expect(deque.size).toBe(1);
39
+ expect(deque.shift()).toBe(1);
40
+ expect(deque.isEmpty()).toBeTruthy();
41
+ });
151
42
 
43
+ test('getAt should retrieve the correct element', () => {
152
44
  expect(deque.getAt(0)).toBe(1);
153
45
  expect(deque.getAt(1)).toBe(2);
154
- expect(deque.getAt(2)).toBe(3);
155
46
  });
156
47
 
157
- it('should return undefined for out-of-bounds index', () => {
158
- // expect(deque.getAt(0)).toThrowError('Index out of bounds.');
159
- // expect(deque.getAt(1)).toThrow('Index out of bounds');
160
- // expect(deque.getAt(-1)).toThrow('Index out of bounds');
161
- });
162
-
163
- it('should check if the deque is empty', () => {
164
- expect(deque.isEmpty()).toBe(true);
165
-
166
- deque.addLast(1);
167
- expect(deque.isEmpty()).toBe(false);
168
-
169
- deque.pollFirst();
170
- expect(deque.isEmpty()).toBe(true);
48
+ test('setAt should set the correct element', () => {
49
+ deque.setAt(0, 3);
50
+ expect(deque.getAt(0)).toBe(3);
171
51
  });
172
52
  });
173
-
174
- // describe('ObjectDeque', () => {
175
- // let deque: ObjectDeque<number>;
176
- //
177
- // beforeEach(() => {
178
- // deque = new ObjectDeque<number>();
179
- // });
180
- //
181
- // it('should add elements to the front of the deque', () => {
182
- // deque.addFirst(1);
183
- // deque.addFirst(2);
184
- //
185
- // expect(deque.size).toBe(2);
186
- // expect(deque.getFirst()).toBe(2);
187
- // expect(deque.getLast()).toBe(1);
188
- // });
189
- //
190
- // it('should add elements to the end of the deque', () => {
191
- // deque.addLast(1);
192
- // deque.addLast(2);
193
- //
194
- // expect(deque.size).toBe(2);
195
- // expect(deque.getFirst()).toBe(1);
196
- // expect(deque.getLast()).toBe(2);
197
- // });
198
- //
199
- // it('should remove elements from the front of the deque', () => {
200
- // deque.addLast(1);
201
- // deque.addLast(2);
202
- //
203
- // const removedElement = deque.pollFirst();
204
- //
205
- // expect(deque.size).toBe(1);
206
- // expect(removedElement).toBe(1);
207
- // expect(deque.getFirst()).toBe(2);
208
- // });
209
- //
210
- // it('should remove elements from the end of the deque', () => {
211
- // deque.addLast(1);
212
- // deque.addLast(2);
213
- //
214
- // const removedElement = deque.pollFirst();
215
- //
216
- // expect(deque.size).toBe(1);
217
- // expect(removedElement).toBe(1);
218
- // expect(deque.getLast()).toBe(2);
219
- // });
220
- //
221
- // it('should return the element at the front of the deque without removing it', () => {
222
- // deque.addFirst(1);
223
- // deque.addFirst(2);
224
- //
225
- // expect(deque.getFirst()).toBe(2);
226
- // expect(deque.size).toBe(2);
227
- // });
228
- //
229
- // it('should return the element at the end of the deque without removing it', () => {
230
- // deque.addLast(1);
231
- // deque.addLast(2);
232
- //
233
- // expect(deque.getLast()).toBe(2);
234
- // expect(deque.size).toBe(2);
235
- // });
236
- //
237
- // it('should return the correct size of the deque', () => {
238
- // deque.addFirst(1);
239
- // deque.addLast(2);
240
- // deque.addLast(3);
241
- //
242
- // expect(deque.size).toBe(3);
243
- // });
244
- //
245
- // it('should check if the deque is empty', () => {
246
- // expect(deque.isEmpty()).toBe(true);
247
- //
248
- // deque.addFirst(1);
249
- //
250
- // expect(deque.isEmpty()).toBe(false);
251
- // });
252
- //
253
- // it('should set elements at a specific index', () => {
254
- // deque.addFirst(1);
255
- // deque.addLast(2);
256
- // deque.addLast(3);
257
- //
258
- // expect(deque.getFirst()).toBe(1);
259
- // expect(deque.get(1)).toBe(2);
260
- // expect(deque.getLast()).toBe(3);
261
- // });
262
- //
263
- // it('should insert elements at a specific index', () => {
264
- // deque.addFirst(1);
265
- // deque.addLast(2);
266
- // deque.addLast(3);
267
- //
268
- // expect(deque.size).toBe(3);
269
- // expect(deque.getFirst()).toBe(1);
270
- // expect(deque.get(1)).toBe(2);
271
- // expect(deque.get(2)).toBe(3);
272
- // expect(deque.getLast()).toBe(3);
273
- // });
274
- // });
275
-
276
-
277
- describe('Deque', () => {
53
+ describe('Deque - Complex Operations', () => {
278
54
  let deque: Deque<number>;
279
55
 
280
56
  beforeEach(() => {
281
57
  deque = new Deque<number>();
282
58
  });
283
59
 
284
- // test('initializes with default capacity', () => {
285
- // expect(deque.capacity).toBe(10);
286
- // });
287
-
288
- // test('initializes with given capacity', () => {
289
- // const customDeque = new Deque(20);
290
- // expect(customDeque.capacity).toBe(20);
291
- // });
292
-
293
- test('is initially empty', () => {
294
- expect(deque.isEmpty()).toBe(true);
60
+ test('insertAt should insert elements at the specified position', () => {
61
+ deque.push(1);
62
+ deque.push(3);
63
+ deque.insertAt(1, 2);
64
+ expect(deque.toArray()).toEqual([1, 2, 3]);
295
65
  });
296
66
 
297
- test('pushes and pops elements', () => {
67
+ test('cut should remove elements after the specified position', () => {
298
68
  deque.push(1);
299
69
  deque.push(2);
300
- expect(deque.pop()).toBe(2);
301
- expect(deque.pop()).toBe(1);
302
- expect(deque.pop()).toBeUndefined();
303
- });
304
-
305
- test('unshifts and shifts elements', () => {
306
- deque.unshift(1);
307
- deque.unshift(2);
308
- expect(deque.shift()).toBe(2);
309
- expect(deque.shift()).toBe(1);
310
- expect(deque.shift()).toBeUndefined();
70
+ deque.push(3);
71
+ deque.cut(1);
72
+ expect(deque.toArray()).toEqual([1, 2]);
311
73
  });
312
74
 
313
- test('correctly reports size', () => {
314
- expect(deque.size).toBe(0);
75
+ test('deleteAt should remove the element at the specified position', () => {
315
76
  deque.push(1);
316
77
  deque.push(2);
317
- expect(deque.size).toBe(2);
78
+ deque.push(3);
79
+ deque.deleteAt(1);
80
+ expect(deque.toArray()).toEqual([1, 3]);
318
81
  });
319
82
 
320
- test('gets first and last elements', () => {
83
+ test('delete should remove all instances of an element', () => {
321
84
  deque.push(1);
322
85
  deque.push(2);
86
+ deque.push(2);
323
87
  deque.push(3);
324
- expect(deque.first).toBe(1);
325
- expect(deque.last).toBe(3);
88
+ deque.delete(2);
89
+ expect(deque.toArray()).toEqual([1, 3]);
326
90
  });
327
91
 
328
- test('handles resizing automatically', () => {
329
- for (let i = 0; i < 12; i++) {
330
- deque.push(i);
331
- }
332
- expect(deque.size).toBe(12);
333
- // expect(deque.capacity).toBeGreaterThan(10);
92
+ test('reverse should reverse the order of elements', () => {
93
+ deque.push(1);
94
+ deque.push(2);
95
+ deque.push(3);
96
+ deque.reverse();
97
+ expect(deque.toArray()).toEqual([3, 2, 1]);
334
98
  });
335
99
 
336
- test('converts to array', () => {
100
+ test('unique should remove duplicate elements', () => {
337
101
  deque.push(1);
338
102
  deque.push(2);
103
+ deque.push(2);
339
104
  deque.push(3);
105
+ deque.unique();
340
106
  expect(deque.toArray()).toEqual([1, 2, 3]);
341
107
  });
342
108
 
343
- test('clears the deque', () => {
109
+ test('sort should sort elements according to a comparator', () => {
110
+ deque.push(3);
344
111
  deque.push(1);
345
112
  deque.push(2);
346
- deque.clear();
347
- expect(deque.isEmpty()).toBe(true);
113
+ deque.sort((a, b) => a - b);
114
+ expect(deque.toArray()).toEqual([1, 2, 3]);
348
115
  });
349
116
 
350
- test('inserts and deletes at specific index', () => {
351
- deque.push(1);
352
- deque.push(3);
353
- deque.insertAt(1, 2);
354
- expect(deque.toArray()).toEqual([1, 2, 3]);
355
- expect(deque.deleteAt(1)).toBe(2);
356
- expect(deque.toArray()).toEqual([1, 3]);
117
+ test('shrinkToFit should reduce the memory footprint', () => {
118
+ });
119
+ });
120
+ describe('Deque - Utility Operations', () => {
121
+ let deque: Deque<number>;
122
+
123
+ beforeEach(() => {
124
+ deque = new Deque<number>();
357
125
  });
358
126
 
359
- test('finds elements with a callback', () => {
127
+ test('find should return the first element that matches the condition', () => {
360
128
  deque.push(1);
361
129
  deque.push(2);
362
130
  deque.push(3);
363
- expect(deque.find(el => el > 1)).toBe(2);
131
+ const found = deque.find(element => element > 1);
132
+ expect(found).toBe(2);
364
133
  });
365
134
 
366
- test('performs forEach operation', () => {
135
+ test('indexOf should return the index of the first occurrence of an element', () => {
367
136
  deque.push(1);
368
137
  deque.push(2);
369
- let sum = 0;
370
- deque.forEach(el => {
371
- sum += el;
372
- });
373
- expect(sum).toBe(3);
138
+ deque.push(3);
139
+ const index = deque.indexOf(2);
140
+ expect(index).toBe(1);
374
141
  });
375
142
 
376
- test('maps to a new deque', () => {
143
+ test('toArray should convert the deque to an array', () => {
377
144
  deque.push(1);
378
145
  deque.push(2);
379
- const newDeque = deque.map(el => el * el);
380
- expect(newDeque.toArray()).toEqual([1, 4]);
146
+ deque.push(3);
147
+ expect(deque.toArray()).toEqual([1, 2, 3]);
381
148
  });
382
149
 
383
- test('filters elements', () => {
150
+ test('filter should filter elements based on a predicate', () => {
384
151
  deque.push(1);
385
152
  deque.push(2);
386
153
  deque.push(3);
387
- const newDeque = deque.filter(el => el % 2 === 0);
388
- expect(newDeque.toArray()).toEqual([2]);
154
+ const filtered = deque.filter(element => element > 1);
155
+ expect(filtered.toArray()).toEqual([2, 3]);
389
156
  });
390
157
 
391
- test('reduces elements', () => {
158
+ test('map should apply a function to all elements', () => {
392
159
  deque.push(1);
393
160
  deque.push(2);
394
161
  deque.push(3);
395
- const sum = deque.reduce((acc, el) => acc + el, 0);
396
- expect(sum).toBe(6);
162
+ const mapped = deque.map(element => element * 2);
163
+ expect(mapped.toArray()).toEqual([2, 4, 6]);
397
164
  });
398
165
 
399
- test('reverses elements', () => {
166
+ test('print should print the deque elements', () => {
167
+ const consoleSpy = jest.spyOn(console, 'log');
400
168
  deque.push(1);
401
169
  deque.push(2);
402
- deque.push(3);
403
- deque.reverse();
404
- expect(deque.toArray()).toEqual([3, 2, 1]);
170
+ deque.print();
171
+ expect(consoleSpy).toHaveBeenCalledWith([1, 2]);
405
172
  });
406
173
 
407
- test('gets element at a specific index', () => {
174
+ });
175
+ describe('Deque - Additional Operations', () => {
176
+ let deque: Deque<number>;
177
+
178
+ beforeEach(() => {
179
+ deque = new Deque<number>();
180
+ });
181
+
182
+ test('addLast should add an element to the end', () => {
183
+ deque.addLast(1);
184
+ deque.addLast(2);
185
+ expect(deque.last).toBe(2);
186
+ expect(deque.size).toBe(2);
187
+ });
188
+
189
+ test('pollLast should remove and return the last element', () => {
190
+ deque.addLast(1);
191
+ deque.addLast(2);
192
+ expect(deque.pollLast()).toBe(2);
193
+ expect(deque.size).toBe(1);
194
+ });
195
+
196
+ test('addFirst should add an element to the beginning', () => {
197
+ deque.addFirst(1);
198
+ deque.addFirst(2);
199
+ expect(deque.first).toBe(2);
200
+ expect(deque.size).toBe(2);
201
+ });
202
+
203
+ test('pollFirst should remove and return the first element', () => {
204
+ deque.addFirst(1);
205
+ deque.addFirst(2);
206
+ expect(deque.pollFirst()).toBe(2);
207
+ expect(deque.size).toBe(1);
208
+ });
209
+
210
+ test('clear should reset the deque', () => {
211
+ deque.addFirst(1);
212
+ deque.clear();
213
+ expect(deque.size).toBe(0);
214
+ expect(deque.isEmpty()).toBeTruthy();
215
+ });
216
+
217
+ test('begin should yield elements from the beginning', () => {
218
+ deque.addLast(1);
219
+ deque.addLast(2);
220
+ const iterator = deque.begin();
221
+ expect(iterator.next().value).toBe(1);
222
+ expect(iterator.next().value).toBe(2);
223
+ });
224
+
225
+ test('reverseBegin should yield elements in reverse order', () => {
226
+ deque.addLast(1);
227
+ deque.addLast(2);
228
+ const iterator = deque.reverseBegin();
229
+ expect(iterator.next().value).toBe(2);
230
+ expect(iterator.next().value).toBe(1);
231
+ });
232
+
233
+ });
234
+ describe('Deque - push Method', () => {
235
+ let deque: Deque<number>;
236
+ const bucketSize = 10; // 假设的 bucket 大小
237
+
238
+ beforeEach(() => {
239
+ deque = new Deque<number>([], bucketSize);
240
+ });
241
+
242
+ test('push should add an element when deque is empty', () => {
408
243
  deque.push(1);
409
- deque.push(2);
410
- deque.push(3);
411
- expect(deque.getAt(1)).toBe(2);
412
- // expect(deque.getAt(5)).toThrow();
244
+ expect(deque.last).toBe(1);
245
+ expect(deque.size).toBe(1);
246
+ });
247
+
248
+ test('push should add an element when lastInBucket is not at max', () => {
249
+ for (let i = 0; i < bucketSize - 1; i++) {
250
+ deque.push(i);
251
+ }
252
+ deque.push(bucketSize);
253
+ expect(deque.last).toBe(bucketSize);
254
+ expect(deque.size).toBe(bucketSize);
255
+ });
256
+
257
+ test('push should add an element and move to next bucket when last bucket is full', () => {
258
+ for (let i = 0; i < bucketSize; i++) {
259
+ deque.push(i);
260
+ }
261
+ deque.push(bucketSize + 1);
262
+ expect(deque.last).toBe(bucketSize + 1);
263
+ expect(deque.size).toBe(bucketSize + 1);
264
+ });
265
+
266
+ test('push should add an element and reallocate when last bucket and lastInBucket are at max', () => {
267
+
268
+ for (let i = 0; i < 100; i++) {
269
+ deque.push(i);
270
+ }
271
+
272
+ deque.push(100);
273
+ expect(deque.last).toBe(100);
274
+ expect(deque.size).toBeGreaterThan(bucketSize);
275
+ });
276
+ });
277
+ describe('Deque - pop Method', () => {
278
+ let deque: Deque<number>;
279
+ const bucketSize = 10;
280
+
281
+ beforeEach(() => {
282
+ deque = new Deque<number>([], bucketSize);
413
283
  });
414
284
 
415
- test('finds the index of an element', () => {
285
+ test('pop should remove and return the last element', () => {
416
286
  deque.push(1);
417
287
  deque.push(2);
418
- deque.push(3);
419
- expect(deque.indexOf(2)).toBe(1);
420
- expect(deque.indexOf(4)).toBe(-1);
288
+ expect(deque.pop()).toBe(2);
289
+ expect(deque.size).toBe(1);
421
290
  });
422
291
 
292
+ test('pop should handle popping the only element', () => {
293
+ deque.push(1);
294
+ expect(deque.pop()).toBe(1);
295
+ expect(deque.isEmpty()).toBeTruthy();
296
+ });
423
297
 
424
- //Test begin method
425
- describe('begin()', () => {
426
- it('should return an iterator at the beginning of the deque', () => {
427
- deque.push(1);
428
- deque.push(2);
429
- deque.push(3);
298
+ test('pop should adjust bucketLast and lastInBucket correctly', () => {
299
+ for (let i = 0; i < 100; i++) {
300
+ deque.push(i);
301
+ }
302
+ for (let i = 0; i < 1001; i++) {
303
+ const lastElement = deque.last;
304
+ expect(deque.pop()).toBe(lastElement);
305
+ }
430
306
 
431
- const iterator = deque.begin();
432
307
 
433
- expect(iterator.next().value).toBe(1);
434
- });
435
308
  });
309
+ });
310
+ describe('Deque - unshift Method', () => {
311
+ let deque: Deque<number>;
312
+ const bucketSize = 10;
436
313
 
437
- // Test the reverse Begin method
438
- describe('reverseBegin()', () => {
439
- it('should return a reverse iterator at the beginning of the deque', () => {
440
- deque.push(1);
441
- deque.push(2);
442
- deque.push(3);
314
+ beforeEach(() => {
315
+ deque = new Deque<number>([], bucketSize);
316
+ });
443
317
 
444
- const iterator = deque.reverseBegin();
318
+ test('unshift should add an element to the beginning when deque is empty', () => {
319
+ deque.unshift(1);
320
+ expect(deque.first).toBe(1);
321
+ expect(deque.size).toBe(1);
322
+ });
445
323
 
446
- expect(iterator.next().value).toBe(3);
447
- });
324
+ test('unshift should add an element to the beginning and adjust firstInBucket', () => {
325
+ for (let i = 0; i < 100; i++) {
326
+ deque.unshift(i);
327
+ }
328
+
329
+ deque.unshift(0);
330
+ expect(deque.first).toBe(0);
448
331
  });
449
332
 
450
- describe('iterable methods', () => {
451
- it('should forEach, some, every, filter, map, reduce of the deque', () => {
452
- deque.push(1);
453
- deque.push(2);
454
- deque.push(3);
333
+ test('unshift should add an element and reallocate when needed', () => {
334
+ for (let i = 0; i < 100; i++) {
335
+ deque.unshift(i);
336
+ }
337
+ deque.unshift(-1);
338
+ expect(deque.first).toBe(-1);
339
+ });
340
+ });
341
+ describe('Deque - shift Method', () => {
342
+ let deque: Deque<number>;
455
343
 
456
- const mockCallback = jest.fn();
457
- deque.forEach((element) => {
458
- mockCallback(element);
459
- });
344
+ const bucketSize = 10;
460
345
 
461
- expect(mockCallback.mock.calls.length).toBe(3);
462
- expect(mockCallback.mock.calls[0]).toEqual([1]);
463
- expect(mockCallback.mock.calls[1]).toEqual([2]);
464
- expect(mockCallback.mock.calls[2]).toEqual([3]);
346
+ beforeEach(() => {
347
+ deque = new Deque<number>([], bucketSize);
348
+ });
465
349
 
466
- expect(deque.every(element => element > 0)).toBe(true);
467
- expect(deque.every(element => element > 1)).toBe(false);
468
- expect(deque.some(element => element > 2)).toBe(true);
350
+ test('shift should remove and return the first element', () => {
351
+ deque.push(1);
352
+ deque.push(2);
353
+ expect(deque.shift()).toBe(1);
354
+ expect(deque.size).toBe(1);
355
+ });
356
+
357
+ test('shift should handle shifting the only element', () => {
358
+ deque.push(1);
359
+ expect(deque.shift()).toBe(1);
360
+ expect(deque.isEmpty()).toBeTruthy();
361
+ });
362
+
363
+ test('shift should adjust bucketFirst and firstInBucket correctly', () => {
364
+ for (let i = 0; i < 100; i++) {
365
+ deque.push(i);
366
+ }
367
+ for (let i = 0; i < 100; i++) {
368
+ const firstElement = deque.first;
369
+ expect(deque.shift()).toBe(firstElement);
370
+ }
469
371
 
470
- expect([...deque.filter(element => element > 2)]).toEqual([3]);
471
- expect([...deque.map(element => element * 2)]).toEqual([2, 4, 6]);
472
- expect(deque.reduce((accumulator, element) => accumulator + element, 0)).toEqual(6);
473
- });
474
372
  });
475
373
  });