Path: blob/main/src/vs/workbench/contrib/notebook/test/browser/notebookCommon.test.ts
3296 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 assert from 'assert';6import { DisposableStore } from '../../../../../base/common/lifecycle.js';7import { Mimes } from '../../../../../base/common/mime.js';8import { URI } from '../../../../../base/common/uri.js';9import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';10import { ILanguageService } from '../../../../../editor/common/languages/language.js';11import { TestInstantiationService } from '../../../../../platform/instantiation/test/common/instantiationServiceMock.js';12import { CellKind, CellUri, diff, MimeTypeDisplayOrder, NotebookWorkingCopyTypeIdentifier } from '../../common/notebookCommon.js';13import { cellIndexesToRanges, cellRangesToIndexes, reduceCellRanges } from '../../common/notebookRange.js';14import { setupInstantiationService, TestCell } from './testNotebookEditor.js';1516suite('NotebookCommon', () => {17ensureNoDisposablesAreLeakedInTestSuite();1819let disposables: DisposableStore;20let instantiationService: TestInstantiationService;21let languageService: ILanguageService;2223setup(() => {24disposables = new DisposableStore();25instantiationService = setupInstantiationService(disposables);26languageService = instantiationService.get(ILanguageService);27});2829test('sortMimeTypes default orders', function () {30assert.deepStrictEqual(new MimeTypeDisplayOrder().sort(31[32'application/json',33'application/javascript',34'text/html',35'image/svg+xml',36Mimes.latex,37Mimes.markdown,38'image/png',39'image/jpeg',40Mimes.text41]),42[43'application/json',44'application/javascript',45'text/html',46'image/svg+xml',47Mimes.latex,48Mimes.markdown,49'image/png',50'image/jpeg',51Mimes.text52]53);5455assert.deepStrictEqual(new MimeTypeDisplayOrder().sort(56[57'application/json',58Mimes.latex,59Mimes.markdown,60'application/javascript',61'text/html',62Mimes.text,63'image/png',64'image/jpeg',65'image/svg+xml'66]),67[68'application/json',69'application/javascript',70'text/html',71'image/svg+xml',72Mimes.latex,73Mimes.markdown,74'image/png',75'image/jpeg',76Mimes.text77]78);7980assert.deepStrictEqual(new MimeTypeDisplayOrder().sort(81[82Mimes.markdown,83'application/json',84Mimes.text,85'image/jpeg',86'application/javascript',87'text/html',88'image/png',89'image/svg+xml'90]),91[92'application/json',93'application/javascript',94'text/html',95'image/svg+xml',96Mimes.markdown,97'image/png',98'image/jpeg',99Mimes.text100]101);102103disposables.dispose();104});105106107108test('sortMimeTypes user orders', function () {109assert.deepStrictEqual(110new MimeTypeDisplayOrder([111'image/png',112Mimes.text,113Mimes.markdown,114'text/html',115'application/json'116]).sort(117[118'application/json',119'application/javascript',120'text/html',121'image/svg+xml',122Mimes.markdown,123'image/png',124'image/jpeg',125Mimes.text126]127),128[129'image/png',130Mimes.text,131Mimes.markdown,132'text/html',133'application/json',134'application/javascript',135'image/svg+xml',136'image/jpeg',137]138);139140assert.deepStrictEqual(141new MimeTypeDisplayOrder([142'application/json',143'text/html',144'text/html',145Mimes.markdown,146'application/json'147]).sort([148Mimes.markdown,149'application/json',150Mimes.text,151'application/javascript',152'text/html',153'image/svg+xml',154'image/jpeg',155'image/png'156]),157[158'application/json',159'text/html',160Mimes.markdown,161'application/javascript',162'image/svg+xml',163'image/png',164'image/jpeg',165Mimes.text166]167);168169disposables.dispose();170});171172test('prioritizes mimetypes', () => {173const m = new MimeTypeDisplayOrder([174Mimes.markdown,175'text/html',176'application/json'177]);178assert.deepStrictEqual(m.toArray(), [Mimes.markdown, 'text/html', 'application/json']);179180// no-op if already in the right order181m.prioritize('text/html', ['application/json']);182assert.deepStrictEqual(m.toArray(), [Mimes.markdown, 'text/html', 'application/json']);183184// sorts to highest priority185m.prioritize('text/html', ['application/json', Mimes.markdown]);186assert.deepStrictEqual(m.toArray(), ['text/html', Mimes.markdown, 'application/json']);187188// adds in new type189m.prioritize('text/plain', ['application/json', Mimes.markdown]);190assert.deepStrictEqual(m.toArray(), ['text/plain', 'text/html', Mimes.markdown, 'application/json']);191192// moves multiple, preserves order193m.prioritize(Mimes.markdown, ['text/plain', 'application/json', Mimes.markdown]);194assert.deepStrictEqual(m.toArray(), ['text/html', Mimes.markdown, 'text/plain', 'application/json']);195196// deletes multiple197m.prioritize('text/plain', ['text/plain', 'text/html', Mimes.markdown]);198assert.deepStrictEqual(m.toArray(), ['text/plain', 'text/html', Mimes.markdown, 'application/json']);199200// handles multiple mimetypes, unknown mimetype201const m2 = new MimeTypeDisplayOrder(['a', 'b']);202m2.prioritize('b', ['a', 'b', 'a', 'q']);203assert.deepStrictEqual(m2.toArray(), ['b', 'a']);204205disposables.dispose();206});207208test('sortMimeTypes glob', function () {209assert.deepStrictEqual(210new MimeTypeDisplayOrder([211'application/vnd-vega*',212Mimes.markdown,213'text/html',214'application/json'215]).sort(216[217'application/json',218'application/javascript',219'text/html',220'application/vnd-plot.json',221'application/vnd-vega.json'222]223),224[225'application/vnd-vega.json',226'text/html',227'application/json',228'application/vnd-plot.json',229'application/javascript',230],231'glob *'232);233234disposables.dispose();235});236237test('diff cells', function () {238const cells: TestCell[] = [];239240for (let i = 0; i < 5; i++) {241cells.push(242disposables.add(new TestCell('notebook', i, `var a = ${i};`, 'javascript', CellKind.Code, [], languageService))243);244}245246assert.deepStrictEqual(diff<TestCell>(cells, [], (cell) => {247return cells.indexOf(cell) > -1;248}), [249{250start: 0,251deleteCount: 5,252toInsert: []253}254]255);256257assert.deepStrictEqual(diff<TestCell>([], cells, (cell) => {258return false;259}), [260{261start: 0,262deleteCount: 0,263toInsert: cells264}265]266);267268const cellA = disposables.add(new TestCell('notebook', 6, 'var a = 6;', 'javascript', CellKind.Code, [], languageService));269const cellB = disposables.add(new TestCell('notebook', 7, 'var a = 7;', 'javascript', CellKind.Code, [], languageService));270271const modifiedCells = [272cells[0],273cells[1],274cellA,275cells[3],276cellB,277cells[4]278];279280const splices = diff<TestCell>(cells, modifiedCells, (cell) => {281return cells.indexOf(cell) > -1;282});283284assert.deepStrictEqual(splices,285[286{287start: 2,288deleteCount: 1,289toInsert: [cellA]290},291{292start: 4,293deleteCount: 0,294toInsert: [cellB]295}296]297);298299disposables.dispose();300});301302});303304305suite('CellUri', function () {306307ensureNoDisposablesAreLeakedInTestSuite();308309test('parse, generate (file-scheme)', function () {310311const nb = URI.parse('file:///bar/følder/file.nb');312const id = 17;313314const data = CellUri.generate(nb, id);315const actual = CellUri.parse(data);316assert.ok(Boolean(actual));317assert.strictEqual(actual?.handle, id);318assert.strictEqual(actual?.notebook.toString(), nb.toString());319});320321test('parse, generate (foo-scheme)', function () {322323const nb = URI.parse('foo:///bar/følder/file.nb');324const id = 17;325326const data = CellUri.generate(nb, id);327const actual = CellUri.parse(data);328assert.ok(Boolean(actual));329assert.strictEqual(actual?.handle, id);330assert.strictEqual(actual?.notebook.toString(), nb.toString());331});332333test('stable order', function () {334335const nb = URI.parse('foo:///bar/følder/file.nb');336const handles = [1, 2, 9, 10, 88, 100, 666666, 7777777];337338const uris = handles.map(h => CellUri.generate(nb, h)).sort();339340const strUris = uris.map(String).sort();341const parsedUris = strUris.map(s => URI.parse(s));342343const actual = parsedUris.map(u => CellUri.parse(u)?.handle);344345assert.deepStrictEqual(actual, handles);346});347});348349350suite('CellRange', function () {351352ensureNoDisposablesAreLeakedInTestSuite();353354test('Cell range to index', function () {355assert.deepStrictEqual(cellRangesToIndexes([]), []);356assert.deepStrictEqual(cellRangesToIndexes([{ start: 0, end: 0 }]), []);357assert.deepStrictEqual(cellRangesToIndexes([{ start: 0, end: 1 }]), [0]);358assert.deepStrictEqual(cellRangesToIndexes([{ start: 0, end: 2 }]), [0, 1]);359assert.deepStrictEqual(cellRangesToIndexes([{ start: 0, end: 2 }, { start: 2, end: 3 }]), [0, 1, 2]);360assert.deepStrictEqual(cellRangesToIndexes([{ start: 0, end: 2 }, { start: 3, end: 4 }]), [0, 1, 3]);361});362363test('Cell index to range', function () {364assert.deepStrictEqual(cellIndexesToRanges([]), []);365assert.deepStrictEqual(cellIndexesToRanges([0]), [{ start: 0, end: 1 }]);366assert.deepStrictEqual(cellIndexesToRanges([0, 1]), [{ start: 0, end: 2 }]);367assert.deepStrictEqual(cellIndexesToRanges([0, 1, 2]), [{ start: 0, end: 3 }]);368assert.deepStrictEqual(cellIndexesToRanges([0, 1, 3]), [{ start: 0, end: 2 }, { start: 3, end: 4 }]);369370assert.deepStrictEqual(cellIndexesToRanges([1, 0]), [{ start: 0, end: 2 }]);371assert.deepStrictEqual(cellIndexesToRanges([1, 2, 0]), [{ start: 0, end: 3 }]);372assert.deepStrictEqual(cellIndexesToRanges([3, 1, 0]), [{ start: 0, end: 2 }, { start: 3, end: 4 }]);373374assert.deepStrictEqual(cellIndexesToRanges([9, 10]), [{ start: 9, end: 11 }]);375assert.deepStrictEqual(cellIndexesToRanges([10, 9]), [{ start: 9, end: 11 }]);376});377378test('Reduce ranges', function () {379assert.deepStrictEqual(reduceCellRanges([{ start: 0, end: 1 }, { start: 1, end: 2 }]), [{ start: 0, end: 2 }]);380assert.deepStrictEqual(reduceCellRanges([{ start: 0, end: 2 }, { start: 1, end: 3 }]), [{ start: 0, end: 3 }]);381assert.deepStrictEqual(reduceCellRanges([{ start: 1, end: 3 }, { start: 0, end: 2 }]), [{ start: 0, end: 3 }]);382assert.deepStrictEqual(reduceCellRanges([{ start: 0, end: 2 }, { start: 4, end: 5 }]), [{ start: 0, end: 2 }, { start: 4, end: 5 }]);383384assert.deepStrictEqual(reduceCellRanges([385{ start: 0, end: 1 },386{ start: 1, end: 2 },387{ start: 4, end: 6 }388]), [389{ start: 0, end: 2 },390{ start: 4, end: 6 }391]);392393assert.deepStrictEqual(reduceCellRanges([394{ start: 0, end: 1 },395{ start: 1, end: 3 },396{ start: 3, end: 4 }397]), [398{ start: 0, end: 4 }399]);400});401402test('Reduce ranges 2, empty ranges', function () {403assert.deepStrictEqual(reduceCellRanges([{ start: 0, end: 0 }, { start: 0, end: 0 }]), [{ start: 0, end: 0 }]);404assert.deepStrictEqual(reduceCellRanges([{ start: 0, end: 0 }, { start: 1, end: 2 }]), [{ start: 1, end: 2 }]);405assert.deepStrictEqual(reduceCellRanges([{ start: 2, end: 2 }]), [{ start: 2, end: 2 }]);406});407});408409suite('NotebookWorkingCopyTypeIdentifier', function () {410ensureNoDisposablesAreLeakedInTestSuite();411412test('supports notebook type only', function () {413const viewType = 'testViewType';414const type = NotebookWorkingCopyTypeIdentifier.create(viewType);415assert.deepEqual(NotebookWorkingCopyTypeIdentifier.parse(type), { notebookType: viewType, viewType });416assert.strictEqual(NotebookWorkingCopyTypeIdentifier.parse('something'), undefined);417});418419test('supports different viewtype', function () {420const notebookType = { notebookType: 'testNotebookType', viewType: 'testViewType' };421const type = NotebookWorkingCopyTypeIdentifier.create(notebookType.notebookType, notebookType.viewType);422assert.deepEqual(NotebookWorkingCopyTypeIdentifier.parse(type), notebookType);423assert.strictEqual(NotebookWorkingCopyTypeIdentifier.parse('something'), undefined);424});425});426427428