Skip to content

Commit fe9b886

Browse files
committed
Add order preservation test
1 parent 3a8c9c7 commit fe9b886

File tree

1 file changed

+38
-0
lines changed

1 file changed

+38
-0
lines changed

src/iterable-mapper.test.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,44 @@ describe('IterableMapper', () => {
419419
});
420420
});
421421

422+
describe('order preservation tests', () => {
423+
it('preserves exact sequential order under high load with concurrency 1, maxUnread 8', async () => {
424+
const size = 1000;
425+
const input = Array.from({ length: size }, (_, i) => ({
426+
value: i + 1,
427+
ms: Math.floor(Math.random() * 20), // Random delay 0-19ms
428+
}));
429+
430+
const mappedOrder: number[] = [];
431+
const iteratedOrder: number[] = [];
432+
433+
const prefetcher = new IterableMapper(
434+
input,
435+
async ({ value, ms }): Promise<number> => {
436+
await sleep(ms);
437+
mappedOrder.push(value);
438+
return value;
439+
},
440+
{ concurrency: 1, maxUnread: 8 },
441+
);
442+
443+
for await (const value of prefetcher) {
444+
iteratedOrder.push(value);
445+
// Add some random delay in consuming to create backpressure
446+
await sleep(Math.floor(Math.random() * 20));
447+
}
448+
449+
// Verify exact sequential order preservation
450+
expect(iteratedOrder).toHaveLength(size);
451+
expect(mappedOrder).toHaveLength(size);
452+
453+
// Verify that both mapped and iterated orders match the input sequence
454+
const expectedOrder = Array.from({ length: size }, (_, i) => i + 1);
455+
expect(mappedOrder).toEqual(expectedOrder);
456+
expect(iteratedOrder).toEqual(expectedOrder);
457+
}, 30000);
458+
});
459+
422460
describe('concurrency 1, maxUnread 1', () => {
423461
const concurrency = 1;
424462
const maxUnread = 1;

0 commit comments

Comments
 (0)