Path: blob/main/src/vs/workbench/api/test/browser/extHostTextEditor.test.ts
5241 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*--------------------------------------------------------------------------------------------*/4import assert from 'assert';5import { Lazy } from '../../../../base/common/lazy.js';6import { URI } from '../../../../base/common/uri.js';7import { mock } from '../../../../base/test/common/mock.js';8import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';9import { RenderLineNumbersType, TextEditorCursorStyle } from '../../../../editor/common/config/editorOptions.js';10import { NullLogService } from '../../../../platform/log/common/log.js';11import { IResolvedTextEditorConfiguration, ITextEditorConfigurationUpdate, MainThreadTextEditorsShape } from '../../common/extHost.protocol.js';12import { ExtHostDocumentData } from '../../common/extHostDocumentData.js';13import { ExtHostTextEditor, ExtHostTextEditorOptions } from '../../common/extHostTextEditor.js';14import { Range, TextEditorLineNumbersStyle } from '../../common/extHostTypes.js';1516suite('ExtHostTextEditor', () => {1718let editor: ExtHostTextEditor;19const doc = new ExtHostDocumentData(undefined!, URI.file(''), [20'aaaa bbbb+cccc abc'21], '\n', 1, 'text', false, 'utf8');2223setup(() => {24editor = new ExtHostTextEditor('fake', null!, new NullLogService(), new Lazy(() => doc.document), [], { cursorStyle: TextEditorCursorStyle.Line, insertSpaces: true, lineNumbers: 1, tabSize: 4, indentSize: 4, originalIndentSize: 'tabSize' }, [], 1);25});2627test('disposed editor', () => {2829assert.ok(editor.value.document);30editor._acceptViewColumn(3);31assert.strictEqual(3, editor.value.viewColumn);3233editor.dispose();3435assert.throws(() => editor._acceptViewColumn(2));36assert.strictEqual(3, editor.value.viewColumn);3738assert.ok(editor.value.document);39assert.throws(() => editor._acceptOptions(null!));40assert.throws(() => editor._acceptSelections([]));41});4243test('API [bug]: registerTextEditorCommand clears redo stack even if no edits are made #55163', async function () {44let applyCount = 0;45const editor = new ExtHostTextEditor('edt1',46new class extends mock<MainThreadTextEditorsShape>() {47override $tryApplyEdits(): Promise<boolean> {48applyCount += 1;49return Promise.resolve(true);50}51}, new NullLogService(), new Lazy(() => doc.document), [], { cursorStyle: TextEditorCursorStyle.Line, insertSpaces: true, lineNumbers: 1, tabSize: 4, indentSize: 4, originalIndentSize: 'tabSize' }, [], 1);5253await editor.value.edit(edit => { });54assert.strictEqual(applyCount, 0);5556await editor.value.edit(edit => { edit.setEndOfLine(1); });57assert.strictEqual(applyCount, 1);5859await editor.value.edit(edit => { edit.delete(new Range(0, 0, 1, 1)); });60assert.strictEqual(applyCount, 2);61});6263ensureNoDisposablesAreLeakedInTestSuite();64});6566suite('ExtHostTextEditorOptions', () => {6768let opts: ExtHostTextEditorOptions;69let calls: ITextEditorConfigurationUpdate[] = [];7071setup(() => {72calls = [];73const mockProxy: MainThreadTextEditorsShape = {74dispose: undefined!,75$trySetOptions: (id: string, options: ITextEditorConfigurationUpdate) => {76assert.strictEqual(id, '1');77calls.push(options);78return Promise.resolve(undefined);79},80$tryShowTextDocument: undefined!,81$registerTextEditorDecorationType: undefined!,82$removeTextEditorDecorationType: undefined!,83$tryShowEditor: undefined!,84$tryHideEditor: undefined!,85$trySetDecorations: undefined!,86$trySetDecorationsFast: undefined!,87$tryRevealRange: undefined!,88$trySetSelections: undefined!,89$tryApplyEdits: undefined!,90$tryInsertSnippet: undefined!,91$getDiffInformation: undefined!92};93opts = new ExtHostTextEditorOptions(mockProxy, '1', {94tabSize: 4,95indentSize: 4,96originalIndentSize: 'tabSize',97insertSpaces: false,98cursorStyle: TextEditorCursorStyle.Line,99lineNumbers: RenderLineNumbersType.On100}, new NullLogService());101});102103teardown(() => {104opts = null!;105calls = null!;106});107108function assertState(opts: ExtHostTextEditorOptions, expected: Omit<IResolvedTextEditorConfiguration, 'originalIndentSize'>): void {109const actual = {110tabSize: opts.value.tabSize,111indentSize: opts.value.indentSize,112insertSpaces: opts.value.insertSpaces,113cursorStyle: opts.value.cursorStyle,114lineNumbers: opts.value.lineNumbers115};116assert.deepStrictEqual(actual, expected);117}118119test('can set tabSize to the same value', () => {120opts.value.tabSize = 4;121assertState(opts, {122tabSize: 4,123indentSize: 4,124insertSpaces: false,125cursorStyle: TextEditorCursorStyle.Line,126lineNumbers: RenderLineNumbersType.On127});128assert.deepStrictEqual(calls, []);129});130131test('can change tabSize to positive integer', () => {132opts.value.tabSize = 1;133assertState(opts, {134tabSize: 1,135indentSize: 4,136insertSpaces: false,137cursorStyle: TextEditorCursorStyle.Line,138lineNumbers: RenderLineNumbersType.On139});140assert.deepStrictEqual(calls, [{ tabSize: 1 }]);141});142143test('can change tabSize to positive float', () => {144opts.value.tabSize = 2.3;145assertState(opts, {146tabSize: 2,147indentSize: 4,148insertSpaces: false,149cursorStyle: TextEditorCursorStyle.Line,150lineNumbers: RenderLineNumbersType.On151});152assert.deepStrictEqual(calls, [{ tabSize: 2 }]);153});154155test('can change tabSize to a string number', () => {156opts.value.tabSize = '2';157assertState(opts, {158tabSize: 2,159indentSize: 4,160insertSpaces: false,161cursorStyle: TextEditorCursorStyle.Line,162lineNumbers: RenderLineNumbersType.On163});164assert.deepStrictEqual(calls, [{ tabSize: 2 }]);165});166167test('tabSize can request indentation detection', () => {168opts.value.tabSize = 'auto';169assertState(opts, {170tabSize: 4,171indentSize: 4,172insertSpaces: false,173cursorStyle: TextEditorCursorStyle.Line,174lineNumbers: RenderLineNumbersType.On175});176assert.deepStrictEqual(calls, [{ tabSize: 'auto' }]);177});178179test('ignores invalid tabSize 1', () => {180opts.value.tabSize = null!;181assertState(opts, {182tabSize: 4,183indentSize: 4,184insertSpaces: false,185cursorStyle: TextEditorCursorStyle.Line,186lineNumbers: RenderLineNumbersType.On187});188assert.deepStrictEqual(calls, []);189});190191test('ignores invalid tabSize 2', () => {192opts.value.tabSize = -5;193assertState(opts, {194tabSize: 4,195indentSize: 4,196insertSpaces: false,197cursorStyle: TextEditorCursorStyle.Line,198lineNumbers: RenderLineNumbersType.On199});200assert.deepStrictEqual(calls, []);201});202203test('ignores invalid tabSize 3', () => {204opts.value.tabSize = 'hello';205assertState(opts, {206tabSize: 4,207indentSize: 4,208insertSpaces: false,209cursorStyle: TextEditorCursorStyle.Line,210lineNumbers: RenderLineNumbersType.On211});212assert.deepStrictEqual(calls, []);213});214215test('ignores invalid tabSize 4', () => {216opts.value.tabSize = '-17';217assertState(opts, {218tabSize: 4,219indentSize: 4,220insertSpaces: false,221cursorStyle: TextEditorCursorStyle.Line,222lineNumbers: RenderLineNumbersType.On223});224assert.deepStrictEqual(calls, []);225});226227test('can set indentSize to the same value', () => {228opts.value.indentSize = 4;229assertState(opts, {230tabSize: 4,231indentSize: 4,232insertSpaces: false,233cursorStyle: TextEditorCursorStyle.Line,234lineNumbers: RenderLineNumbersType.On235});236assert.deepStrictEqual(calls, [{ indentSize: 4 }]);237});238239test('can change indentSize to positive integer', () => {240opts.value.indentSize = 1;241assertState(opts, {242tabSize: 4,243indentSize: 1,244insertSpaces: false,245cursorStyle: TextEditorCursorStyle.Line,246lineNumbers: RenderLineNumbersType.On247});248assert.deepStrictEqual(calls, [{ indentSize: 1 }]);249});250251test('can change indentSize to positive float', () => {252opts.value.indentSize = 2.3;253assertState(opts, {254tabSize: 4,255indentSize: 2,256insertSpaces: false,257cursorStyle: TextEditorCursorStyle.Line,258lineNumbers: RenderLineNumbersType.On259});260assert.deepStrictEqual(calls, [{ indentSize: 2 }]);261});262263test('can change indentSize to a string number', () => {264// eslint-disable-next-line local/code-no-any-casts265opts.value.indentSize = <any>'2';266assertState(opts, {267tabSize: 4,268indentSize: 2,269insertSpaces: false,270cursorStyle: TextEditorCursorStyle.Line,271lineNumbers: RenderLineNumbersType.On272});273assert.deepStrictEqual(calls, [{ indentSize: 2 }]);274});275276test('indentSize can request to use tabSize', () => {277opts.value.indentSize = 'tabSize';278assertState(opts, {279tabSize: 4,280indentSize: 4,281insertSpaces: false,282cursorStyle: TextEditorCursorStyle.Line,283lineNumbers: RenderLineNumbersType.On284});285assert.deepStrictEqual(calls, [{ indentSize: 'tabSize' }]);286});287288test('indentSize cannot request indentation detection', () => {289// eslint-disable-next-line local/code-no-any-casts290opts.value.indentSize = <any>'auto';291assertState(opts, {292tabSize: 4,293indentSize: 4,294insertSpaces: false,295cursorStyle: TextEditorCursorStyle.Line,296lineNumbers: RenderLineNumbersType.On297});298assert.deepStrictEqual(calls, []);299});300301test('ignores invalid indentSize 1', () => {302opts.value.indentSize = null!;303assertState(opts, {304tabSize: 4,305indentSize: 4,306insertSpaces: false,307cursorStyle: TextEditorCursorStyle.Line,308lineNumbers: RenderLineNumbersType.On309});310assert.deepStrictEqual(calls, []);311});312313test('ignores invalid indentSize 2', () => {314opts.value.indentSize = -5;315assertState(opts, {316tabSize: 4,317indentSize: 4,318insertSpaces: false,319cursorStyle: TextEditorCursorStyle.Line,320lineNumbers: RenderLineNumbersType.On321});322assert.deepStrictEqual(calls, []);323});324325test('ignores invalid indentSize 3', () => {326// eslint-disable-next-line local/code-no-any-casts327opts.value.indentSize = <any>'hello';328assertState(opts, {329tabSize: 4,330indentSize: 4,331insertSpaces: false,332cursorStyle: TextEditorCursorStyle.Line,333lineNumbers: RenderLineNumbersType.On334});335assert.deepStrictEqual(calls, []);336});337338test('ignores invalid indentSize 4', () => {339// eslint-disable-next-line local/code-no-any-casts340opts.value.indentSize = <any>'-17';341assertState(opts, {342tabSize: 4,343indentSize: 4,344insertSpaces: false,345cursorStyle: TextEditorCursorStyle.Line,346lineNumbers: RenderLineNumbersType.On347});348assert.deepStrictEqual(calls, []);349});350351test('can set insertSpaces to the same value', () => {352opts.value.insertSpaces = false;353assertState(opts, {354tabSize: 4,355indentSize: 4,356insertSpaces: false,357cursorStyle: TextEditorCursorStyle.Line,358lineNumbers: RenderLineNumbersType.On359});360assert.deepStrictEqual(calls, []);361});362363test('can set insertSpaces to boolean', () => {364opts.value.insertSpaces = true;365assertState(opts, {366tabSize: 4,367indentSize: 4,368insertSpaces: true,369cursorStyle: TextEditorCursorStyle.Line,370lineNumbers: RenderLineNumbersType.On371});372assert.deepStrictEqual(calls, [{ insertSpaces: true }]);373});374375test('can set insertSpaces to false string', () => {376opts.value.insertSpaces = 'false';377assertState(opts, {378tabSize: 4,379indentSize: 4,380insertSpaces: false,381cursorStyle: TextEditorCursorStyle.Line,382lineNumbers: RenderLineNumbersType.On383});384assert.deepStrictEqual(calls, []);385});386387test('can set insertSpaces to truey', () => {388opts.value.insertSpaces = 'hello';389assertState(opts, {390tabSize: 4,391indentSize: 4,392insertSpaces: true,393cursorStyle: TextEditorCursorStyle.Line,394lineNumbers: RenderLineNumbersType.On395});396assert.deepStrictEqual(calls, [{ insertSpaces: true }]);397});398399test('insertSpaces can request indentation detection', () => {400opts.value.insertSpaces = 'auto';401assertState(opts, {402tabSize: 4,403indentSize: 4,404insertSpaces: false,405cursorStyle: TextEditorCursorStyle.Line,406lineNumbers: RenderLineNumbersType.On407});408assert.deepStrictEqual(calls, [{ insertSpaces: 'auto' }]);409});410411test('can set cursorStyle to same value', () => {412opts.value.cursorStyle = TextEditorCursorStyle.Line;413assertState(opts, {414tabSize: 4,415indentSize: 4,416insertSpaces: false,417cursorStyle: TextEditorCursorStyle.Line,418lineNumbers: RenderLineNumbersType.On419});420assert.deepStrictEqual(calls, []);421});422423test('can change cursorStyle', () => {424opts.value.cursorStyle = TextEditorCursorStyle.Block;425assertState(opts, {426tabSize: 4,427indentSize: 4,428insertSpaces: false,429cursorStyle: TextEditorCursorStyle.Block,430lineNumbers: RenderLineNumbersType.On431});432assert.deepStrictEqual(calls, [{ cursorStyle: TextEditorCursorStyle.Block }]);433});434435test('can set lineNumbers to same value', () => {436opts.value.lineNumbers = TextEditorLineNumbersStyle.On;437assertState(opts, {438tabSize: 4,439indentSize: 4,440insertSpaces: false,441cursorStyle: TextEditorCursorStyle.Line,442lineNumbers: RenderLineNumbersType.On443});444assert.deepStrictEqual(calls, []);445});446447test('can change lineNumbers', () => {448opts.value.lineNumbers = TextEditorLineNumbersStyle.Off;449assertState(opts, {450tabSize: 4,451indentSize: 4,452insertSpaces: false,453cursorStyle: TextEditorCursorStyle.Line,454lineNumbers: RenderLineNumbersType.Off455});456assert.deepStrictEqual(calls, [{ lineNumbers: RenderLineNumbersType.Off }]);457});458459test('can do bulk updates 0', () => {460opts.assign({461tabSize: 4,462indentSize: 4,463insertSpaces: false,464cursorStyle: TextEditorCursorStyle.Line,465lineNumbers: TextEditorLineNumbersStyle.On466});467assertState(opts, {468tabSize: 4,469indentSize: 4,470insertSpaces: false,471cursorStyle: TextEditorCursorStyle.Line,472lineNumbers: RenderLineNumbersType.On473});474assert.deepStrictEqual(calls, [{ indentSize: 4 }]);475});476477test('can do bulk updates 1', () => {478opts.assign({479tabSize: 'auto',480insertSpaces: true481});482assertState(opts, {483tabSize: 4,484indentSize: 4,485insertSpaces: true,486cursorStyle: TextEditorCursorStyle.Line,487lineNumbers: RenderLineNumbersType.On488});489assert.deepStrictEqual(calls, [{ tabSize: 'auto', insertSpaces: true }]);490});491492test('can do bulk updates 2', () => {493opts.assign({494tabSize: 3,495insertSpaces: 'auto'496});497assertState(opts, {498tabSize: 3,499indentSize: 4,500insertSpaces: false,501cursorStyle: TextEditorCursorStyle.Line,502lineNumbers: RenderLineNumbersType.On503});504assert.deepStrictEqual(calls, [{ tabSize: 3, insertSpaces: 'auto' }]);505});506507test('can do bulk updates 3', () => {508opts.assign({509cursorStyle: TextEditorCursorStyle.Block,510lineNumbers: TextEditorLineNumbersStyle.Relative511});512assertState(opts, {513tabSize: 4,514indentSize: 4,515insertSpaces: false,516cursorStyle: TextEditorCursorStyle.Block,517lineNumbers: RenderLineNumbersType.Relative518});519assert.deepStrictEqual(calls, [{ cursorStyle: TextEditorCursorStyle.Block, lineNumbers: RenderLineNumbersType.Relative }]);520});521522ensureNoDisposablesAreLeakedInTestSuite();523});524525526