@@ -80,15 +80,41 @@ describe("qa suite planning helpers", () => {
|
80 | 80 | it("maps suite work with bounded concurrency while preserving order", async () => { |
81 | 81 | let active = 0; |
82 | 82 | let maxActive = 0; |
83 | | -const result = await mapQaSuiteWithConcurrency([1, 2, 3, 4], 2, async (item) => { |
| 83 | +let releaseStartedTasks = false; |
| 84 | +let resolveBothStarted: () => void = () => {}; |
| 85 | +const bothStarted = new Promise<void>((resolve) => { |
| 86 | +resolveBothStarted = resolve; |
| 87 | +}); |
| 88 | +const taskReleases: Array<() => void> = []; |
| 89 | +const releaseQueuedTasks = () => { |
| 90 | +if (!releaseStartedTasks) { |
| 91 | +return; |
| 92 | +} |
| 93 | +let releaseTask: (() => void) | undefined; |
| 94 | +while ((releaseTask = taskReleases.shift())) { |
| 95 | +releaseTask(); |
| 96 | +} |
| 97 | +}; |
| 98 | + |
| 99 | +const resultPromise = mapQaSuiteWithConcurrency([1, 2, 3, 4], 2, async (item) => { |
84 | 100 | active += 1; |
85 | 101 | maxActive = Math.max(maxActive, active); |
86 | | -await new Promise((resolve) => setTimeout(resolve, 10)); |
| 102 | +if (active === 2) { |
| 103 | +resolveBothStarted(); |
| 104 | +} |
| 105 | +await new Promise<void>((resolve) => { |
| 106 | +taskReleases.push(resolve); |
| 107 | +releaseQueuedTasks(); |
| 108 | +}); |
87 | 109 | active -= 1; |
88 | 110 | return item * 10; |
89 | 111 | }); |
90 | 112 | |
| 113 | +await bothStarted; |
91 | 114 | expect(maxActive).toBe(2); |
| 115 | +releaseStartedTasks = true; |
| 116 | +releaseQueuedTasks(); |
| 117 | +const result = await resultPromise; |
92 | 118 | expect(result).toEqual([10, 20, 30, 40]); |
93 | 119 | }); |
94 | 120 | |
|