Path: blob/main/extensions/copilot/test/simulation/fixtures/tests/in-suite-issue-3701/notebookFolding.test.ts
13405 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import * as assert from 'assert';6import { DisposableStore } from 'vs/base/common/lifecycle';7import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock';8import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo';9import { FoldingModel, updateFoldingStateAtIndex } from 'vs/workbench/contrib/notebook/browser/viewModel/foldingModel';10import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon';11import { setupInstantiationService, withTestNotebook } from 'vs/workbench/contrib/notebook/test/browser/testNotebookEditor';1213suite('Notebook Folding', () => {14let disposables: DisposableStore;15let instantiationService: TestInstantiationService;1617suiteSetup(() => {18disposables = new DisposableStore();19instantiationService = setupInstantiationService(disposables);20instantiationService.spy(IUndoRedoService, 'pushElement');21});2223suiteTeardown(() => disposables.dispose());2425test('Folding based on markdown cells', async function () {26await withTestNotebook(27[28['# header 1', 'markdown', CellKind.Markup, [], {}],29['body', 'markdown', CellKind.Markup, [], {}],30['## header 2.1', 'markdown', CellKind.Markup, [], {}],31['body 2', 'markdown', CellKind.Markup, [], {}],32['body 3', 'markdown', CellKind.Markup, [], {}],33['## header 2.2', 'markdown', CellKind.Markup, [], {}],34['var e = 7;', 'markdown', CellKind.Markup, [], {}],35],36(editor, viewModel) => {37const foldingController = new FoldingModel();38foldingController.attachViewModel(viewModel);3940assert.strictEqual(foldingController.regions.findRange(1), 0);41assert.strictEqual(foldingController.regions.findRange(2), 0);42assert.strictEqual(foldingController.regions.findRange(3), 1);43assert.strictEqual(foldingController.regions.findRange(4), 1);44assert.strictEqual(foldingController.regions.findRange(5), 1);45assert.strictEqual(foldingController.regions.findRange(6), 2);46assert.strictEqual(foldingController.regions.findRange(7), 2);47}48);49});5051test('Folding not based on code cells', async function () {52await withTestNotebook(53[54['# header 1', 'markdown', CellKind.Markup, [], {}],55['body', 'markdown', CellKind.Markup, [], {}],56['# comment 1', 'python', CellKind.Code, [], {}],57['body 2', 'markdown', CellKind.Markup, [], {}],58['body 3\n```\n## comment 2\n```', 'markdown', CellKind.Markup, [], {}],59['body 4', 'markdown', CellKind.Markup, [], {}],60['## header 2.1', 'markdown', CellKind.Markup, [], {}],61['var e = 7;', 'python', CellKind.Code, [], {}],62],63(editor, viewModel) => {64const foldingController = new FoldingModel();65foldingController.attachViewModel(viewModel);6667assert.strictEqual(foldingController.regions.findRange(1), 0);68assert.strictEqual(foldingController.regions.findRange(2), 0);69assert.strictEqual(foldingController.regions.findRange(3), 0);70assert.strictEqual(foldingController.regions.findRange(4), 0);71assert.strictEqual(foldingController.regions.findRange(5), 0);72assert.strictEqual(foldingController.regions.findRange(6), 0);73assert.strictEqual(foldingController.regions.findRange(7), 1);74assert.strictEqual(foldingController.regions.findRange(8), 1);75}76);77});7879test('Top level header in a cell wins', async function () {80await withTestNotebook(81[82['# header 1', 'markdown', CellKind.Markup, [], {}],83['body', 'markdown', CellKind.Markup, [], {}],84['## header 2.1\n# header3', 'markdown', CellKind.Markup, [], {}],85['body 2', 'markdown', CellKind.Markup, [], {}],86['body 3', 'markdown', CellKind.Markup, [], {}],87['## header 2.2', 'markdown', CellKind.Markup, [], {}],88['var e = 7;', 'markdown', CellKind.Markup, [], {}],89],90(editor, viewModel) => {91const foldingController = new FoldingModel();92foldingController.attachViewModel(viewModel);9394assert.strictEqual(foldingController.regions.findRange(1), 0);95assert.strictEqual(foldingController.regions.findRange(2), 0);96assert.strictEqual(foldingController.regions.getEndLineNumber(0), 2);9798assert.strictEqual(foldingController.regions.findRange(3), 1);99assert.strictEqual(foldingController.regions.findRange(4), 1);100assert.strictEqual(foldingController.regions.findRange(5), 1);101assert.strictEqual(foldingController.regions.getEndLineNumber(1), 7);102103assert.strictEqual(foldingController.regions.findRange(6), 2);104assert.strictEqual(foldingController.regions.findRange(7), 2);105assert.strictEqual(foldingController.regions.getEndLineNumber(2), 7);106}107);108});109110test('Folding', async function () {111await withTestNotebook(112[113['# header 1', 'markdown', CellKind.Markup, [], {}],114['body', 'markdown', CellKind.Markup, [], {}],115['## header 2.1', 'markdown', CellKind.Markup, [], {}],116['body 2', 'markdown', CellKind.Markup, [], {}],117['body 3', 'markdown', CellKind.Markup, [], {}],118['## header 2.2', 'markdown', CellKind.Markup, [], {}],119['var e = 7;', 'markdown', CellKind.Markup, [], {}],120],121(editor, viewModel) => {122const foldingModel = new FoldingModel();123foldingModel.attachViewModel(viewModel);124updateFoldingStateAtIndex(foldingModel, 0, true);125viewModel.updateFoldingRanges(foldingModel.regions);126assert.deepStrictEqual(viewModel.getHiddenRanges(), [127{ start: 1, end: 6 }128]);129}130);131132133134await withTestNotebook(135[136['# header 1', 'markdown', CellKind.Markup, [], {}],137['body', 'markdown', CellKind.Markup, [], {}],138['## header 2.1\n', 'markdown', CellKind.Markup, [], {}],139['body 2', 'markdown', CellKind.Markup, [], {}],140['body 3', 'markdown', CellKind.Markup, [], {}],141['## header 2.2', 'markdown', CellKind.Markup, [], {}],142['var e = 7;', 'markdown', CellKind.Markup, [], {}],143],144(editor, viewModel) => {145const foldingModel = new FoldingModel();146foldingModel.attachViewModel(viewModel);147updateFoldingStateAtIndex(foldingModel, 2, true);148viewModel.updateFoldingRanges(foldingModel.regions);149150assert.deepStrictEqual(viewModel.getHiddenRanges(), [151{ start: 3, end: 4 }152]);153}154);155156await withTestNotebook(157[158['# header 1', 'markdown', CellKind.Markup, [], {}],159['body', 'markdown', CellKind.Markup, [], {}],160['# header 2.1\n', 'markdown', CellKind.Markup, [], {}],161['body 2', 'markdown', CellKind.Markup, [], {}],162['body 3', 'markdown', CellKind.Markup, [], {}],163['## header 2.2', 'markdown', CellKind.Markup, [], {}],164['var e = 7;', 'markdown', CellKind.Markup, [], {}],165],166(editor, viewModel) => {167const foldingModel = new FoldingModel();168foldingModel.attachViewModel(viewModel);169updateFoldingStateAtIndex(foldingModel, 2, true);170viewModel.updateFoldingRanges(foldingModel.regions);171172assert.deepStrictEqual(viewModel.getHiddenRanges(), [173{ start: 3, end: 6 }174]);175}176);177});178179test('Nested Folding', async function () {180await withTestNotebook(181[182['# header 1', 'markdown', CellKind.Markup, [], {}],183['body', 'markdown', CellKind.Markup, [], {}],184['# header 2.1\n', 'markdown', CellKind.Markup, [], {}],185['body 2', 'markdown', CellKind.Markup, [], {}],186['body 3', 'markdown', CellKind.Markup, [], {}],187['## header 2.2', 'markdown', CellKind.Markup, [], {}],188['var e = 7;', 'markdown', CellKind.Markup, [], {}],189],190(editor, viewModel) => {191const foldingModel = new FoldingModel();192foldingModel.attachViewModel(viewModel);193updateFoldingStateAtIndex(foldingModel, 0, true);194viewModel.updateFoldingRanges(foldingModel.regions);195196assert.deepStrictEqual(viewModel.getHiddenRanges(), [197{ start: 1, end: 1 }198]);199200updateFoldingStateAtIndex(foldingModel, 5, true);201updateFoldingStateAtIndex(foldingModel, 2, true);202viewModel.updateFoldingRanges(foldingModel.regions);203204assert.deepStrictEqual(viewModel.getHiddenRanges(), [205{ start: 1, end: 1 },206{ start: 3, end: 6 }207]);208209updateFoldingStateAtIndex(foldingModel, 2, false);210viewModel.updateFoldingRanges(foldingModel.regions);211assert.deepStrictEqual(viewModel.getHiddenRanges(), [212{ start: 1, end: 1 },213{ start: 6, end: 6 }214]);215216// viewModel.insertCell(7, new TestCell(viewModel.viewType, 7, ['var c = 8;'], 'markdown', CellKind.Code, []), true);217218// assert.deepStrictEqual(viewModel.getHiddenRanges(), [219// { start: 1, end: 1 },220// { start: 6, end: 7 }221// ]);222223// viewModel.insertCell(1, new TestCell(viewModel.viewType, 8, ['var c = 9;'], 'markdown', CellKind.Code, []), true);224// assert.deepStrictEqual(viewModel.getHiddenRanges(), [225// // the first collapsed range is now expanded as we insert content into it.226// // { start: 1,},227// { start: 7, end: 8 }228// ]);229}230);231});232233test('Folding Memento', async function () {234await withTestNotebook(235[236['# header 1', 'markdown', CellKind.Markup, [], {}],237['body', 'markdown', CellKind.Markup, [], {}],238['# header 2.1\n', 'markdown', CellKind.Markup, [], {}],239['body 2', 'markdown', CellKind.Markup, [], {}],240['body 3', 'markdown', CellKind.Markup, [], {}],241['## header 2.2', 'markdown', CellKind.Markup, [], {}],242['var e = 7;', 'markdown', CellKind.Markup, [], {}],243['# header 2.1\n', 'markdown', CellKind.Markup, [], {}],244['body 2', 'markdown', CellKind.Markup, [], {}],245['body 3', 'markdown', CellKind.Markup, [], {}],246['## header 2.2', 'markdown', CellKind.Markup, [], {}],247['var e = 7;', 'markdown', CellKind.Markup, [], {}],248],249(editor, viewModel) => {250const foldingModel = new FoldingModel();251foldingModel.attachViewModel(viewModel);252foldingModel.applyMemento([{ start: 2, end: 6 }]);253viewModel.updateFoldingRanges(foldingModel.regions);254255// Note that hidden ranges !== folding ranges256assert.deepStrictEqual(viewModel.getHiddenRanges(), [257{ start: 3, end: 6 }258]);259}260);261262await withTestNotebook(263[264['# header 1', 'markdown', CellKind.Markup, [], {}],265['body', 'markdown', CellKind.Markup, [], {}],266['# header 2.1\n', 'markdown', CellKind.Markup, [], {}],267['body 2', 'markdown', CellKind.Markup, [], {}],268['body 3', 'markdown', CellKind.Markup, [], {}],269['## header 2.2', 'markdown', CellKind.Markup, [], {}],270['var e = 7;', 'markdown', CellKind.Markup, [], {}],271['# header 2.1\n', 'markdown', CellKind.Markup, [], {}],272['body 2', 'markdown', CellKind.Markup, [], {}],273['body 3', 'markdown', CellKind.Markup, [], {}],274['## header 2.2', 'markdown', CellKind.Markup, [], {}],275['var e = 7;', 'markdown', CellKind.Markup, [], {}],276],277(editor, viewModel) => {278const foldingModel = new FoldingModel();279foldingModel.attachViewModel(viewModel);280foldingModel.applyMemento([281{ start: 5, end: 6 },282{ start: 10, end: 11 },283]);284viewModel.updateFoldingRanges(foldingModel.regions);285286// Note that hidden ranges !== folding ranges287assert.deepStrictEqual(viewModel.getHiddenRanges(), [288{ start: 6, end: 6 },289{ start: 11, end: 11 }290]);291}292);293294await withTestNotebook(295[296['# header 1', 'markdown', CellKind.Markup, [], {}],297['body', 'markdown', CellKind.Markup, [], {}],298['# header 2.1\n', 'markdown', CellKind.Markup, [], {}],299['body 2', 'markdown', CellKind.Markup, [], {}],300['body 3', 'markdown', CellKind.Markup, [], {}],301['## header 2.2', 'markdown', CellKind.Markup, [], {}],302['var e = 7;', 'markdown', CellKind.Markup, [], {}],303['# header 2.1\n', 'markdown', CellKind.Markup, [], {}],304['body 2', 'markdown', CellKind.Markup, [], {}],305['body 3', 'markdown', CellKind.Markup, [], {}],306['## header 2.2', 'markdown', CellKind.Markup, [], {}],307['var e = 7;', 'markdown', CellKind.Markup, [], {}],308],309(editor, viewModel) => {310const foldingModel = new FoldingModel();311foldingModel.attachViewModel(viewModel);312foldingModel.applyMemento([313{ start: 5, end: 6 },314{ start: 7, end: 11 },315]);316viewModel.updateFoldingRanges(foldingModel.regions);317318// Note that hidden ranges !== folding ranges319assert.deepStrictEqual(viewModel.getHiddenRanges(), [320{ start: 6, end: 6 },321{ start: 8, end: 11 }322]);323}324);325});326327test('View Index', async function () {328await withTestNotebook(329[330['# header 1', 'markdown', CellKind.Markup, [], {}],331['body', 'markdown', CellKind.Markup, [], {}],332['# header 2.1\n', 'markdown', CellKind.Markup, [], {}],333['body 2', 'markdown', CellKind.Markup, [], {}],334['body 3', 'markdown', CellKind.Markup, [], {}],335['## header 2.2', 'markdown', CellKind.Markup, [], {}],336['var e = 7;', 'markdown', CellKind.Markup, [], {}],337['# header 2.1\n', 'markdown', CellKind.Markup, [], {}],338['body 2', 'markdown', CellKind.Markup, [], {}],339['body 3', 'markdown', CellKind.Markup, [], {}],340['## header 2.2', 'markdown', CellKind.Markup, [], {}],341['var e = 7;', 'markdown', CellKind.Markup, [], {}],342],343(editor, viewModel) => {344const foldingModel = new FoldingModel();345foldingModel.attachViewModel(viewModel);346foldingModel.applyMemento([{ start: 2, end: 6 }]);347viewModel.updateFoldingRanges(foldingModel.regions);348349// Note that hidden ranges !== folding ranges350assert.deepStrictEqual(viewModel.getHiddenRanges(), [351{ start: 3, end: 6 }352]);353354assert.strictEqual(viewModel.getNextVisibleCellIndex(1), 2);355assert.strictEqual(viewModel.getNextVisibleCellIndex(2), 7);356assert.strictEqual(viewModel.getNextVisibleCellIndex(3), 7);357assert.strictEqual(viewModel.getNextVisibleCellIndex(4), 7);358assert.strictEqual(viewModel.getNextVisibleCellIndex(5), 7);359assert.strictEqual(viewModel.getNextVisibleCellIndex(6), 7);360assert.strictEqual(viewModel.getNextVisibleCellIndex(7), 8);361}362);363364await withTestNotebook(365[366['# header 1', 'markdown', CellKind.Markup, [], {}],367['body', 'markdown', CellKind.Markup, [], {}],368['# header 2.1\n', 'markdown', CellKind.Markup, [], {}],369['body 2', 'markdown', CellKind.Markup, [], {}],370['body 3', 'markdown', CellKind.Markup, [], {}],371['## header 2.2', 'markdown', CellKind.Markup, [], {}],372['var e = 7;', 'markdown', CellKind.Markup, [], {}],373['# header 2.1\n', 'markdown', CellKind.Markup, [], {}],374['body 2', 'markdown', CellKind.Markup, [], {}],375['body 3', 'markdown', CellKind.Markup, [], {}],376['## header 2.2', 'markdown', CellKind.Markup, [], {}],377['var e = 7;', 'markdown', CellKind.Markup, [], {}],378],379(editor, viewModel) => {380const foldingModel = new FoldingModel();381foldingModel.attachViewModel(viewModel);382foldingModel.applyMemento([383{ start: 5, end: 6 },384{ start: 10, end: 11 },385]);386387viewModel.updateFoldingRanges(foldingModel.regions);388389// Note that hidden ranges !== folding ranges390assert.deepStrictEqual(viewModel.getHiddenRanges(), [391{ start: 6, end: 6 },392{ start: 11, end: 11 }393]);394395// folding ranges396// [5, 6]397// [10, 11]398assert.strictEqual(viewModel.getNextVisibleCellIndex(4), 5);399assert.strictEqual(viewModel.getNextVisibleCellIndex(5), 7);400assert.strictEqual(viewModel.getNextVisibleCellIndex(6), 7);401402assert.strictEqual(viewModel.getNextVisibleCellIndex(9), 10);403assert.strictEqual(viewModel.getNextVisibleCellIndex(10), 12);404assert.strictEqual(viewModel.getNextVisibleCellIndex(11), 12);405}406);407});408});409410411