Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/microsoft/vscode.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Chiodo <rchiodo@users.noreply.github.com>2022-05-25 19:01:58 +0300
committerGitHub <noreply@github.com>2022-05-25 19:01:58 +0300
commite9620973ddff9423f26a246853fcda169b95cf7c (patch)
treeaa2b5148e5b27e99c4c4a1a8395022937a98e3d1 /extensions
parent97f8e66d74b7b2d9cefbcb8db8589aa55c0e9cb9 (diff)
parent60c8307e9642d2d950584450efdd8bd240b056c9 (diff)
Merge pull request #150300 from rchiodo/rchiodo/iw_output_scrolling
Fix interactive window to scroll as output resizes
Diffstat (limited to 'extensions')
-rw-r--r--extensions/vscode-api-tests/src/singlefolder-tests/interactiveWindow.test.ts88
-rw-r--r--extensions/vscode-api-tests/src/singlefolder-tests/notebook.test.ts17
2 files changed, 100 insertions, 5 deletions
diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/interactiveWindow.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/interactiveWindow.test.ts
new file mode 100644
index 00000000000..6880607ca7d
--- /dev/null
+++ b/extensions/vscode-api-tests/src/singlefolder-tests/interactiveWindow.test.ts
@@ -0,0 +1,88 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+import * as assert from 'assert';
+import 'mocha';
+import * as vscode from 'vscode';
+import { disposeAll } from '../utils';
+import { Kernel, saveAllFilesAndCloseAll } from './notebook.test';
+
+export type INativeInteractiveWindow = { notebookUri: vscode.Uri; inputUri: vscode.Uri; notebookEditor: vscode.NotebookEditor };
+
+async function createInteractiveWindow(kernel: Kernel) {
+ const { notebookEditor } = (await vscode.commands.executeCommand(
+ 'interactive.open',
+ // Keep focus on the owning file if there is one
+ { viewColumn: vscode.ViewColumn.Beside, preserveFocus: false },
+ undefined,
+ kernel.controller.id,
+ undefined
+ )) as unknown as INativeInteractiveWindow;
+
+ return notebookEditor;
+}
+
+async function addCell(code: string, notebook: vscode.NotebookDocument) {
+ const cell = new vscode.NotebookCellData(vscode.NotebookCellKind.Code, code, 'typescript');
+ const edit = vscode.NotebookEdit.insertCells(notebook.cellCount, [cell]);
+ const workspaceEdit = new vscode.WorkspaceEdit();
+ workspaceEdit.set(notebook.uri, [edit]);
+ await vscode.workspace.applyEdit(workspaceEdit);
+ return notebook.cellAt(notebook.cellCount - 1);
+}
+
+async function addCellAndRun(code: string, notebook: vscode.NotebookDocument) {
+ const cell = await addCell(code, notebook);
+ await vscode.commands.executeCommand('notebook.execute');
+ assert.strictEqual(cell.outputs.length, 1, 'execute failed');
+ return cell;
+}
+
+
+(vscode.env.uiKind === vscode.UIKind.Web ? suite.skip : suite)('Interactive Window', function () {
+
+ const testDisposables: vscode.Disposable[] = [];
+ let defaultKernel: Kernel;
+
+ setup(async function () {
+ // there should be ONE default kernel in this suite
+ defaultKernel = new Kernel('mainKernel', 'Notebook Default Kernel', 'interactive');
+ testDisposables.push(defaultKernel.controller);
+ await saveAllFilesAndCloseAll();
+ });
+
+ teardown(async function () {
+ disposeAll(testDisposables);
+ testDisposables.length = 0;
+ await saveAllFilesAndCloseAll();
+ });
+
+ test('Can open an interactive window', async () => {
+ assert.ok(vscode.workspace.workspaceFolders);
+ const notebookEditor = await createInteractiveWindow(defaultKernel);
+ assert.ok(notebookEditor);
+
+ // Try adding a cell and running it.
+ await addCell('print foo', notebookEditor.notebook);
+
+ assert.strictEqual(notebookEditor.notebook.cellCount, 1);
+ assert.strictEqual(notebookEditor.notebook.cellAt(0).kind, vscode.NotebookCellKind.Code);
+ });
+
+ test('Interactive window scrolls after execute', async () => {
+ assert.ok(vscode.workspace.workspaceFolders);
+ const notebookEditor = await createInteractiveWindow(defaultKernel);
+ assert.ok(notebookEditor);
+
+ // Run and add a bunch of cells
+ for (let i = 0; i < 20; i++) {
+ await addCellAndRun(`print ${i}`, notebookEditor.notebook);
+ }
+
+ // Verify visible range has the last cell
+ assert.strictEqual(notebookEditor.visibleRanges[notebookEditor.visibleRanges.length - 1].end, notebookEditor.notebook.cellCount, `Last cell is not visible`);
+
+ });
+});
diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/notebook.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/notebook.test.ts
index 462e3113698..33cad6edb97 100644
--- a/extensions/vscode-api-tests/src/singlefolder-tests/notebook.test.ts
+++ b/extensions/vscode-api-tests/src/singlefolder-tests/notebook.test.ts
@@ -18,7 +18,7 @@ async function openRandomNotebookDocument() {
return vscode.workspace.openNotebookDocument(uri);
}
-async function saveAllFilesAndCloseAll() {
+export async function saveAllFilesAndCloseAll() {
await saveAllEditors();
await closeAllEditors();
}
@@ -29,14 +29,20 @@ async function withEvent<T>(event: vscode.Event<T>, callback: (e: Promise<T>) =>
}
-class Kernel {
+function sleep(ms: number): Promise<void> {
+ return new Promise(resolve => {
+ setTimeout(resolve, ms);
+ });
+}
+
+export class Kernel {
readonly controller: vscode.NotebookController;
readonly associatedNotebooks = new Set<string>();
- constructor(id: string, label: string) {
- this.controller = vscode.notebooks.createNotebookController(id, 'notebookCoreTest', label);
+ constructor(id: string, label: string, viewType: string = 'notebookCoreTest') {
+ this.controller = vscode.notebooks.createNotebookController(id, viewType, label);
this.controller.executeHandler = this._execute.bind(this);
this.controller.supportsExecutionOrder = true;
this.controller.supportedLanguages = ['typescript', 'javascript'];
@@ -59,8 +65,9 @@ class Kernel {
// create a single output with exec order 1 and output is plain/text
// of either the cell itself or (iff empty) the cell's document's uri
const task = this.controller.createNotebookCellExecution(cell);
- task.start();
+ task.start(Date.now());
task.executionOrder = 1;
+ await sleep(10); // Force to be take some time
await task.replaceOutput([new vscode.NotebookCellOutput([
vscode.NotebookCellOutputItem.text(cell.document.getText() || cell.document.uri.toString(), 'text/plain')
])]);