Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/api/test/browser/mainThreadVariableProvider.test.ts
4780 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 { TestMainThreadNotebookKernels } from './TestMainThreadNotebookKernels.js';
9
import { ExtHostNotebookKernelsShape } from '../../common/extHost.protocol.js';
10
import { mock } from '../../../test/common/workbenchTestServices.js';
11
import { CancellationToken, CancellationTokenSource } from '../../../../base/common/cancellation.js';
12
import { URI, UriComponents } from '../../../../base/common/uri.js';
13
import { SingleProxyRPCProtocol } from '../common/testRPCProtocol.js';
14
import { AsyncIterableProducer } from '../../../../base/common/async.js';
15
import { VariablesResult } from '../../../contrib/notebook/common/notebookKernelService.js';
16
17
type variableGetter = () => Promise<VariablesResult>;
18
19
suite('MainThreadNotebookKernelVariableProvider', function () {
20
let mainThreadKernels: TestMainThreadNotebookKernels;
21
let variables: (VariablesResult | variableGetter)[];
22
23
teardown(function () {
24
});
25
26
const store = ensureNoDisposablesAreLeakedInTestSuite();
27
28
setup(async function () {
29
const proxy = new class extends mock<ExtHostNotebookKernelsShape>() {
30
override async $provideVariables(handle: number, requestId: string, notebookUri: UriComponents, parentId: number | undefined, kind: 'named' | 'indexed', start: number, token: CancellationToken): Promise<void> {
31
for (const variable of variables) {
32
if (token.isCancellationRequested) {
33
return;
34
}
35
const result = typeof variable === 'function'
36
? await variable()
37
: variable;
38
mainThreadKernels.instance.$receiveVariable(requestId, result);
39
}
40
}
41
};
42
const extHostContext = SingleProxyRPCProtocol(proxy);
43
variables = [];
44
mainThreadKernels = store.add(new TestMainThreadNotebookKernels(extHostContext));
45
});
46
47
test('get variables from kernel', async function () {
48
await mainThreadKernels.addKernel('test-kernel');
49
50
const kernel = mainThreadKernels.getKernel('test-kernel');
51
assert.ok(kernel, 'Kernel should be registered');
52
53
variables.push(createVariable(1));
54
variables.push(createVariable(2));
55
const vars = kernel.provideVariables(URI.file('nb.ipynb'), undefined, 'named', 0, CancellationToken.None);
56
57
await verifyVariables(vars, [1, 2]);
58
});
59
60
test('get variables twice', async function () {
61
await mainThreadKernels.addKernel('test-kernel');
62
63
const kernel = mainThreadKernels.getKernel('test-kernel');
64
assert.ok(kernel, 'Kernel should be registered');
65
66
variables.push(createVariable(1));
67
variables.push(createVariable(2));
68
const vars = kernel.provideVariables(URI.file('nb.ipynb'), undefined, 'named', 0, CancellationToken.None);
69
const vars2 = kernel.provideVariables(URI.file('nb.ipynb'), undefined, 'named', 0, CancellationToken.None);
70
71
await verifyVariables(vars, [1, 2]);
72
await verifyVariables(vars2, [1, 2]);
73
});
74
75
test('gets all variables async', async function () {
76
await mainThreadKernels.addKernel('test-kernel');
77
78
const kernel = mainThreadKernels.getKernel('test-kernel');
79
assert.ok(kernel, 'Kernel should be registered');
80
81
variables.push(createVariable(1));
82
const result = createVariable(2);
83
variables.push(async () => {
84
await new Promise(resolve => setTimeout(resolve, 5));
85
return result;
86
});
87
variables.push(createVariable(3));
88
const vars = kernel.provideVariables(URI.file('nb.ipynb'), undefined, 'named', 0, CancellationToken.None);
89
90
await verifyVariables(vars, [1, 2, 3]);
91
});
92
93
test('cancel while getting variables', async function () {
94
await mainThreadKernels.addKernel('test-kernel');
95
96
const kernel = mainThreadKernels.getKernel('test-kernel');
97
assert.ok(kernel, 'Kernel should be registered');
98
99
variables.push(createVariable(1));
100
const result = createVariable(2);
101
variables.push(async () => {
102
await new Promise(resolve => setTimeout(resolve, 50));
103
return result;
104
});
105
variables.push(createVariable(3));
106
const cancellation = new CancellationTokenSource();
107
const vars = kernel.provideVariables(URI.file('nb.ipynb'), undefined, 'named', 0, cancellation.token);
108
cancellation.cancel();
109
110
await verifyVariables(vars, [1, 2]);
111
});
112
});
113
114
async function verifyVariables(variables: AsyncIterableProducer<VariablesResult>, expectedIds: number[]) {
115
let varIx = 0;
116
117
for await (const variable of variables) {
118
assert.ok(expectedIds[varIx], 'more variables than expected');
119
assert.strictEqual(variable.id, expectedIds[varIx++]);
120
}
121
}
122
123
function createVariable(id: number) {
124
return {
125
id,
126
name: `var${id}`,
127
value: `${id}`,
128
type: 'number',
129
expression: `var${id}`,
130
hasNamedChildren: false,
131
indexedChildrenCount: 0,
132
extensionId: 'extension-id1',
133
};
134
}
135
136