Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/debug/test/browser/baseDebugView.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 * as dom from '../../../../../base/browser/dom.js';
8
import { HighlightedLabel } from '../../../../../base/browser/ui/highlightedlabel/highlightedLabel.js';
9
import { DisposableStore } from '../../../../../base/common/lifecycle.js';
10
import { isWindows } from '../../../../../base/common/platform.js';
11
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';
12
import { IHoverService } from '../../../../../platform/hover/browser/hover.js';
13
import { NullHoverService } from '../../../../../platform/hover/test/browser/nullHoverService.js';
14
import { TestInstantiationService } from '../../../../../platform/instantiation/test/common/instantiationServiceMock.js';
15
import { workbenchInstantiationService } from '../../../../test/browser/workbenchTestServices.js';
16
import { renderViewTree } from '../../browser/baseDebugView.js';
17
import { DebugExpressionRenderer } from '../../browser/debugExpressionRenderer.js';
18
import { isStatusbarInDebugMode } from '../../browser/statusbarColorProvider.js';
19
import { State } from '../../common/debug.js';
20
import { Expression, Scope, StackFrame, Thread, Variable } from '../../common/debugModel.js';
21
import { MockSession } from '../common/mockDebug.js';
22
import { createTestSession } from './callStack.test.js';
23
import { createMockDebugModel } from './mockDebugModel.js';
24
import { TestConfigurationService } from '../../../../../platform/configuration/test/common/testConfigurationService.js';
25
import { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';
26
const $ = dom.$;
27
28
29
suite('Debug - Base Debug View', () => {
30
const disposables = ensureNoDisposablesAreLeakedInTestSuite();
31
let renderer: DebugExpressionRenderer;
32
let configurationService: TestConfigurationService;
33
34
function assertVariable(session: MockSession, scope: Scope, disposables: Pick<DisposableStore, "add">, displayType: boolean) {
35
let variable = new Variable(session, 1, scope, 2, 'foo', 'bar.foo', undefined, 0, 0, undefined, {}, 'string');
36
let expression = $('.');
37
let name = $('.');
38
let type = $('.');
39
let value = $('.');
40
const label = new HighlightedLabel(name);
41
const lazyButton = $('.');
42
const store = disposables.add(new DisposableStore());
43
store.add(renderer.renderVariable({ expression, name, type, value, label, lazyButton }, variable, { showChanged: false }));
44
45
assert.strictEqual(label.element.textContent, 'foo');
46
assert.strictEqual(value.textContent, '');
47
48
variable.value = 'hey';
49
expression = $('.');
50
name = $('.');
51
type = $('.');
52
value = $('.');
53
store.add(renderer.renderVariable({ expression, name, type, value, label, lazyButton }, variable, { showChanged: false }));
54
assert.strictEqual(value.textContent, 'hey');
55
assert.strictEqual(label.element.textContent, displayType ? 'foo: ' : 'foo =');
56
assert.strictEqual(type.textContent, displayType ? 'string =' : '');
57
58
variable.value = isWindows ? 'C:\\foo.js:5' : '/foo.js:5';
59
expression = $('.');
60
name = $('.');
61
type = $('.');
62
value = $('.');
63
store.add(renderer.renderVariable({ expression, name, type, value, label, lazyButton }, variable, { showChanged: false }));
64
assert.ok(value.querySelector('a'));
65
assert.strictEqual(value.querySelector('a')!.textContent, variable.value);
66
67
variable = new Variable(session, 1, scope, 2, 'console', 'console', '5', 0, 0, undefined, { kind: 'virtual' });
68
expression = $('.');
69
name = $('.');
70
type = $('.');
71
value = $('.');
72
store.add(renderer.renderVariable({ expression, name, type, value, label, lazyButton }, variable, { showChanged: false }));
73
assert.strictEqual(name.className, 'virtual');
74
assert.strictEqual(label.element.textContent, 'console =');
75
assert.strictEqual(value.className, 'value number');
76
77
variable = new Variable(session, 1, scope, 2, 'xpto', 'xpto.xpto', undefined, 0, 0, undefined, {}, 'custom-type');
78
store.add(renderer.renderVariable({ expression, name, type, value, label, lazyButton }, variable, { showChanged: false }));
79
assert.strictEqual(label.element.textContent, 'xpto');
80
assert.strictEqual(value.textContent, '');
81
variable.value = '2';
82
expression = $('.');
83
name = $('.');
84
type = $('.');
85
value = $('.');
86
store.add(renderer.renderVariable({ expression, name, type, value, label, lazyButton }, variable, { showChanged: false }));
87
assert.strictEqual(value.textContent, '2');
88
assert.strictEqual(label.element.textContent, displayType ? 'xpto: ' : 'xpto =');
89
assert.strictEqual(type.textContent, displayType ? 'custom-type =' : '');
90
91
label.dispose();
92
}
93
94
/**
95
* Instantiate services for use by the functions being tested.
96
*/
97
setup(() => {
98
const instantiationService: TestInstantiationService = workbenchInstantiationService(undefined, disposables);
99
configurationService = instantiationService.createInstance(TestConfigurationService);
100
instantiationService.stub(IConfigurationService, configurationService);
101
instantiationService.stub(IHoverService, NullHoverService);
102
renderer = instantiationService.createInstance(DebugExpressionRenderer);
103
});
104
105
test('render view tree', () => {
106
const container = $('.container');
107
const treeContainer = renderViewTree(container);
108
109
assert.strictEqual(treeContainer.className, 'debug-view-content file-icon-themable-tree');
110
assert.strictEqual(container.childElementCount, 1);
111
assert.strictEqual(container.firstChild, treeContainer);
112
assert.strictEqual(dom.isHTMLDivElement(treeContainer), true);
113
});
114
115
test('render expression value', () => {
116
let container = $('.container');
117
const store = disposables.add(new DisposableStore());
118
store.add(renderer.renderValue(container, 'render \n me', {}));
119
assert.strictEqual(container.className, 'container value');
120
assert.strictEqual(container.textContent, 'render \n me');
121
122
const expression = new Expression('console');
123
expression.value = 'Object';
124
container = $('.container');
125
store.add(renderer.renderValue(container, expression, { colorize: true }));
126
assert.strictEqual(container.className, 'container value unavailable error');
127
128
expression.available = true;
129
expression.value = '"string value"';
130
container = $('.container');
131
store.add(renderer.renderValue(container, expression, { colorize: true }));
132
assert.strictEqual(container.className, 'container value string');
133
assert.strictEqual(container.textContent, '"string value"');
134
135
expression.type = 'boolean';
136
container = $('.container');
137
store.add(renderer.renderValue(container, expression, { colorize: true }));
138
assert.strictEqual(container.className, 'container value boolean');
139
assert.strictEqual(container.textContent, expression.value);
140
141
expression.value = 'this is a long string';
142
container = $('.container');
143
store.add(renderer.renderValue(container, expression, { colorize: true, maxValueLength: 4 }));
144
assert.strictEqual(container.textContent, 'this...');
145
146
expression.value = isWindows ? 'C:\\foo.js:5' : '/foo.js:5';
147
container = $('.container');
148
store.add(renderer.renderValue(container, expression, { colorize: true }));
149
assert.ok(container.querySelector('a'));
150
assert.strictEqual(container.querySelector('a')!.textContent, expression.value);
151
});
152
153
test('render variable', () => {
154
const session = new MockSession();
155
const thread = new Thread(session, 'mockthread', 1);
156
const range = {
157
startLineNumber: 1,
158
startColumn: 1,
159
endLineNumber: undefined!,
160
endColumn: undefined!
161
};
162
const stackFrame = new StackFrame(thread, 1, null!, 'app.js', 'normal', range, 0, true);
163
const scope = new Scope(stackFrame, 1, 'local', 1, false, 10, 10);
164
165
configurationService.setUserConfiguration('debug.showVariableTypes', false);
166
assertVariable(session, scope, disposables, false);
167
168
});
169
170
test('render variable with display type setting', () => {
171
const session = new MockSession();
172
const thread = new Thread(session, 'mockthread', 1);
173
const range = {
174
startLineNumber: 1,
175
startColumn: 1,
176
endLineNumber: undefined!,
177
endColumn: undefined!
178
};
179
const stackFrame = new StackFrame(thread, 1, null!, 'app.js', 'normal', range, 0, true);
180
const scope = new Scope(stackFrame, 1, 'local', 1, false, 10, 10);
181
182
configurationService.setUserConfiguration('debug.showVariableTypes', true);
183
assertVariable(session, scope, disposables, true);
184
});
185
186
test('statusbar in debug mode', () => {
187
const model = createMockDebugModel(disposables);
188
const session = disposables.add(createTestSession(model));
189
const session2 = disposables.add(createTestSession(model, undefined, { suppressDebugStatusbar: true }));
190
assert.strictEqual(isStatusbarInDebugMode(State.Inactive, []), false);
191
assert.strictEqual(isStatusbarInDebugMode(State.Initializing, [session]), false);
192
assert.strictEqual(isStatusbarInDebugMode(State.Running, [session]), true);
193
assert.strictEqual(isStatusbarInDebugMode(State.Stopped, [session]), true);
194
195
assert.strictEqual(isStatusbarInDebugMode(State.Running, [session2]), false);
196
assert.strictEqual(isStatusbarInDebugMode(State.Running, [session, session2]), true);
197
198
session.configuration.noDebug = true;
199
assert.strictEqual(isStatusbarInDebugMode(State.Running, [session]), false);
200
assert.strictEqual(isStatusbarInDebugMode(State.Running, [session, session2]), false);
201
});
202
});
203
204