Path: blob/main/extensions/copilot/src/util/common/test/testUtils.spec.ts
13401 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 { describe, expect, it, vi } from 'vitest';6import { DisposableStore } from '../../vs/base/common/lifecycle';7import { throwIfDisposablesAreLeaked, throwIfDisposablesAreLeakedAsync } from './testUtils';89describe('testUtils', () => {10describe('throwIfDisposablesAreLeaked', () => {11it('should not throw when no disposables are leaked', () => {12expect(() => {13throwIfDisposablesAreLeaked(() => {14// Create and properly dispose a disposable15const store = new DisposableStore();16store.add({ dispose: () => { } });17store.dispose();18});19}).not.toThrow();20});2122it('should throw when disposables are leaked', () => {23// suppress the console.error when it expectedly fails24const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => { });25try {26expect(() => {27throwIfDisposablesAreLeaked(() => {28// Create a disposable but don't dispose it29const store = new DisposableStore();30store.add({ dispose: () => { } });31// Don't call store.dispose()32});33}).toThrow(/There are \d+ undisposed disposables!/);34} finally {35consoleSpy.mockRestore();36}37});38});3940describe('throwIfDisposablesAreLeakedAsync', () => {41it('should not throw when no disposables are leaked in async context', async () => {42await expect(43throwIfDisposablesAreLeakedAsync(async () => {44const store = new DisposableStore();45store.add({ dispose: () => { } });46store.dispose();47})48).resolves.not.toThrow();49});5051it('should throw when disposables are leaked in async context', async () => {52// suppress the console.error when it expectedly fails53const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => { });54try {55await expect(56throwIfDisposablesAreLeakedAsync(async () => {57const store = new DisposableStore();58store.add({ dispose: () => { } });59// Don't dispose60})61).rejects.toThrow(/There are \d+ undisposed disposables!/);62} finally {63consoleSpy.mockRestore();64}65});6667it('should work with async operations', async () => {68await expect(69throwIfDisposablesAreLeakedAsync(async () => {70const store = new DisposableStore();71store.add({ dispose: () => { } });7273// Simulate async work74await new Promise(resolve => setTimeout(resolve, 1));7576store.dispose();77})78).resolves.not.toThrow();79});80});81});8283