Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/debug/test/common/debugModel.test.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import assert from 'assert';
7
import { DeferredPromise } from '../../../../../base/common/async.js';
8
import { DisposableStore } from '../../../../../base/common/lifecycle.js';
9
import { mockObject } from '../../../../../base/test/common/mock.js';
10
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';
11
import { NullLogService } from '../../../../../platform/log/common/log.js';
12
import { DebugModel, ExceptionBreakpoint, FunctionBreakpoint, Thread } from '../../common/debugModel.js';
13
import { MockDebugStorage } from './mockDebug.js';
14
import { TestStorageService } from '../../../../test/common/workbenchTestServices.js';
15
16
suite('DebugModel', () => {
17
ensureNoDisposablesAreLeakedInTestSuite();
18
19
suite('FunctionBreakpoint', () => {
20
test('Id is saved', () => {
21
const fbp = new FunctionBreakpoint({ name: 'function', enabled: true, hitCondition: 'hit condition', condition: 'condition', logMessage: 'log message' });
22
const strigified = JSON.stringify(fbp);
23
const parsed = JSON.parse(strigified);
24
assert.equal(parsed.id, fbp.getId());
25
});
26
});
27
28
suite('ExceptionBreakpoint', () => {
29
test('Restored matches new', () => {
30
const ebp = new ExceptionBreakpoint({
31
conditionDescription: 'condition description',
32
description: 'description',
33
filter: 'condition',
34
label: 'label',
35
supportsCondition: true,
36
enabled: true,
37
}, 'id');
38
const strigified = JSON.stringify(ebp);
39
const parsed = JSON.parse(strigified);
40
const newEbp = new ExceptionBreakpoint(parsed);
41
assert.ok(ebp.matches(newEbp));
42
});
43
});
44
45
suite('DebugModel', () => {
46
test('refreshTopOfCallstack resolves all returned promises when called multiple times', async () => {
47
const topFrameDeferred = new DeferredPromise<void>();
48
const wholeStackDeferred = new DeferredPromise<void>();
49
const fakeThread = mockObject<Thread>()({
50
session: { capabilities: { supportsDelayedStackTraceLoading: true } } as any,
51
getCallStack: () => [],
52
getStaleCallStack: () => [],
53
});
54
fakeThread.fetchCallStack.callsFake((levels: number) => {
55
return levels === 1 ? topFrameDeferred.p : wholeStackDeferred.p;
56
});
57
fakeThread.getId.returns(1);
58
59
const disposable = new DisposableStore();
60
const storage = disposable.add(new TestStorageService());
61
const model = new DebugModel(disposable.add(new MockDebugStorage(storage)), <any>{ isDirty: (e: any) => false }, undefined!, new NullLogService());
62
disposable.add(model);
63
64
let top1Resolved = false;
65
let whole1Resolved = false;
66
let top2Resolved = false;
67
let whole2Resolved = false;
68
const result1 = model.refreshTopOfCallstack(fakeThread as any);
69
result1.topCallStack.then(() => top1Resolved = true);
70
result1.wholeCallStack.then(() => whole1Resolved = true);
71
72
const result2 = model.refreshTopOfCallstack(fakeThread as any);
73
result2.topCallStack.then(() => top2Resolved = true);
74
result2.wholeCallStack.then(() => whole2Resolved = true);
75
76
assert.ok(!top1Resolved);
77
assert.ok(!whole1Resolved);
78
assert.ok(!top2Resolved);
79
assert.ok(!whole2Resolved);
80
81
await topFrameDeferred.complete();
82
await result1.topCallStack;
83
await result2.topCallStack;
84
assert.ok(!whole1Resolved);
85
assert.ok(!whole2Resolved);
86
87
await wholeStackDeferred.complete();
88
await result1.wholeCallStack;
89
await result2.wholeCallStack;
90
91
disposable.dispose();
92
});
93
});
94
});
95
96