Path: blob/main/src/vs/workbench/contrib/debug/test/common/debugModel.test.ts
3296 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 assert from 'assert';6import { DeferredPromise } from '../../../../../base/common/async.js';7import { DisposableStore } from '../../../../../base/common/lifecycle.js';8import { mockObject } from '../../../../../base/test/common/mock.js';9import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';10import { NullLogService } from '../../../../../platform/log/common/log.js';11import { DebugModel, ExceptionBreakpoint, FunctionBreakpoint, Thread } from '../../common/debugModel.js';12import { MockDebugStorage } from './mockDebug.js';13import { TestStorageService } from '../../../../test/common/workbenchTestServices.js';1415suite('DebugModel', () => {16ensureNoDisposablesAreLeakedInTestSuite();1718suite('FunctionBreakpoint', () => {19test('Id is saved', () => {20const fbp = new FunctionBreakpoint({ name: 'function', enabled: true, hitCondition: 'hit condition', condition: 'condition', logMessage: 'log message' });21const strigified = JSON.stringify(fbp);22const parsed = JSON.parse(strigified);23assert.equal(parsed.id, fbp.getId());24});25});2627suite('ExceptionBreakpoint', () => {28test('Restored matches new', () => {29const ebp = new ExceptionBreakpoint({30conditionDescription: 'condition description',31description: 'description',32filter: 'condition',33label: 'label',34supportsCondition: true,35enabled: true,36}, 'id');37const strigified = JSON.stringify(ebp);38const parsed = JSON.parse(strigified);39const newEbp = new ExceptionBreakpoint(parsed);40assert.ok(ebp.matches(newEbp));41});42});4344suite('DebugModel', () => {45test('refreshTopOfCallstack resolves all returned promises when called multiple times', async () => {46const topFrameDeferred = new DeferredPromise<void>();47const wholeStackDeferred = new DeferredPromise<void>();48const fakeThread = mockObject<Thread>()({49session: { capabilities: { supportsDelayedStackTraceLoading: true } } as any,50getCallStack: () => [],51getStaleCallStack: () => [],52});53fakeThread.fetchCallStack.callsFake((levels: number) => {54return levels === 1 ? topFrameDeferred.p : wholeStackDeferred.p;55});56fakeThread.getId.returns(1);5758const disposable = new DisposableStore();59const storage = disposable.add(new TestStorageService());60const model = new DebugModel(disposable.add(new MockDebugStorage(storage)), <any>{ isDirty: (e: any) => false }, undefined!, new NullLogService());61disposable.add(model);6263let top1Resolved = false;64let whole1Resolved = false;65let top2Resolved = false;66let whole2Resolved = false;67const result1 = model.refreshTopOfCallstack(fakeThread as any);68result1.topCallStack.then(() => top1Resolved = true);69result1.wholeCallStack.then(() => whole1Resolved = true);7071const result2 = model.refreshTopOfCallstack(fakeThread as any);72result2.topCallStack.then(() => top2Resolved = true);73result2.wholeCallStack.then(() => whole2Resolved = true);7475assert.ok(!top1Resolved);76assert.ok(!whole1Resolved);77assert.ok(!top2Resolved);78assert.ok(!whole2Resolved);7980await topFrameDeferred.complete();81await result1.topCallStack;82await result2.topCallStack;83assert.ok(!whole1Resolved);84assert.ok(!whole2Resolved);8586await wholeStackDeferred.complete();87await result1.wholeCallStack;88await result2.wholeCallStack;8990disposable.dispose();91});92});93});949596