Path: blob/main/src/vs/editor/contrib/snippet/test/browser/snippetController2.old.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*--------------------------------------------------------------------------------------------*/4import assert from 'assert';5import { mock } from '../../../../../base/test/common/mock.js';6import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';7import { ICodeEditor } from '../../../../browser/editorBrowser.js';8import { Position } from '../../../../common/core/position.js';9import { Selection } from '../../../../common/core/selection.js';10import { LanguageFeaturesService } from '../../../../common/services/languageFeaturesService.js';11import { SnippetController2 } from '../../browser/snippetController2.js';12import { ITestCodeEditor, withTestCodeEditor } from '../../../../test/browser/testCodeEditor.js';13import { TestLanguageConfigurationService } from '../../../../test/common/modes/testLanguageConfigurationService.js';14import { IContextKeyService } from '../../../../../platform/contextkey/common/contextkey.js';15import { ServiceCollection } from '../../../../../platform/instantiation/common/serviceCollection.js';16import { ILabelService } from '../../../../../platform/label/common/label.js';17import { NullLogService } from '../../../../../platform/log/common/log.js';18import { IWorkspaceContextService } from '../../../../../platform/workspace/common/workspace.js';1920class TestSnippetController extends SnippetController2 {2122private _testLanguageConfigurationService: TestLanguageConfigurationService;2324constructor(25editor: ICodeEditor,26@IContextKeyService private readonly _contextKeyService: IContextKeyService27) {28const testLanguageConfigurationService = new TestLanguageConfigurationService();29super(editor, new NullLogService(), new LanguageFeaturesService(), _contextKeyService, testLanguageConfigurationService);30this._testLanguageConfigurationService = testLanguageConfigurationService;31}3233override dispose(): void {34super.dispose();35this._testLanguageConfigurationService.dispose();36}3738isInSnippetMode(): boolean {39return SnippetController2.InSnippetMode.getValue(this._contextKeyService)!;40}41}4243suite('SnippetController', () => {4445ensureNoDisposablesAreLeakedInTestSuite();4647function snippetTest(cb: (editor: ITestCodeEditor, template: string, snippetController: TestSnippetController) => void, lines?: string[]): void {4849if (!lines) {50lines = [51'function test() {',52'\tvar x = 3;',53'\tvar arr = [];',54'\t',55'}'56];57}5859const serviceCollection = new ServiceCollection(60[ILabelService, new class extends mock<ILabelService>() { }],61[IWorkspaceContextService, new class extends mock<IWorkspaceContextService>() { }],62);6364withTestCodeEditor(lines, { serviceCollection }, (editor) => {65editor.getModel()!.updateOptions({66insertSpaces: false67});68const snippetController = editor.registerAndInstantiateContribution(TestSnippetController.ID, TestSnippetController);69const template = [70'for (var ${1:index}; $1 < ${2:array}.length; $1++) {',71'\tvar element = $2[$1];',72'\t$0',73'}'74].join('\n');7576cb(editor, template, snippetController);77snippetController.dispose();78});79}8081test('Simple accepted', () => {82snippetTest((editor, template, snippetController) => {83editor.setPosition({ lineNumber: 4, column: 2 });8485snippetController.insert(template);86assert.strictEqual(editor.getModel()!.getLineContent(4), '\tfor (var index; index < array.length; index++) {');87assert.strictEqual(editor.getModel()!.getLineContent(5), '\t\tvar element = array[index];');88assert.strictEqual(editor.getModel()!.getLineContent(6), '\t\t');89assert.strictEqual(editor.getModel()!.getLineContent(7), '\t}');9091editor.trigger('test', 'type', { text: 'i' });92assert.strictEqual(editor.getModel()!.getLineContent(4), '\tfor (var i; i < array.length; i++) {');93assert.strictEqual(editor.getModel()!.getLineContent(5), '\t\tvar element = array[i];');94assert.strictEqual(editor.getModel()!.getLineContent(6), '\t\t');95assert.strictEqual(editor.getModel()!.getLineContent(7), '\t}');9697snippetController.next();98editor.trigger('test', 'type', { text: 'arr' });99assert.strictEqual(editor.getModel()!.getLineContent(4), '\tfor (var i; i < arr.length; i++) {');100assert.strictEqual(editor.getModel()!.getLineContent(5), '\t\tvar element = arr[i];');101assert.strictEqual(editor.getModel()!.getLineContent(6), '\t\t');102assert.strictEqual(editor.getModel()!.getLineContent(7), '\t}');103104snippetController.prev();105editor.trigger('test', 'type', { text: 'j' });106assert.strictEqual(editor.getModel()!.getLineContent(4), '\tfor (var j; j < arr.length; j++) {');107assert.strictEqual(editor.getModel()!.getLineContent(5), '\t\tvar element = arr[j];');108assert.strictEqual(editor.getModel()!.getLineContent(6), '\t\t');109assert.strictEqual(editor.getModel()!.getLineContent(7), '\t}');110111snippetController.next();112snippetController.next();113assert.deepStrictEqual(editor.getPosition(), new Position(6, 3));114});115});116117test('Simple canceled', () => {118snippetTest((editor, template, snippetController) => {119editor.setPosition({ lineNumber: 4, column: 2 });120121snippetController.insert(template);122assert.strictEqual(editor.getModel()!.getLineContent(4), '\tfor (var index; index < array.length; index++) {');123assert.strictEqual(editor.getModel()!.getLineContent(5), '\t\tvar element = array[index];');124assert.strictEqual(editor.getModel()!.getLineContent(6), '\t\t');125assert.strictEqual(editor.getModel()!.getLineContent(7), '\t}');126127snippetController.cancel();128assert.deepStrictEqual(editor.getPosition(), new Position(4, 16));129});130});131132// test('Stops when deleting lines above', () => {133// snippetTest((editor, codeSnippet, snippetController) => {134// editor.setPosition({ lineNumber: 4, column: 2 });135// snippetController.insert(codeSnippet, 0, 0);136137// editor.getModel()!.applyEdits([{138// forceMoveMarkers: false,139// identifier: null,140// isAutoWhitespaceEdit: false,141// range: new Range(1, 1, 3, 1),142// text: null143// }]);144145// assert.strictEqual(snippetController.isInSnippetMode(), false);146// });147// });148149// test('Stops when deleting lines below', () => {150// snippetTest((editor, codeSnippet, snippetController) => {151// editor.setPosition({ lineNumber: 4, column: 2 });152// snippetController.run(codeSnippet, 0, 0);153154// editor.getModel()!.applyEdits([{155// forceMoveMarkers: false,156// identifier: null,157// isAutoWhitespaceEdit: false,158// range: new Range(8, 1, 8, 100),159// text: null160// }]);161162// assert.strictEqual(snippetController.isInSnippetMode(), false);163// });164// });165166// test('Stops when inserting lines above', () => {167// snippetTest((editor, codeSnippet, snippetController) => {168// editor.setPosition({ lineNumber: 4, column: 2 });169// snippetController.run(codeSnippet, 0, 0);170171// editor.getModel()!.applyEdits([{172// forceMoveMarkers: false,173// identifier: null,174// isAutoWhitespaceEdit: false,175// range: new Range(1, 100, 1, 100),176// text: '\nHello'177// }]);178179// assert.strictEqual(snippetController.isInSnippetMode(), false);180// });181// });182183// test('Stops when inserting lines below', () => {184// snippetTest((editor, codeSnippet, snippetController) => {185// editor.setPosition({ lineNumber: 4, column: 2 });186// snippetController.run(codeSnippet, 0, 0);187188// editor.getModel()!.applyEdits([{189// forceMoveMarkers: false,190// identifier: null,191// isAutoWhitespaceEdit: false,192// range: new Range(8, 100, 8, 100),193// text: '\nHello'194// }]);195196// assert.strictEqual(snippetController.isInSnippetMode(), false);197// });198// });199200test('Stops when calling model.setValue()', () => {201snippetTest((editor, codeSnippet, snippetController) => {202editor.setPosition({ lineNumber: 4, column: 2 });203snippetController.insert(codeSnippet);204205editor.getModel()!.setValue('goodbye');206207assert.strictEqual(snippetController.isInSnippetMode(), false);208});209});210211test('Stops when undoing', () => {212snippetTest((editor, codeSnippet, snippetController) => {213editor.setPosition({ lineNumber: 4, column: 2 });214snippetController.insert(codeSnippet);215216editor.getModel()!.undo();217218assert.strictEqual(snippetController.isInSnippetMode(), false);219});220});221222test('Stops when moving cursor outside', () => {223snippetTest((editor, codeSnippet, snippetController) => {224editor.setPosition({ lineNumber: 4, column: 2 });225snippetController.insert(codeSnippet);226227editor.setPosition({ lineNumber: 1, column: 1 });228229assert.strictEqual(snippetController.isInSnippetMode(), false);230});231});232233test('Stops when disconnecting editor model', () => {234snippetTest((editor, codeSnippet, snippetController) => {235editor.setPosition({ lineNumber: 4, column: 2 });236snippetController.insert(codeSnippet);237238editor.setModel(null);239240assert.strictEqual(snippetController.isInSnippetMode(), false);241});242});243244test('Stops when disposing editor', () => {245snippetTest((editor, codeSnippet, snippetController) => {246editor.setPosition({ lineNumber: 4, column: 2 });247snippetController.insert(codeSnippet);248249snippetController.dispose();250251assert.strictEqual(snippetController.isInSnippetMode(), false);252});253});254255test('Final tabstop with multiple selections', () => {256snippetTest((editor, codeSnippet, snippetController) => {257editor.setSelections([258new Selection(1, 1, 1, 1),259new Selection(2, 1, 2, 1),260]);261262codeSnippet = 'foo$0';263snippetController.insert(codeSnippet);264265assert.strictEqual(editor.getSelections()!.length, 2);266const [first, second] = editor.getSelections()!;267assert.ok(first.equalsRange({ startLineNumber: 1, startColumn: 4, endLineNumber: 1, endColumn: 4 }), first.toString());268assert.ok(second.equalsRange({ startLineNumber: 2, startColumn: 4, endLineNumber: 2, endColumn: 4 }), second.toString());269});270271snippetTest((editor, codeSnippet, snippetController) => {272editor.setSelections([273new Selection(1, 1, 1, 1),274new Selection(2, 1, 2, 1),275]);276277codeSnippet = 'foo$0bar';278snippetController.insert(codeSnippet);279280assert.strictEqual(editor.getSelections()!.length, 2);281const [first, second] = editor.getSelections()!;282assert.ok(first.equalsRange({ startLineNumber: 1, startColumn: 4, endLineNumber: 1, endColumn: 4 }), first.toString());283assert.ok(second.equalsRange({ startLineNumber: 2, startColumn: 4, endLineNumber: 2, endColumn: 4 }), second.toString());284});285286snippetTest((editor, codeSnippet, snippetController) => {287editor.setSelections([288new Selection(1, 1, 1, 1),289new Selection(1, 5, 1, 5),290]);291292codeSnippet = 'foo$0bar';293snippetController.insert(codeSnippet);294295assert.strictEqual(editor.getSelections()!.length, 2);296const [first, second] = editor.getSelections()!;297assert.ok(first.equalsRange({ startLineNumber: 1, startColumn: 4, endLineNumber: 1, endColumn: 4 }), first.toString());298assert.ok(second.equalsRange({ startLineNumber: 1, startColumn: 14, endLineNumber: 1, endColumn: 14 }), second.toString());299});300301snippetTest((editor, codeSnippet, snippetController) => {302editor.setSelections([303new Selection(1, 1, 1, 1),304new Selection(1, 5, 1, 5),305]);306307codeSnippet = 'foo\n$0\nbar';308snippetController.insert(codeSnippet);309310assert.strictEqual(editor.getSelections()!.length, 2);311const [first, second] = editor.getSelections()!;312assert.ok(first.equalsRange({ startLineNumber: 2, startColumn: 1, endLineNumber: 2, endColumn: 1 }), first.toString());313assert.ok(second.equalsRange({ startLineNumber: 4, startColumn: 1, endLineNumber: 4, endColumn: 1 }), second.toString());314});315316snippetTest((editor, codeSnippet, snippetController) => {317editor.setSelections([318new Selection(1, 1, 1, 1),319new Selection(1, 5, 1, 5),320]);321322codeSnippet = 'foo\n$0\nbar';323snippetController.insert(codeSnippet);324325assert.strictEqual(editor.getSelections()!.length, 2);326const [first, second] = editor.getSelections()!;327assert.ok(first.equalsRange({ startLineNumber: 2, startColumn: 1, endLineNumber: 2, endColumn: 1 }), first.toString());328assert.ok(second.equalsRange({ startLineNumber: 4, startColumn: 1, endLineNumber: 4, endColumn: 1 }), second.toString());329});330331snippetTest((editor, codeSnippet, snippetController) => {332editor.setSelections([333new Selection(2, 7, 2, 7),334]);335336codeSnippet = 'xo$0r';337snippetController.insert(codeSnippet, { overwriteBefore: 1 });338339assert.strictEqual(editor.getSelections()!.length, 1);340assert.ok(editor.getSelection()!.equalsRange({ startLineNumber: 2, startColumn: 8, endColumn: 8, endLineNumber: 2 }));341});342});343344test('Final tabstop, #11742 simple', () => {345snippetTest((editor, codeSnippet, controller) => {346347editor.setSelection(new Selection(1, 19, 1, 19));348349codeSnippet = '{{% url_**$1** %}}';350controller.insert(codeSnippet, { overwriteBefore: 2 });351352assert.strictEqual(editor.getSelections()!.length, 1);353assert.ok(editor.getSelection()!.equalsRange({ startLineNumber: 1, startColumn: 27, endLineNumber: 1, endColumn: 27 }));354assert.strictEqual(editor.getModel()!.getValue(), 'example example {{% url_**** %}}');355356}, ['example example sc']);357358snippetTest((editor, codeSnippet, controller) => {359360editor.setSelection(new Selection(1, 3, 1, 3));361362codeSnippet = [363'afterEach((done) => {',364'\t${1}test',365'});'366].join('\n');367368controller.insert(codeSnippet, { overwriteBefore: 2 });369370assert.strictEqual(editor.getSelections()!.length, 1);371assert.ok(editor.getSelection()!.equalsRange({ startLineNumber: 2, startColumn: 2, endLineNumber: 2, endColumn: 2 }), editor.getSelection()!.toString());372assert.strictEqual(editor.getModel()!.getValue(), 'afterEach((done) => {\n\ttest\n});');373374}, ['af']);375376snippetTest((editor, codeSnippet, controller) => {377378editor.setSelection(new Selection(1, 3, 1, 3));379380codeSnippet = [381'afterEach((done) => {',382'${1}\ttest',383'});'384].join('\n');385386controller.insert(codeSnippet, { overwriteBefore: 2 });387388assert.strictEqual(editor.getSelections()!.length, 1);389assert.ok(editor.getSelection()!.equalsRange({ startLineNumber: 2, startColumn: 1, endLineNumber: 2, endColumn: 1 }), editor.getSelection()!.toString());390assert.strictEqual(editor.getModel()!.getValue(), 'afterEach((done) => {\n\ttest\n});');391392}, ['af']);393394snippetTest((editor, codeSnippet, controller) => {395396editor.setSelection(new Selection(1, 9, 1, 9));397398codeSnippet = [399'aft${1}er'400].join('\n');401402controller.insert(codeSnippet, { overwriteBefore: 8 });403404assert.strictEqual(editor.getModel()!.getValue(), 'after');405assert.strictEqual(editor.getSelections()!.length, 1);406assert.ok(editor.getSelection()!.equalsRange({ startLineNumber: 1, startColumn: 4, endLineNumber: 1, endColumn: 4 }), editor.getSelection()!.toString());407408}, ['afterone']);409});410411test('Final tabstop, #11742 different indents', () => {412413snippetTest((editor, codeSnippet, controller) => {414415editor.setSelections([416new Selection(2, 4, 2, 4),417new Selection(1, 3, 1, 3)418]);419420codeSnippet = [421'afterEach((done) => {',422'\t${0}test',423'});'424].join('\n');425426controller.insert(codeSnippet, { overwriteBefore: 2 });427428assert.strictEqual(editor.getSelections()!.length, 2);429const [first, second] = editor.getSelections()!;430431assert.ok(first.equalsRange({ startLineNumber: 5, startColumn: 3, endLineNumber: 5, endColumn: 3 }), first.toString());432assert.ok(second.equalsRange({ startLineNumber: 2, startColumn: 2, endLineNumber: 2, endColumn: 2 }), second.toString());433434}, ['af', '\taf']);435});436437test('Final tabstop, #11890 stay at the beginning', () => {438439snippetTest((editor, codeSnippet, controller) => {440441editor.setSelections([442new Selection(1, 5, 1, 5)443]);444445codeSnippet = [446'afterEach((done) => {',447'${1}\ttest',448'});'449].join('\n');450451controller.insert(codeSnippet, { overwriteBefore: 2 });452453assert.strictEqual(editor.getSelections()!.length, 1);454const [first] = editor.getSelections()!;455456assert.ok(first.equalsRange({ startLineNumber: 2, startColumn: 3, endLineNumber: 2, endColumn: 3 }), first.toString());457458}, [' af']);459});460461test('Final tabstop, no tabstop', () => {462463snippetTest((editor, codeSnippet, controller) => {464465editor.setSelections([466new Selection(1, 3, 1, 3)467]);468469codeSnippet = 'afterEach';470471controller.insert(codeSnippet, { overwriteBefore: 2 });472473assert.ok(editor.getSelection()!.equalsRange({ startLineNumber: 1, startColumn: 10, endLineNumber: 1, endColumn: 10 }));474475}, ['af', '\taf']);476});477478test('Multiple cursor and overwriteBefore/After, issue #11060', () => {479480snippetTest((editor, codeSnippet, controller) => {481482editor.setSelections([483new Selection(1, 7, 1, 7),484new Selection(2, 4, 2, 4)485]);486487codeSnippet = '_foo';488controller.insert(codeSnippet, { overwriteBefore: 1 });489assert.strictEqual(editor.getModel()!.getValue(), 'this._foo\nabc_foo');490491}, ['this._', 'abc']);492493snippetTest((editor, codeSnippet, controller) => {494495editor.setSelections([496new Selection(1, 7, 1, 7),497new Selection(2, 4, 2, 4)498]);499500codeSnippet = 'XX';501controller.insert(codeSnippet, { overwriteBefore: 1 });502assert.strictEqual(editor.getModel()!.getValue(), 'this.XX\nabcXX');503504}, ['this._', 'abc']);505506snippetTest((editor, codeSnippet, controller) => {507508editor.setSelections([509new Selection(1, 7, 1, 7),510new Selection(2, 4, 2, 4),511new Selection(3, 5, 3, 5)512]);513514codeSnippet = '_foo';515controller.insert(codeSnippet, { overwriteBefore: 1 });516assert.strictEqual(editor.getModel()!.getValue(), 'this._foo\nabc_foo\ndef_foo');517518}, ['this._', 'abc', 'def_']);519520snippetTest((editor, codeSnippet, controller) => {521522editor.setSelections([523new Selection(1, 7, 1, 7), // primary at `this._`524new Selection(2, 4, 2, 4),525new Selection(3, 6, 3, 6)526]);527528codeSnippet = '._foo';529controller.insert(codeSnippet, { overwriteBefore: 2 });530assert.strictEqual(editor.getModel()!.getValue(), 'this._foo\nabc._foo\ndef._foo');531532}, ['this._', 'abc', 'def._']);533534snippetTest((editor, codeSnippet, controller) => {535536editor.setSelections([537new Selection(3, 6, 3, 6), // primary at `def._`538new Selection(1, 7, 1, 7),539new Selection(2, 4, 2, 4),540]);541542codeSnippet = '._foo';543controller.insert(codeSnippet, { overwriteBefore: 2 });544assert.strictEqual(editor.getModel()!.getValue(), 'this._foo\nabc._foo\ndef._foo');545546}, ['this._', 'abc', 'def._']);547548snippetTest((editor, codeSnippet, controller) => {549550editor.setSelections([551new Selection(2, 4, 2, 4), // primary at `abc`552new Selection(3, 6, 3, 6),553new Selection(1, 7, 1, 7),554]);555556codeSnippet = '._foo';557controller.insert(codeSnippet, { overwriteBefore: 2 });558assert.strictEqual(editor.getModel()!.getValue(), 'this._._foo\na._foo\ndef._._foo');559560}, ['this._', 'abc', 'def._']);561562});563564test('Multiple cursor and overwriteBefore/After, #16277', () => {565snippetTest((editor, codeSnippet, controller) => {566567editor.setSelections([568new Selection(1, 5, 1, 5),569new Selection(2, 5, 2, 5),570]);571572codeSnippet = 'document';573controller.insert(codeSnippet, { overwriteBefore: 3 });574assert.strictEqual(editor.getModel()!.getValue(), '{document}\n{document && true}');575576}, ['{foo}', '{foo && true}']);577});578579test('Insert snippet twice, #19449', () => {580581snippetTest((editor, codeSnippet, controller) => {582583editor.setSelections([584new Selection(1, 1, 1, 1)585]);586587codeSnippet = 'for (var ${1:i}=0; ${1:i}<len; ${1:i}++) { $0 }';588controller.insert(codeSnippet);589assert.strictEqual(editor.getModel()!.getValue(), 'for (var i=0; i<len; i++) { }for (var i=0; i<len; i++) { }');590591}, ['for (var i=0; i<len; i++) { }']);592593594snippetTest((editor, codeSnippet, controller) => {595596editor.setSelections([597new Selection(1, 1, 1, 1)598]);599600codeSnippet = 'for (let ${1:i}=0; ${1:i}<len; ${1:i}++) { $0 }';601controller.insert(codeSnippet);602assert.strictEqual(editor.getModel()!.getValue(), 'for (let i=0; i<len; i++) { }for (var i=0; i<len; i++) { }');603604}, ['for (var i=0; i<len; i++) { }']);605606});607});608609610