提交 d46681e2 编写于 作者: A Alex Dima

Tests

上级 e055454a
......@@ -19,7 +19,7 @@ import {ICodeSnippet, CodeSnippet} from './snippet';
import EditorContextKeys = editorCommon.EditorContextKeys;
class InsertSnippetController {
export class InsertSnippetController {
private editor: editorCommon.ICommonCodeEditor;
private model: editorCommon.IModel;
......@@ -313,10 +313,10 @@ class InsertSnippetController {
if (this.isFinished) {
return;
}
this._onStop();
this.isFinished = true;
this._onStop();
this.listenersToRemove = dispose(this.listenersToRemove);
for (var i = 0; i < this.trackedPlaceHolders.length; i++) {
......@@ -358,7 +358,7 @@ export class SnippetController {
}
private _editor: editorCommon.ICommonCodeEditor;
private _currentController: InsertSnippetController;
protected _currentController: InsertSnippetController;
private _inSnippetMode: IContextKey<boolean>;
constructor(editor: editorCommon.ICommonCodeEditor, @IContextKeyService contextKeyService: IContextKeyService) {
......@@ -393,12 +393,12 @@ export class SnippetController {
/**
* Inserts once `snippet` at the start of `replaceRange`, after deleting `replaceRange`.
*/
public runWithReplaceRange(snippet: CodeSnippet, replaceRange:Range, undoStops:boolean): void {
public runWithReplaceRange(snippet: CodeSnippet, replaceRange:Range): void {
this._runAndRestoreController(() => {
this._runPreparedSnippetForPrimarySelection({
typeRange: replaceRange,
adaptedSnippet: SnippetController._getAdaptedSnippet(this._editor.getModel(), snippet, replaceRange)
}, undoStops);
}, false);
});
}
......@@ -470,6 +470,8 @@ export class SnippetController {
this._inSnippetMode.set(true);
this._currentController = new InsertSnippetController(this._editor, prepared.adaptedSnippet, prepared.typeRange.startLineNumber, initialAlternativeVersionId, () => {
this._inSnippetMode.reset();
this._currentController.dispose();
this._currentController = null;
});
}
}
......
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import * as assert from 'assert';
import {Range} from 'vs/editor/common/core/range';
import {Position} from 'vs/editor/common/core/position';
import {CodeSnippet} from 'vs/editor/contrib/snippet/common/snippet';
import {SnippetController} from 'vs/editor/contrib/snippet/common/snippetController';
import {MockCodeEditor, withMockCodeEditor} from 'vs/editor/test/common/mocks/mockCodeEditor';
import {Cursor} from 'vs/editor/common/controller/cursor';
class TestSnippetController extends SnippetController {
isInSnippetMode(): boolean {
return !!this._currentController;
}
}
suite('SnippetController', () => {
function snippetTest(cb:(editor:MockCodeEditor, cursor:Cursor, codeSnippet: CodeSnippet, snippetController:TestSnippetController)=>void): void {
withMockCodeEditor([
'function test() {',
'\tvar x = 3;',
'\tvar arr = [];',
'\t',
'}'
], {}, (editor, cursor) => {
editor.getModel().updateOptions({
insertSpaces: false
});
let snippetController = editor.registerAndInstantiateContribution<TestSnippetController>(TestSnippetController);
let codeSnippet = new CodeSnippet([
'for (var {{index}}; {{index}} < {{array}}.length; {{index}}++) {',
'\tvar element = {{array}}[{{index}}];',
'\t{{}}',
'}'
].join('\n'));
cb(editor, cursor, codeSnippet, snippetController);
snippetController.dispose();
});
}
test('Simple accepted', () => {
snippetTest((editor, cursor, codeSnippet, snippetController) => {
editor.setPosition({ lineNumber: 4, column: 2 });
snippetController.run(codeSnippet, 0, 0, false);
assert.equal(editor.getModel().getLineContent(4), '\tfor (var index; index < array.length; index++) {');
assert.equal(editor.getModel().getLineContent(5), '\t\tvar element = array[index];');
assert.equal(editor.getModel().getLineContent(6), '\t\t');
assert.equal(editor.getModel().getLineContent(7), '\t}');
editor.trigger('test', 'type', { text: 'i' });
assert.equal(editor.getModel().getLineContent(4), '\tfor (var i; i < array.length; i++) {');
assert.equal(editor.getModel().getLineContent(5), '\t\tvar element = array[i];');
assert.equal(editor.getModel().getLineContent(6), '\t\t');
assert.equal(editor.getModel().getLineContent(7), '\t}');
snippetController.jumpToNextPlaceholder();
editor.trigger('test', 'type', { text: 'arr' });
assert.equal(editor.getModel().getLineContent(4), '\tfor (var i; i < arr.length; i++) {');
assert.equal(editor.getModel().getLineContent(5), '\t\tvar element = arr[i];');
assert.equal(editor.getModel().getLineContent(6), '\t\t');
assert.equal(editor.getModel().getLineContent(7), '\t}');
snippetController.jumpToPrevPlaceholder();
editor.trigger('test', 'type', { text: 'j' });
assert.equal(editor.getModel().getLineContent(4), '\tfor (var j; j < arr.length; j++) {');
assert.equal(editor.getModel().getLineContent(5), '\t\tvar element = arr[j];');
assert.equal(editor.getModel().getLineContent(6), '\t\t');
assert.equal(editor.getModel().getLineContent(7), '\t}');
snippetController.acceptSnippet();
assert.deepEqual(editor.getPosition(), new Position(6, 3));
});
});
test('Simple canceled', () => {
snippetTest((editor, cursor, codeSnippet, snippetController) => {
editor.setPosition({ lineNumber: 4, column: 2 });
snippetController.run(codeSnippet, 0, 0, false);
assert.equal(editor.getModel().getLineContent(4), '\tfor (var index; index < array.length; index++) {');
assert.equal(editor.getModel().getLineContent(5), '\t\tvar element = array[index];');
assert.equal(editor.getModel().getLineContent(6), '\t\t');
assert.equal(editor.getModel().getLineContent(7), '\t}');
snippetController.leaveSnippet();
assert.deepEqual(editor.getPosition(), new Position(4, 16));
});
});
test('Stops when deleting lines above', () => {
snippetTest((editor, cursor, codeSnippet, snippetController) => {
editor.setPosition({ lineNumber: 4, column: 2 });
snippetController.run(codeSnippet, 0, 0, false);
editor.getModel().applyEdits([{
forceMoveMarkers: false,
identifier: null,
isAutoWhitespaceEdit: false,
range: new Range(1, 1, 3, 1),
text: null
}]);
assert.equal(snippetController.isInSnippetMode(), false);
});
});
test('Stops when deleting lines below', () => {
snippetTest((editor, cursor, codeSnippet, snippetController) => {
editor.setPosition({ lineNumber: 4, column: 2 });
snippetController.run(codeSnippet, 0, 0, false);
editor.getModel().applyEdits([{
forceMoveMarkers: false,
identifier: null,
isAutoWhitespaceEdit: false,
range: new Range(7, 100, 8, 100),
text: null
}]);
assert.equal(snippetController.isInSnippetMode(), false);
});
});
test('Stops when inserting lines above', () => {
snippetTest((editor, cursor, codeSnippet, snippetController) => {
editor.setPosition({ lineNumber: 4, column: 2 });
snippetController.run(codeSnippet, 0, 0, false);
editor.getModel().applyEdits([{
forceMoveMarkers: false,
identifier: null,
isAutoWhitespaceEdit: false,
range: new Range(1, 100, 1, 100),
text: '\nHello'
}]);
assert.equal(snippetController.isInSnippetMode(), false);
});
});
test('Stops when inserting lines below', () => {
snippetTest((editor, cursor, codeSnippet, snippetController) => {
editor.setPosition({ lineNumber: 4, column: 2 });
snippetController.run(codeSnippet, 0, 0, false);
editor.getModel().applyEdits([{
forceMoveMarkers: false,
identifier: null,
isAutoWhitespaceEdit: false,
range: new Range(8, 100, 8, 100),
text: '\nHello'
}]);
assert.equal(snippetController.isInSnippetMode(), false);
});
});
test('Stops when calling model.setValue()', () => {
snippetTest((editor, cursor, codeSnippet, snippetController) => {
editor.setPosition({ lineNumber: 4, column: 2 });
snippetController.run(codeSnippet, 0, 0, false);
editor.getModel().setValue('goodbye');
assert.equal(snippetController.isInSnippetMode(), false);
});
});
test('Stops when undoing', () => {
snippetTest((editor, cursor, codeSnippet, snippetController) => {
editor.setPosition({ lineNumber: 4, column: 2 });
snippetController.run(codeSnippet, 0, 0, false);
editor.getModel().undo();
assert.equal(snippetController.isInSnippetMode(), false);
});
});
test('Stops when moving cursor outside', () => {
snippetTest((editor, cursor, codeSnippet, snippetController) => {
editor.setPosition({ lineNumber: 4, column: 2 });
snippetController.run(codeSnippet, 0, 0, false);
editor.setPosition({lineNumber:1, column: 1});
assert.equal(snippetController.isInSnippetMode(), false);
});
});
test('Stops when disconnecting editor model', () => {
snippetTest((editor, cursor, codeSnippet, snippetController) => {
editor.setPosition({ lineNumber: 4, column: 2 });
snippetController.run(codeSnippet, 0, 0, false);
editor.setModel(null);
assert.equal(snippetController.isInSnippetMode(), false);
});
});
test('Stops when disposing editor', () => {
snippetTest((editor, cursor, codeSnippet, snippetController) => {
editor.setPosition({ lineNumber: 4, column: 2 });
snippetController.run(codeSnippet, 0, 0, false);
snippetController.dispose();
assert.equal(snippetController.isInSnippetMode(), false);
});
});
});
\ No newline at end of file
......@@ -6,6 +6,7 @@
import * as assert from 'assert';
import {Range} from 'vs/editor/common/core/range';
import {Position} from 'vs/editor/common/core/position';
suite('Editor Core - Range', () => {
test('empty range', () => {
......@@ -92,4 +93,28 @@ suite('Editor Core - Range', () => {
b = new Range(1, 1, 1, 4);
assert.ok(Range.compareRangesUsingEnds(a, b) > 0, 'a.start = b.start, a.end > b.end');
});
test('containsPosition', () => {
assert.equal(new Range(2, 2, 5, 10).containsPosition(new Position(1, 3)), false);
assert.equal(new Range(2, 2, 5, 10).containsPosition(new Position(2, 1)), false);
assert.equal(new Range(2, 2, 5, 10).containsPosition(new Position(2, 2)), true);
assert.equal(new Range(2, 2, 5, 10).containsPosition(new Position(2, 3)), true);
assert.equal(new Range(2, 2, 5, 10).containsPosition(new Position(3, 1)), true);
assert.equal(new Range(2, 2, 5, 10).containsPosition(new Position(5, 9)), true);
assert.equal(new Range(2, 2, 5, 10).containsPosition(new Position(5, 10)), true);
assert.equal(new Range(2, 2, 5, 10).containsPosition(new Position(5, 11)), false);
assert.equal(new Range(2, 2, 5, 10).containsPosition(new Position(6, 1)), false);
});
test('containsRange', () => {
assert.equal(new Range(2, 2, 5, 10).containsRange(new Range(1, 3, 2, 2)), false);
assert.equal(new Range(2, 2, 5, 10).containsRange(new Range(2, 1, 2, 2)), false);
assert.equal(new Range(2, 2, 5, 10).containsRange(new Range(2, 2, 5, 11)), false);
assert.equal(new Range(2, 2, 5, 10).containsRange(new Range(2, 2, 6, 1)), false);
assert.equal(new Range(2, 2, 5, 10).containsRange(new Range(5, 9, 6, 1)), false);
assert.equal(new Range(2, 2, 5, 10).containsRange(new Range(5, 10, 6, 1)), false);
assert.equal(new Range(2, 2, 5, 10).containsRange(new Range(2, 2, 5, 10)), true);
assert.equal(new Range(2, 2, 5, 10).containsRange(new Range(2, 3, 5, 9)), true);
assert.equal(new Range(2, 2, 5, 10).containsRange(new Range(3, 100, 4, 100)), true);
});
});
......@@ -89,7 +89,7 @@ export class EditorAccessor implements emmet.Editor {
let range = new Range(startPosition.lineNumber, startPosition.column, endPosition.lineNumber, endPosition.column);
let snippet = snippets.CodeSnippet.convertExternalSnippet(value, snippets.ExternalSnippetType.EmmetSnippet);
let codeSnippet = new snippets.CodeSnippet(snippet);
SnippetController.get(this.editor).runWithReplaceRange(codeSnippet, range, false);
SnippetController.get(this.editor).runWithReplaceRange(codeSnippet, range);
}
public onAfterEmmetAction(): void {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册