Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/debug/test/browser/debugHover.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 { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';
8
import { NullLogService } from '../../../../../platform/log/common/log.js';
9
import { findExpressionInStackFrame } from '../../browser/debugHover.js';
10
import type { IExpression, IScope } from '../../common/debug.js';
11
import { Scope, StackFrame, Thread, Variable } from '../../common/debugModel.js';
12
import { Source } from '../../common/debugSource.js';
13
import { createTestSession } from './callStack.test.js';
14
import { createMockDebugModel, mockUriIdentityService } from './mockDebugModel.js';
15
16
suite('Debug - Hover', () => {
17
const disposables = ensureNoDisposablesAreLeakedInTestSuite();
18
19
test('find expression in stack frame', async () => {
20
const model = createMockDebugModel(disposables);
21
const session = disposables.add(createTestSession(model));
22
23
const thread = new class extends Thread {
24
public override getCallStack(): StackFrame[] {
25
return [stackFrame];
26
}
27
}(session, 'mockthread', 1);
28
29
const firstSource = new Source({
30
name: 'internalModule.js',
31
path: 'a/b/c/d/internalModule.js',
32
sourceReference: 10,
33
}, 'aDebugSessionId', mockUriIdentityService, new NullLogService());
34
35
const stackFrame = new class extends StackFrame {
36
override getScopes(): Promise<IScope[]> {
37
return Promise.resolve([scope]);
38
}
39
}(thread, 1, firstSource, 'app.js', 'normal', { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 10 }, 1, true);
40
41
42
const scope = new class extends Scope {
43
override getChildren(): Promise<IExpression[]> {
44
return Promise.resolve([variableA]);
45
}
46
}(stackFrame, 1, 'local', 1, false, 10, 10);
47
48
const variableA = new class extends Variable {
49
override getChildren(): Promise<IExpression[]> {
50
return Promise.resolve([variableB]);
51
}
52
}(session, 1, scope, 2, 'A', 'A', undefined, 0, 0, undefined, {}, 'string');
53
const variableB = new Variable(session, 1, scope, 2, 'B', 'A.B', undefined, 0, 0, undefined, {}, 'string');
54
55
assert.strictEqual(await findExpressionInStackFrame(stackFrame, []), undefined);
56
assert.strictEqual(await findExpressionInStackFrame(stackFrame, ['A']), variableA);
57
assert.strictEqual(await findExpressionInStackFrame(stackFrame, ['doesNotExist', 'no']), undefined);
58
assert.strictEqual(await findExpressionInStackFrame(stackFrame, ['a']), undefined);
59
assert.strictEqual(await findExpressionInStackFrame(stackFrame, ['B']), undefined);
60
assert.strictEqual(await findExpressionInStackFrame(stackFrame, ['A', 'B']), variableB);
61
assert.strictEqual(await findExpressionInStackFrame(stackFrame, ['A', 'C']), undefined);
62
63
// We do not search in expensive scopes
64
scope.expensive = true;
65
assert.strictEqual(await findExpressionInStackFrame(stackFrame, ['A']), undefined);
66
});
67
});
68
69