Path: blob/main/extensions/copilot/src/extension/inlineEdits/test/vscode-node/raceAndAll.spec.ts
13405 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { expect, suite, test, vi } from 'vitest';6import { raceAndAll } from '../../vscode-node/raceAndAll';78const noopErrorHandler = () => { };910suite('raceAndAll', () => {1112test('first resolves with the first settled promise', async () => {13const { first } = raceAndAll([14Promise.resolve('a'),15new Promise<string>(resolve => setTimeout(() => resolve('b'), 5)),16], noopErrorHandler);17const result = await first;18expect(result).toEqual(['a', undefined]);19});2021test('all resolves with all values', async () => {22const { all } = raceAndAll([23Promise.resolve('a'),24Promise.resolve('b'),25], noopErrorHandler);26const result = await all;27expect(result).toEqual(['a', 'b']);28});2930test('when first promise rejects, first still resolves with the second promise', async () => {31const { first, all } = raceAndAll([32Promise.reject(new Error('fail')),33Promise.resolve('b'),34], noopErrorHandler);35const allResult = expect(all).rejects.toThrow('fail');36const result = await first;37expect(result).toEqual([undefined, 'b']);38await allResult;39});4041test('when second promise rejects, first resolves with the first promise', async () => {42const { first, all } = raceAndAll([43Promise.resolve('a'),44Promise.reject(new Error('fail')),45], noopErrorHandler);46const allResult = expect(all).rejects.toThrow('fail');47const result = await first;48expect(result).toEqual(['a', undefined]);49await allResult;50});5152test('when all promises reject, first rejects', async () => {53const { first, all } = raceAndAll([54Promise.reject(new Error('fail1')),55Promise.reject(new Error('fail2')),56], noopErrorHandler);57await expect(first).rejects.toThrow('All promises passed to raceAndAll were rejected');58await expect(all).rejects.toThrow('fail1');59});6061test('when first promise rejects and second resolves later, first waits for second', async () => {62const { first, all } = raceAndAll([63Promise.reject(new Error('fail')),64new Promise<string>(resolve => setTimeout(() => resolve('b'), 5)),65], noopErrorHandler);66const allResult = expect(all).rejects.toThrow('fail');67const result = await first;68expect(result).toEqual([undefined, 'b']);69await allResult;70});7172test('errorHandler is called for each rejection', async () => {73const errorHandler = vi.fn();74const err1 = new Error('fail1');75const err2 = new Error('fail2');76const { first, all } = raceAndAll([77Promise.reject(err1),78Promise.reject(err2),79], errorHandler);80const allResult = expect(all).rejects.toThrow('fail1');81await expect(first).rejects.toThrow();82await allResult;83expect(errorHandler).toHaveBeenCalledTimes(2);84expect(errorHandler).toHaveBeenCalledWith(err1);85expect(errorHandler).toHaveBeenCalledWith(err2);86});87});888990