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 06fff1fafb0..612fcad0a15 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/notebook.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/notebook.test.ts @@ -96,6 +96,18 @@ suite('Notebook API tests', function () { cellKind: vscode.NotebookCellKind.Code, outputs: [], metadata: new vscode.NotebookCellMetadata().with({ custom: { testCellMetadata: 123 } }) + }, + { + source: 'test2', + language: 'typescript', + cellKind: vscode.NotebookCellKind.Code, + outputs: [ + new vscode.NotebookCellOutput([ + new vscode.NotebookCellOutputItem('text/plain', 'Hello World', { testOutputItemMetadata: true }) + ], + { testOutputMetadata: true }) + ], + metadata: new vscode.NotebookCellMetadata().with({ custom: { testCellMetadata: 456 } }) } ] }; @@ -357,7 +369,7 @@ suite('Notebook API tests', function () { await vscode.commands.executeCommand('vscode.openWith', resource, 'notebookCoreTest'); const firstEditor = vscode.window.activeNotebookEditor; - assert.strictEqual(firstEditor?.document.cells.length, 1); + assert.strictEqual(firstEditor?.document.cells.length, 2); await saveAllFilesAndCloseAll(undefined); }); @@ -438,7 +450,7 @@ suite('Notebook API tests', function () { }); const document = vscode.window.activeNotebookEditor?.document!; - assert.strictEqual(document.cells.length, 1); + assert.strictEqual(document.cells.length, 2); assert.strictEqual(document.cells[0].metadata.executionOrder, 17); assert.strictEqual(document.cells[0].metadata.inputCollapsed, true); @@ -497,21 +509,20 @@ suite('Notebook API tests', function () { await cellsChangeEvent; await cellMetadataChangeEvent; - assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells.length, 2); + assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells.length, 3); assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells[0]?.metadata?.runnable, false); assert.strictEqual(version + 1, vscode.window.activeNotebookEditor!.document.version); await vscode.commands.executeCommand('undo'); assert.strictEqual(version + 2, vscode.window.activeNotebookEditor!.document.version); assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells[0]?.metadata?.runnable, undefined); - assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells.length, 1); + assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells.length, 2); await saveAllFilesAndCloseAll(resource); }); test('initialzation should not emit cell change events.', async function () { const resource = await createRandomFile('', undefined, '.vsctestnb'); - let count = 0; const disposables: vscode.Disposable[] = []; disposables.push(vscode.notebook.onDidChangeNotebookCells(() => { @@ -536,6 +547,14 @@ suite('Notebook API tests', function () { assert.strictEqual(vscode.window.activeNotebookEditor!.selection?.document.getText(), 'test'); assert.strictEqual(vscode.window.activeNotebookEditor!.selection?.language, 'typescript'); + const secondCell = vscode.window.activeNotebookEditor!.document.cells[1]; + assert.strictEqual(secondCell!.outputs.length, 1); + assert.deepStrictEqual(secondCell!.outputs[0].metadata, { testOutputMetadata: true }); + assert.strictEqual(secondCell!.outputs[0].outputs.length, 1); + assert.strictEqual(secondCell!.outputs[0].outputs[0].mime, 'text/plain'); + assert.strictEqual(secondCell!.outputs[0].outputs[0].value, 'Hello World'); + assert.deepStrictEqual(secondCell!.outputs[0].outputs[0].metadata, { testOutputItemMetadata: true }); + await vscode.commands.executeCommand('notebook.cell.insertCodeCellBelow'); assert.strictEqual(vscode.window.activeNotebookEditor!.selection?.document.getText(), ''); @@ -543,7 +562,7 @@ suite('Notebook API tests', function () { const activeCell = vscode.window.activeNotebookEditor!.selection; assert.notEqual(vscode.window.activeNotebookEditor!.selection, undefined); assert.strictEqual(activeCell!.document.getText(), ''); - assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells.length, 3); + assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells.length, 4); assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells.indexOf(activeCell!), 1); await vscode.commands.executeCommand('workbench.action.files.save'); @@ -566,13 +585,13 @@ suite('Notebook API tests', function () { let activeCell = vscode.window.activeNotebookEditor!.selection; assert.notEqual(vscode.window.activeNotebookEditor!.selection, undefined); assert.strictEqual(activeCell!.document.getText(), ''); - assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells.length, 3); + assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells.length, 4); assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells.indexOf(activeCell!), 1); // ---- focus bottom ---- // await vscode.commands.executeCommand('notebook.focusBottom'); activeCell = vscode.window.activeNotebookEditor!.selection; - assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells.indexOf(activeCell!), 2); + assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells.indexOf(activeCell!), 3); // ---- focus top and then copy down ---- // await vscode.commands.executeCommand('notebook.focusTop'); @@ -592,7 +611,7 @@ suite('Notebook API tests', function () { // ---- focus top and then copy up ---- // await vscode.commands.executeCommand('notebook.focusTop'); await vscode.commands.executeCommand('notebook.cell.copyUp'); - assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells.length, 4); + assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells.length, 5); assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells[0].document.getText(), 'test'); assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells[1].document.getText(), 'test'); assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells[2].document.getText(), ''); @@ -859,7 +878,7 @@ suite('Notebook API tests', function () { const activeCell = vscode.window.activeNotebookEditor!.selection; assert.notStrictEqual(vscode.window.activeNotebookEditor!.selection, undefined); assert.strictEqual(activeCell!.document.getText(), ''); - assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells.length, 3); + assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells.length, 4); assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells.indexOf(activeCell!), 1); await withEvent(vscode.workspace.onDidChangeTextDocument, async event => { @@ -892,7 +911,7 @@ suite('Notebook API tests', function () { const activeCell = vscode.window.activeNotebookEditor!.selection; assert.notStrictEqual(vscode.window.activeNotebookEditor!.selection, undefined); assert.strictEqual(activeCell!.document.getText(), ''); - assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells.length, 3); + assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells.length, 4); assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells.indexOf(activeCell!), 1); @@ -901,13 +920,13 @@ suite('Notebook API tests', function () { edit.insert(vscode.window.activeNotebookEditor!.selection!.uri, new vscode.Position(0, 0), 'var abc = 0;'); await vscode.workspace.applyEdit(edit); await vscode.commands.executeCommand('notebook.cell.delete'); - assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells.length, 2); + assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells.length, 3); assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells.indexOf(vscode.window.activeNotebookEditor!.selection!), 1); // undo should bring back the deleted cell, and revert to previous content and selection await vscode.commands.executeCommand('undo'); - assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells.length, 3); + assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells.length, 4); assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells.indexOf(vscode.window.activeNotebookEditor!.selection!), 1); assert.strictEqual(vscode.window.activeNotebookEditor?.selection?.document.getText(), 'var abc = 0;'); @@ -939,7 +958,7 @@ suite('Notebook API tests', function () { assert.strictEqual(vscode.window.activeNotebookEditor !== undefined, true); assert.strictEqual(vscode.window.activeNotebookEditor?.selection !== undefined, true); assert.deepStrictEqual(vscode.window.activeNotebookEditor?.document.cells[1], vscode.window.activeNotebookEditor?.selection); - assert.deepStrictEqual(vscode.window.activeNotebookEditor?.document.cells.length, 3); + assert.deepStrictEqual(vscode.window.activeNotebookEditor?.document.cells.length, 4); assert.strictEqual(vscode.window.activeNotebookEditor?.selection?.document.getText(), 'var abc = 0;'); await saveFileAndCloseAll(resource); @@ -966,7 +985,7 @@ suite('Notebook API tests', function () { assert.strictEqual(vscode.window.activeNotebookEditor !== undefined, true); assert.strictEqual(vscode.window.activeNotebookEditor?.selection !== undefined, true); assert.deepStrictEqual(vscode.window.activeNotebookEditor?.document.cells[1], vscode.window.activeNotebookEditor?.selection); - assert.deepStrictEqual(vscode.window.activeNotebookEditor?.document.cells.length, 3); + assert.deepStrictEqual(vscode.window.activeNotebookEditor?.document.cells.length, 4); assert.strictEqual(vscode.window.activeNotebookEditor?.selection?.document.getText(), 'var abc = 0;'); // switch to the second editor @@ -974,7 +993,7 @@ suite('Notebook API tests', function () { assert.strictEqual(vscode.window.activeNotebookEditor !== undefined, true); assert.strictEqual(vscode.window.activeNotebookEditor?.selection !== undefined, true); assert.deepStrictEqual(vscode.window.activeNotebookEditor?.document.cells[1], vscode.window.activeNotebookEditor?.selection); - assert.deepStrictEqual(vscode.window.activeNotebookEditor?.document.cells.length, 2); + assert.deepStrictEqual(vscode.window.activeNotebookEditor?.document.cells.length, 3); assert.strictEqual(vscode.window.activeNotebookEditor?.selection?.document.getText(), ''); await saveAllFilesAndCloseAll(secondResource); @@ -1126,7 +1145,7 @@ suite('Notebook API tests', function () { edit.insert(vscode.window.activeNotebookEditor!.selection!.uri, new vscode.Position(0, 0), 'var abc = 0;'); await vscode.workspace.applyEdit(edit); - assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells.length, 2); + assert.strictEqual(vscode.window.activeNotebookEditor!.document.cells.length, 3); assert.notEqual(vscode.window.activeNotebookEditor!.document.cells[0].document.getText(), vscode.window.activeNotebookEditor!.document.cells[1].document.getText()); await closeAllEditors(); diff --git a/src/vs/workbench/api/common/extHostTypeConverters.ts b/src/vs/workbench/api/common/extHostTypeConverters.ts index d0403e39625..fd1f8a8f178 100644 --- a/src/vs/workbench/api/common/extHostTypeConverters.ts +++ b/src/vs/workbench/api/common/extHostTypeConverters.ts @@ -1466,7 +1466,9 @@ export namespace NotebookCellData { source: data.source, metadata: data.metadata, outputs: data.outputs.map(output => ({ - outputId: output.id, outputs: (output.outputs || []).map(op => ({ + outputId: output.id, + metadata: output.metadata, + outputs: (output.outputs || []).map(op => ({ mime: op.mime, value: op.value, metadata: op.metadata