Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/debug/test/browser/debugUtils.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 { IConfig } from '../../common/debug.js';
9
import { formatPII, getExactExpressionStartAndEnd, getVisibleAndSorted } from '../../common/debugUtils.js';
10
11
suite('Debug - Utils', () => {
12
ensureNoDisposablesAreLeakedInTestSuite();
13
14
test('formatPII', () => {
15
assert.strictEqual(formatPII('Foo Bar', false, {}), 'Foo Bar');
16
assert.strictEqual(formatPII('Foo {key} Bar', false, {}), 'Foo {key} Bar');
17
assert.strictEqual(formatPII('Foo {key} Bar', false, { 'key': 'yes' }), 'Foo yes Bar');
18
assert.strictEqual(formatPII('Foo {_0} Bar {_0}', true, { '_0': 'yes' }), 'Foo yes Bar yes');
19
assert.strictEqual(formatPII('Foo {0} Bar {1}{2}', false, { '0': 'yes' }), 'Foo yes Bar {1}{2}');
20
assert.strictEqual(formatPII('Foo {0} Bar {1}{2}', false, { '0': 'yes', '1': 'undefined' }), 'Foo yes Bar undefined{2}');
21
assert.strictEqual(formatPII('Foo {_key0} Bar {key1}{key2}', true, { '_key0': 'yes', 'key1': '5', 'key2': 'false' }), 'Foo yes Bar {key1}{key2}');
22
assert.strictEqual(formatPII('Foo {_key0} Bar {key1}{key2}', false, { '_key0': 'yes', 'key1': '5', 'key2': 'false' }), 'Foo yes Bar 5false');
23
assert.strictEqual(formatPII('Unable to display threads:"{e}"', false, { 'e': 'detached from process' }), 'Unable to display threads:"detached from process"');
24
});
25
26
test('getExactExpressionStartAndEnd', () => {
27
assert.deepStrictEqual(getExactExpressionStartAndEnd('foo', 1, 2), { start: 1, end: 3 });
28
assert.deepStrictEqual(getExactExpressionStartAndEnd('!foo', 2, 3), { start: 2, end: 4 });
29
assert.deepStrictEqual(getExactExpressionStartAndEnd('foo', 1, 3), { start: 1, end: 3 });
30
assert.deepStrictEqual(getExactExpressionStartAndEnd('foo', 1, 4), { start: 1, end: 3 });
31
assert.deepStrictEqual(getExactExpressionStartAndEnd('this.name = "John"', 1, 10), { start: 1, end: 9 });
32
assert.deepStrictEqual(getExactExpressionStartAndEnd('this.name = "John"', 6, 10), { start: 1, end: 9 });
33
// Hovers over "address" should pick up this->address
34
assert.deepStrictEqual(getExactExpressionStartAndEnd('this->address = "Main street"', 6, 10), { start: 1, end: 13 });
35
// Hovers over "name" should pick up a.b.c.d.name
36
assert.deepStrictEqual(getExactExpressionStartAndEnd('var t = a.b.c.d.name', 16, 20), { start: 9, end: 20 });
37
assert.deepStrictEqual(getExactExpressionStartAndEnd('MyClass::StaticProp', 10, 20), { start: 1, end: 19 });
38
assert.deepStrictEqual(getExactExpressionStartAndEnd('largeNumber = myVar?.prop', 21, 25), { start: 15, end: 25 });
39
40
// For example in expression 'a.b.c.d', hover was under 'b', 'a.b' should be the exact range
41
assert.deepStrictEqual(getExactExpressionStartAndEnd('var t = a.b.c.d.name', 11, 12), { start: 9, end: 11 });
42
43
assert.deepStrictEqual(getExactExpressionStartAndEnd('var t = a.b;c.d.name', 16, 20), { start: 13, end: 20 });
44
assert.deepStrictEqual(getExactExpressionStartAndEnd('var t = a.b.c-d.name', 16, 20), { start: 15, end: 20 });
45
46
assert.deepStrictEqual(getExactExpressionStartAndEnd('var aøñéå文 = a.b.c-d.name', 5, 5), { start: 5, end: 10 });
47
assert.deepStrictEqual(getExactExpressionStartAndEnd('aøñéå文.aøñéå文.aøñéå文', 9, 9), { start: 1, end: 13 });
48
49
// Spread syntax should extract just the identifier
50
assert.deepStrictEqual(getExactExpressionStartAndEnd('[...bar]', 5, 7), { start: 5, end: 7 });
51
assert.deepStrictEqual(getExactExpressionStartAndEnd('...variable', 5, 5), { start: 4, end: 11 });
52
});
53
54
test('config presentation', () => {
55
const configs: IConfig[] = [];
56
configs.push({
57
type: 'node',
58
request: 'launch',
59
name: 'p'
60
});
61
configs.push({
62
type: 'node',
63
request: 'launch',
64
name: 'a'
65
});
66
configs.push({
67
type: 'node',
68
request: 'launch',
69
name: 'b',
70
presentation: {
71
hidden: false
72
}
73
});
74
configs.push({
75
type: 'node',
76
request: 'launch',
77
name: 'c',
78
presentation: {
79
hidden: true
80
}
81
});
82
configs.push({
83
type: 'node',
84
request: 'launch',
85
name: 'd',
86
presentation: {
87
group: '2_group',
88
order: 5
89
}
90
});
91
configs.push({
92
type: 'node',
93
request: 'launch',
94
name: 'e',
95
presentation: {
96
group: '2_group',
97
order: 52
98
}
99
});
100
configs.push({
101
type: 'node',
102
request: 'launch',
103
name: 'f',
104
presentation: {
105
group: '1_group',
106
order: 500
107
}
108
});
109
configs.push({
110
type: 'node',
111
request: 'launch',
112
name: 'g',
113
presentation: {
114
group: '5_group',
115
order: 500
116
}
117
});
118
configs.push({
119
type: 'node',
120
request: 'launch',
121
name: 'h',
122
presentation: {
123
order: 700
124
}
125
});
126
configs.push({
127
type: 'node',
128
request: 'launch',
129
name: 'i',
130
presentation: {
131
order: 1000
132
}
133
});
134
135
const sorted = getVisibleAndSorted(configs);
136
assert.strictEqual(sorted.length, 9);
137
assert.strictEqual(sorted[0].name, 'f');
138
assert.strictEqual(sorted[1].name, 'd');
139
assert.strictEqual(sorted[2].name, 'e');
140
assert.strictEqual(sorted[3].name, 'g');
141
assert.strictEqual(sorted[4].name, 'h');
142
assert.strictEqual(sorted[5].name, 'i');
143
assert.strictEqual(sorted[6].name, 'b');
144
assert.strictEqual(sorted[7].name, 'p');
145
assert.strictEqual(sorted[8].name, 'a');
146
147
});
148
});
149
150