diff --git a/extensions/emmet/src/test/abbreviationAction.test.ts b/extensions/emmet/src/test/abbreviationAction.test.ts
index fdfc373e96faa125b8595d7f351f4337cbe513db..302fd6f8ce4130d2ecd46b940e270286d3e4c093 100644
--- a/extensions/emmet/src/test/abbreviationAction.test.ts
+++ b/extensions/emmet/src/test/abbreviationAction.test.ts
@@ -5,51 +5,12 @@
import 'mocha';
import * as assert from 'assert';
-import { Selection, workspace, CompletionList, CancellationTokenSource, Position } from 'vscode';
+import { Selection, workspace, CompletionList, CancellationTokenSource } from 'vscode';
import { withRandomFileEditor, closeAllEditors } from './testUtils';
-import { expandEmmetAbbreviation, wrapWithAbbreviation, wrapIndividualLinesWithAbbreviation } from '../abbreviationActions';
+import { expandEmmetAbbreviation } from '../abbreviationActions';
import { DefaultCompletionItemProvider } from '../defaultCompletionProvider';
const completionProvider = new DefaultCompletionItemProvider();
-const cssContents = `
-.boo {
- margin: 20px 10px;
- m10
- background-image: url('tryme.png');
- m10
-}
-
-.boo .hoo {
- margin: 10px;
- ind
-}
-`;
-
-const scssContents = `
-.boo {
- margin: 10px;
- p10
- .hoo {
- p20
- }
-}
-@include b(alert) {
-
- margin: 10px;
- p30
-
- @include b(alert) {
- p40
- }
-}
-.foo {
- margin: 10px;
- margin: a
- .hoo {
- color: #000;
- }
-}
-`;
const htmlContents = `
@@ -74,53 +35,6 @@ const htmlContents = `
`;
-const htmlContentsForWrapTests = `
-
-`;
-
-const wrapBlockElementExpected = `
-
-
-
- img
-
-
-
- $hithere
-
-
-`;
-
-const wrapInlineElementExpected = `
-
-`;
-
-const wrapSnippetExpected = `
-
-`;
-
-const wrapMultiLineAbbrExpected = `
-
-`;
-
suite('Tests for Expand Abbreviations (HTML)', () => {
teardown(() => {
// Reset config and close all editors
@@ -367,369 +281,6 @@ suite('Tests for Expand Abbreviations (HTML)', () => {
});
-suite('Tests for Expand Abbreviations (CSS)', () => {
- teardown(closeAllEditors);
-
- test('Expand abbreviation (CSS)', () => {
- return withRandomFileEditor(cssContents, 'css', (editor, doc) => {
- editor.selections = [new Selection(3, 1, 3, 4), new Selection(5, 1, 5, 4)];
- return expandEmmetAbbreviation(null).then(() => {
- assert.equal(editor.document.getText(), cssContents.replace(/m10/g, 'margin: 10px;'));
- return Promise.resolve();
- });
- });
- });
-
- test('Skip when typing property values when there is a property in the next line (CSS)', () => {
- const testContent = `
-.foo {
- margin: a
- margin: 10px;
-}
- `;
-
- return withRandomFileEditor(testContent, 'css', (editor, doc) => {
- editor.selection = new Selection(2, 10, 2, 10);
- return expandEmmetAbbreviation(null).then(() => {
- assert.equal(editor.document.getText(), testContent);
- const cancelSrc = new CancellationTokenSource();
- const completionPromise = completionProvider.provideCompletionItems(editor.document, new Position(2, 10), cancelSrc.token);
- if (completionPromise) {
- assert.equal(1, 2, `Invalid completion at property value`);
- }
- return Promise.resolve();
- });
- });
- });
-
- test('Skip when typing property values when there is a property in the previous line (CSS)', () => {
- const testContent = `
-.foo {
- margin: 10px;
- margin: a
-}
- `;
-
- return withRandomFileEditor(testContent, 'css', (editor, doc) => {
- editor.selection = new Selection(3, 10, 3, 10);
- return expandEmmetAbbreviation(null).then(() => {
- assert.equal(editor.document.getText(), testContent);
- const cancelSrc = new CancellationTokenSource();
- const completionPromise = completionProvider.provideCompletionItems(editor.document, new Position(3, 10), cancelSrc.token);
- if (completionPromise) {
- assert.equal(1, 2, `Invalid completion at property value`);
- }
- return Promise.resolve();
- });
- });
- });
-
- test('Skip when typing property values when it is the only property in the rule (CSS)', () => {
- const testContent = `
-.foo {
- margin: a
-}
- `;
-
- return withRandomFileEditor(testContent, 'css', (editor, doc) => {
- editor.selection = new Selection(2, 10, 2, 10);
- return expandEmmetAbbreviation(null).then(() => {
- assert.equal(editor.document.getText(), testContent);
- const cancelSrc = new CancellationTokenSource();
- const completionPromise = completionProvider.provideCompletionItems(editor.document, new Position(2, 10), cancelSrc.token);
- if (completionPromise) {
- assert.equal(1, 2, `Invalid completion at property value`);
- }
- return Promise.resolve();
- });
- });
- });
-
- test('Expand abbreviation in completion list (CSS)', () => {
- const abbreviation = 'm10';
- const expandedText = 'margin: 10px;';
-
- return withRandomFileEditor(cssContents, 'css', (editor, doc) => {
- editor.selection = new Selection(3, 1, 3, 4);
- const cancelSrc = new CancellationTokenSource();
- const completionPromise1 = completionProvider.provideCompletionItems(editor.document, new Position(3, 4), cancelSrc.token);
- const completionPromise2 = completionProvider.provideCompletionItems(editor.document, new Position(5, 4), cancelSrc.token);
- if (!completionPromise1 || !completionPromise2) {
- assert.equal(1, 2, `Problem with expanding m10`);
- return Promise.resolve();
- }
-
- const callBack = (completionList: CompletionList) => {
- if (!completionList.items || !completionList.items.length) {
- assert.equal(1, 2, `Problem with expanding m10`);
- return;
- }
- const emmetCompletionItem = completionList.items[0];
- assert.equal(emmetCompletionItem.label, expandedText, `Label of completion item doesnt match.`);
- assert.equal((emmetCompletionItem.documentation || '').replace(/\|/g, ''), expandedText, `Docs of completion item doesnt match.`);
- assert.equal(emmetCompletionItem.filterText, abbreviation, `FilterText of completion item doesnt match.`);
- };
-
- return Promise.all([completionPromise1, completionPromise2]).then(([result1, result2]) => {
- callBack(result1);
- callBack(result2);
- return Promise.resolve();
- });
- });
- });
-
- test('Expand abbreviation (SCSS)', () => {
- return withRandomFileEditor(scssContents, 'scss', (editor, doc) => {
- editor.selections = [
- new Selection(3, 4, 3, 4),
- new Selection(5, 5, 5, 5),
- new Selection(11, 4, 11, 4),
- new Selection(14, 5, 14, 5)
- ];
- return expandEmmetAbbreviation(null).then(() => {
- assert.equal(editor.document.getText(), scssContents.replace(/p(\d\d)/g, 'padding: $1px;'));
- return Promise.resolve();
- });
- });
- });
-
- test('Expand abbreviation in completion list (SCSS)', () => {
-
- return withRandomFileEditor(scssContents, 'scss', (editor, doc) => {
- editor.selection = new Selection(3, 4, 3, 4);
- const cancelSrc = new CancellationTokenSource();
- const completionPromise1 = completionProvider.provideCompletionItems(editor.document, new Position(3, 4), cancelSrc.token);
- const completionPromise2 = completionProvider.provideCompletionItems(editor.document, new Position(5, 5), cancelSrc.token);
- const completionPromise3 = completionProvider.provideCompletionItems(editor.document, new Position(11, 4), cancelSrc.token);
- const completionPromise4 = completionProvider.provideCompletionItems(editor.document, new Position(14, 5), cancelSrc.token);
- if (!completionPromise1) {
- assert.equal(1, 2, `Problem with expanding padding abbreviations at line 3 col 4`);
- }
- if (!completionPromise2) {
- assert.equal(1, 2, `Problem with expanding padding abbreviations at line 5 col 5`);
- }
- if (!completionPromise3) {
- assert.equal(1, 2, `Problem with expanding padding abbreviations at line 11 col 4`);
- }
- if (!completionPromise4) {
- assert.equal(1, 2, `Problem with expanding padding abbreviations at line 14 col 5`);
- }
-
- if (!completionPromise1 || !completionPromise2 || !completionPromise3 || !completionPromise4) {
- return Promise.resolve();
- }
-
- const callBack = (completionList: CompletionList, abbreviation, expandedText) => {
- if (!completionList.items || !completionList.items.length) {
- assert.equal(1, 2, `Problem with expanding m10`);
- return;
- }
- const emmetCompletionItem = completionList.items[0];
- assert.equal(emmetCompletionItem.label, expandedText, `Label of completion item doesnt match.`);
- assert.equal((emmetCompletionItem.documentation || '').replace(/\|/g, ''), expandedText, `Docs of completion item doesnt match.`);
- assert.equal(emmetCompletionItem.filterText, abbreviation, `FilterText of completion item doesnt match.`);
- };
-
- return Promise.all([completionPromise1, completionPromise2, completionPromise3, completionPromise4]).then(([result1, result2, result3, result4]) => {
- callBack(result1, 'p10', 'padding: 10px;');
- callBack(result2, 'p20', 'padding: 20px;');
- callBack(result3, 'p30', 'padding: 30px;');
- callBack(result4, 'p40', 'padding: 40px;');
- return Promise.resolve();
- });
- });
- });
-
-
- test('Invalid locations for abbreviations in scss', () => {
- const scssContentsNoExpand = `
-m10
- .boo {
- margin: 10px;
- .hoo {
- background:
- }
- }
- `;
-
- return withRandomFileEditor(scssContentsNoExpand, 'scss', (editor, doc) => {
- editor.selections = [
- new Selection(1, 3, 1, 3), // outside rule
- new Selection(5, 15, 5, 15) // in the value part of property value
- ];
- return expandEmmetAbbreviation(null).then(() => {
- assert.equal(editor.document.getText(), scssContentsNoExpand);
- return Promise.resolve();
- });
- });
- });
-
- test('Invalid locations for abbreviations in scss in completion list', () => {
- const scssContentsNoExpand = `
-m10
- .boo {
- margin: 10px;
- .hoo {
- background:
- }
- }
- `;
-
- return withRandomFileEditor(scssContentsNoExpand, 'scss', (editor, doc) => {
- editor.selection = new Selection(1, 3, 1, 3); // outside rule
- const cancelSrc = new CancellationTokenSource();
- let completionPromise = completionProvider.provideCompletionItems(editor.document, editor.selection.active, cancelSrc.token);
- if (completionPromise) {
- assert.equal(1, 2, `m10 gets expanded in invalid location (outside rule)`);
- }
-
- editor.selection = new Selection(5, 15, 5, 15); // in the value part of property value
- completionPromise = completionProvider.provideCompletionItems(editor.document, editor.selection.active, cancelSrc.token);
- if (completionPromise) {
- return completionPromise.then((completionList: CompletionList) => {
- if (completionList && completionList.items && completionList.items.length > 0) {
- assert.equal(1, 2, `m10 gets expanded in invalid location (n the value part of property value)`);
- }
- return Promise.resolve();
- });
- }
- return Promise.resolve();
- });
- });
-
-});
-
- test('Skip when typing property values when there is a nested rule in the next line (SCSS)', () => {
- return withRandomFileEditor(scssContents, 'scss', (editor, doc) => {
- editor.selection = new Selection(19, 10, 19, 10);
- return expandEmmetAbbreviation(null).then(() => {
- assert.equal(editor.document.getText(), scssContents);
- const cancelSrc = new CancellationTokenSource();
- const completionPromise = completionProvider.provideCompletionItems(editor.document, new Position(19, 10), cancelSrc.token);
- if (completionPromise) {
- assert.equal(1, 2, `Invalid completion at property value`);
- }
- return Promise.resolve();
- });
- });
-});
-
-suite('Tests for Wrap with Abbreviations', () => {
- teardown(closeAllEditors);
-
- const multiCursors = [new Selection(2, 6, 2, 6), new Selection(3, 6, 3, 6)];
- const multiCursorsWithSelection = [new Selection(2, 2, 2, 28), new Selection(3, 2, 3, 33)];
- const multiCursorsWithFullLineSelection = [new Selection(2, 0, 2, 28), new Selection(3, 0, 3, 33)];
-
-
- test('Wrap with block element using multi cursor', () => {
- return testWrapWithAbbreviation(multiCursors, 'div', wrapBlockElementExpected);
- });
-
- test('Wrap with inline element using multi cursor', () => {
- return testWrapWithAbbreviation(multiCursors, 'span', wrapInlineElementExpected);
- });
-
- test('Wrap with snippet using multi cursor', () => {
- return testWrapWithAbbreviation(multiCursors, 'a', wrapSnippetExpected);
- });
-
- test('Wrap with multi line abbreviation using multi cursor', () => {
- return testWrapWithAbbreviation(multiCursors, 'ul>li', wrapMultiLineAbbrExpected);
- });
-
- test('Wrap with block element using multi cursor selection', () => {
- return testWrapWithAbbreviation(multiCursorsWithSelection, 'div', wrapBlockElementExpected);
- });
-
- test('Wrap with inline element using multi cursor selection', () => {
- return testWrapWithAbbreviation(multiCursorsWithSelection, 'span', wrapInlineElementExpected);
- });
-
- test('Wrap with snippet using multi cursor selection', () => {
- return testWrapWithAbbreviation(multiCursorsWithSelection, 'a', wrapSnippetExpected);
- });
-
- test('Wrap with multi line abbreviation using multi cursor selection', () => {
- return testWrapWithAbbreviation(multiCursorsWithSelection, 'ul>li', wrapMultiLineAbbrExpected);
- });
-
- test('Wrap with block element using multi cursor full line selection', () => {
- return testWrapWithAbbreviation(multiCursorsWithFullLineSelection, 'div', wrapBlockElementExpected);
- });
-
- test('Wrap with inline element using multi cursor full line selection', () => {
- return testWrapWithAbbreviation(multiCursorsWithFullLineSelection, 'span', wrapInlineElementExpected);
- });
-
- test('Wrap with snippet using multi cursor full line selection', () => {
- return testWrapWithAbbreviation(multiCursorsWithFullLineSelection, 'a', wrapSnippetExpected);
- });
-
- test('Wrap with multi line abbreviation using multi cursor full line selection', () => {
- return testWrapWithAbbreviation(multiCursorsWithFullLineSelection, 'ul>li', wrapMultiLineAbbrExpected);
- });
-
- test('Wrap individual lines with abbreviation', () => {
- const contents = `
-
-`;
- const wrapIndividualLinesExpected = `
-
-`;
- return withRandomFileEditor(contents, 'html', (editor, doc) => {
- editor.selections = [new Selection(2, 2, 3, 33)];
- const promise = wrapIndividualLinesWithAbbreviation({ abbreviation: 'ul>li.hello$*' });
- if (!promise) {
- assert.equal(1, 2, 'Wrap Individual Lines with Abbreviation returned udnefined.');
- return Promise.resolve();
- }
- return promise.then(() => {
- assert.equal(editor.document.getText(), wrapIndividualLinesExpected);
- return Promise.resolve();
- });
- });
- });
-
- test('Wrap individual lines with abbreviation and trim', () => {
- const contents = `
-
- • lorem ipsum
- • lorem ipsum
-
- `;
- const wrapIndividualLinesExpected = `
-
-
- - lorem ipsum
- - lorem ipsum
-
-
- `;
- return withRandomFileEditor(contents, 'html', (editor, doc) => {
- editor.selections = [new Selection(2, 3, 3, 16)];
- const promise = wrapIndividualLinesWithAbbreviation({ abbreviation: 'ul>li.hello$*|t' });
- if (!promise) {
- assert.equal(1, 2, 'Wrap Individual Lines with Abbreviation returned udnefined.');
- return Promise.resolve();
- }
-
- return promise.then(() => {
- assert.equal(editor.document.getText(), wrapIndividualLinesExpected);
- return Promise.resolve();
- });
- });
- });
-});
-
suite('Tests for jsx, xml and xsl', () => {
teardown(closeAllEditors);
@@ -819,18 +370,3 @@ function testHtmlCompletionProvider(selection: Selection, abbreviation: string,
});
}
-function testWrapWithAbbreviation(selections: Selection[], abbreviation: string, expectedContents: string): Thenable {
- return withRandomFileEditor(htmlContentsForWrapTests, 'html', (editor, doc) => {
- editor.selections = selections;
- const promise = wrapWithAbbreviation({ abbreviation });
- if (!promise) {
- assert.equal(1, 2, 'Wrap with Abbreviation returned udnefined.');
- return Promise.resolve();
- }
-
- return promise.then(() => {
- assert.equal(editor.document.getText(), expectedContents);
- return Promise.resolve();
- });
- });
-}
diff --git a/extensions/emmet/src/test/cssAbbreviationAction.test.ts b/extensions/emmet/src/test/cssAbbreviationAction.test.ts
new file mode 100644
index 0000000000000000000000000000000000000000..00b205c682a12f5bff41ca30bbae319b386b7c47
--- /dev/null
+++ b/extensions/emmet/src/test/cssAbbreviationAction.test.ts
@@ -0,0 +1,301 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+import 'mocha';
+import * as assert from 'assert';
+import { Selection, CompletionList, CancellationTokenSource, Position } from 'vscode';
+import { withRandomFileEditor, closeAllEditors } from './testUtils';
+import { expandEmmetAbbreviation } from '../abbreviationActions';
+import { DefaultCompletionItemProvider } from '../defaultCompletionProvider';
+
+const completionProvider = new DefaultCompletionItemProvider();
+const cssContents = `
+.boo {
+ margin: 20px 10px;
+ m10
+ background-image: url('tryme.png');
+ m10
+}
+
+.boo .hoo {
+ margin: 10px;
+ ind
+}
+`;
+
+const scssContents = `
+.boo {
+ margin: 10px;
+ p10
+ .hoo {
+ p20
+ }
+}
+@include b(alert) {
+
+ margin: 10px;
+ p30
+
+ @include b(alert) {
+ p40
+ }
+}
+.foo {
+ margin: 10px;
+ margin: a
+ .hoo {
+ color: #000;
+ }
+}
+`;
+
+
+suite('Tests for Expand Abbreviations (CSS)', () => {
+ teardown(closeAllEditors);
+
+ test('Expand abbreviation (CSS)', () => {
+ return withRandomFileEditor(cssContents, 'css', (editor, doc) => {
+ editor.selections = [new Selection(3, 1, 3, 4), new Selection(5, 1, 5, 4)];
+ return expandEmmetAbbreviation(null).then(() => {
+ assert.equal(editor.document.getText(), cssContents.replace(/m10/g, 'margin: 10px;'));
+ return Promise.resolve();
+ });
+ });
+ });
+
+ test('Skip when typing property values when there is a property in the next line (CSS)', () => {
+ const testContent = `
+.foo {
+ margin: a
+ margin: 10px;
+}
+ `;
+
+ return withRandomFileEditor(testContent, 'css', (editor, doc) => {
+ editor.selection = new Selection(2, 10, 2, 10);
+ return expandEmmetAbbreviation(null).then(() => {
+ assert.equal(editor.document.getText(), testContent);
+ const cancelSrc = new CancellationTokenSource();
+ const completionPromise = completionProvider.provideCompletionItems(editor.document, new Position(2, 10), cancelSrc.token);
+ if (completionPromise) {
+ assert.equal(1, 2, `Invalid completion at property value`);
+ }
+ return Promise.resolve();
+ });
+ });
+ });
+
+ test('Skip when typing property values when there is a property in the previous line (CSS)', () => {
+ const testContent = `
+.foo {
+ margin: 10px;
+ margin: a
+}
+ `;
+
+ return withRandomFileEditor(testContent, 'css', (editor, doc) => {
+ editor.selection = new Selection(3, 10, 3, 10);
+ return expandEmmetAbbreviation(null).then(() => {
+ assert.equal(editor.document.getText(), testContent);
+ const cancelSrc = new CancellationTokenSource();
+ const completionPromise = completionProvider.provideCompletionItems(editor.document, new Position(3, 10), cancelSrc.token);
+ if (completionPromise) {
+ assert.equal(1, 2, `Invalid completion at property value`);
+ }
+ return Promise.resolve();
+ });
+ });
+ });
+
+ test('Skip when typing property values when it is the only property in the rule (CSS)', () => {
+ const testContent = `
+.foo {
+ margin: a
+}
+ `;
+
+ return withRandomFileEditor(testContent, 'css', (editor, doc) => {
+ editor.selection = new Selection(2, 10, 2, 10);
+ return expandEmmetAbbreviation(null).then(() => {
+ assert.equal(editor.document.getText(), testContent);
+ const cancelSrc = new CancellationTokenSource();
+ const completionPromise = completionProvider.provideCompletionItems(editor.document, new Position(2, 10), cancelSrc.token);
+ if (completionPromise) {
+ assert.equal(1, 2, `Invalid completion at property value`);
+ }
+ return Promise.resolve();
+ });
+ });
+ });
+
+ test('Expand abbreviation in completion list (CSS)', () => {
+ const abbreviation = 'm10';
+ const expandedText = 'margin: 10px;';
+
+ return withRandomFileEditor(cssContents, 'css', (editor, doc) => {
+ editor.selection = new Selection(3, 1, 3, 4);
+ const cancelSrc = new CancellationTokenSource();
+ const completionPromise1 = completionProvider.provideCompletionItems(editor.document, new Position(3, 4), cancelSrc.token);
+ const completionPromise2 = completionProvider.provideCompletionItems(editor.document, new Position(5, 4), cancelSrc.token);
+ if (!completionPromise1 || !completionPromise2) {
+ assert.equal(1, 2, `Problem with expanding m10`);
+ return Promise.resolve();
+ }
+
+ const callBack = (completionList: CompletionList) => {
+ if (!completionList.items || !completionList.items.length) {
+ assert.equal(1, 2, `Problem with expanding m10`);
+ return;
+ }
+ const emmetCompletionItem = completionList.items[0];
+ assert.equal(emmetCompletionItem.label, expandedText, `Label of completion item doesnt match.`);
+ assert.equal((emmetCompletionItem.documentation || '').replace(/\|/g, ''), expandedText, `Docs of completion item doesnt match.`);
+ assert.equal(emmetCompletionItem.filterText, abbreviation, `FilterText of completion item doesnt match.`);
+ };
+
+ return Promise.all([completionPromise1, completionPromise2]).then(([result1, result2]) => {
+ callBack(result1);
+ callBack(result2);
+ return Promise.resolve();
+ });
+ });
+ });
+
+ test('Expand abbreviation (SCSS)', () => {
+ return withRandomFileEditor(scssContents, 'scss', (editor, doc) => {
+ editor.selections = [
+ new Selection(3, 4, 3, 4),
+ new Selection(5, 5, 5, 5),
+ new Selection(11, 4, 11, 4),
+ new Selection(14, 5, 14, 5)
+ ];
+ return expandEmmetAbbreviation(null).then(() => {
+ assert.equal(editor.document.getText(), scssContents.replace(/p(\d\d)/g, 'padding: $1px;'));
+ return Promise.resolve();
+ });
+ });
+ });
+
+ test('Expand abbreviation in completion list (SCSS)', () => {
+
+ return withRandomFileEditor(scssContents, 'scss', (editor, doc) => {
+ editor.selection = new Selection(3, 4, 3, 4);
+ const cancelSrc = new CancellationTokenSource();
+ const completionPromise1 = completionProvider.provideCompletionItems(editor.document, new Position(3, 4), cancelSrc.token);
+ const completionPromise2 = completionProvider.provideCompletionItems(editor.document, new Position(5, 5), cancelSrc.token);
+ const completionPromise3 = completionProvider.provideCompletionItems(editor.document, new Position(11, 4), cancelSrc.token);
+ const completionPromise4 = completionProvider.provideCompletionItems(editor.document, new Position(14, 5), cancelSrc.token);
+ if (!completionPromise1) {
+ assert.equal(1, 2, `Problem with expanding padding abbreviations at line 3 col 4`);
+ }
+ if (!completionPromise2) {
+ assert.equal(1, 2, `Problem with expanding padding abbreviations at line 5 col 5`);
+ }
+ if (!completionPromise3) {
+ assert.equal(1, 2, `Problem with expanding padding abbreviations at line 11 col 4`);
+ }
+ if (!completionPromise4) {
+ assert.equal(1, 2, `Problem with expanding padding abbreviations at line 14 col 5`);
+ }
+
+ if (!completionPromise1 || !completionPromise2 || !completionPromise3 || !completionPromise4) {
+ return Promise.resolve();
+ }
+
+ const callBack = (completionList: CompletionList, abbreviation, expandedText) => {
+ if (!completionList.items || !completionList.items.length) {
+ assert.equal(1, 2, `Problem with expanding m10`);
+ return;
+ }
+ const emmetCompletionItem = completionList.items[0];
+ assert.equal(emmetCompletionItem.label, expandedText, `Label of completion item doesnt match.`);
+ assert.equal((emmetCompletionItem.documentation || '').replace(/\|/g, ''), expandedText, `Docs of completion item doesnt match.`);
+ assert.equal(emmetCompletionItem.filterText, abbreviation, `FilterText of completion item doesnt match.`);
+ };
+
+ return Promise.all([completionPromise1, completionPromise2, completionPromise3, completionPromise4]).then(([result1, result2, result3, result4]) => {
+ callBack(result1, 'p10', 'padding: 10px;');
+ callBack(result2, 'p20', 'padding: 20px;');
+ callBack(result3, 'p30', 'padding: 30px;');
+ callBack(result4, 'p40', 'padding: 40px;');
+ return Promise.resolve();
+ });
+ });
+ });
+
+
+ test('Invalid locations for abbreviations in scss', () => {
+ const scssContentsNoExpand = `
+m10
+ .boo {
+ margin: 10px;
+ .hoo {
+ background:
+ }
+ }
+ `;
+
+ return withRandomFileEditor(scssContentsNoExpand, 'scss', (editor, doc) => {
+ editor.selections = [
+ new Selection(1, 3, 1, 3), // outside rule
+ new Selection(5, 15, 5, 15) // in the value part of property value
+ ];
+ return expandEmmetAbbreviation(null).then(() => {
+ assert.equal(editor.document.getText(), scssContentsNoExpand);
+ return Promise.resolve();
+ });
+ });
+ });
+
+ test('Invalid locations for abbreviations in scss in completion list', () => {
+ const scssContentsNoExpand = `
+m10
+ .boo {
+ margin: 10px;
+ .hoo {
+ background:
+ }
+ }
+ `;
+
+ return withRandomFileEditor(scssContentsNoExpand, 'scss', (editor, doc) => {
+ editor.selection = new Selection(1, 3, 1, 3); // outside rule
+ const cancelSrc = new CancellationTokenSource();
+ let completionPromise = completionProvider.provideCompletionItems(editor.document, editor.selection.active, cancelSrc.token);
+ if (completionPromise) {
+ assert.equal(1, 2, `m10 gets expanded in invalid location (outside rule)`);
+ }
+
+ editor.selection = new Selection(5, 15, 5, 15); // in the value part of property value
+ completionPromise = completionProvider.provideCompletionItems(editor.document, editor.selection.active, cancelSrc.token);
+ if (completionPromise) {
+ return completionPromise.then((completionList: CompletionList) => {
+ if (completionList && completionList.items && completionList.items.length > 0) {
+ assert.equal(1, 2, `m10 gets expanded in invalid location (n the value part of property value)`);
+ }
+ return Promise.resolve();
+ });
+ }
+ return Promise.resolve();
+ });
+ });
+
+});
+
+ test('Skip when typing property values when there is a nested rule in the next line (SCSS)', () => {
+ return withRandomFileEditor(scssContents, 'scss', (editor, doc) => {
+ editor.selection = new Selection(19, 10, 19, 10);
+ return expandEmmetAbbreviation(null).then(() => {
+ assert.equal(editor.document.getText(), scssContents);
+ const cancelSrc = new CancellationTokenSource();
+ const completionPromise = completionProvider.provideCompletionItems(editor.document, new Position(19, 10), cancelSrc.token);
+ if (completionPromise) {
+ assert.equal(1, 2, `Invalid completion at property value`);
+ }
+ return Promise.resolve();
+ });
+ });
+});
+
diff --git a/extensions/emmet/src/test/wrapWithAbbreviation.test.ts b/extensions/emmet/src/test/wrapWithAbbreviation.test.ts
new file mode 100644
index 0000000000000000000000000000000000000000..364861d98bdee8bde81af217e0714ad3e33c50dc
--- /dev/null
+++ b/extensions/emmet/src/test/wrapWithAbbreviation.test.ts
@@ -0,0 +1,190 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+import 'mocha';
+import * as assert from 'assert';
+import { Selection } from 'vscode';
+import { withRandomFileEditor, closeAllEditors } from './testUtils';
+import { wrapWithAbbreviation, wrapIndividualLinesWithAbbreviation } from '../abbreviationActions';
+
+const htmlContentsForWrapTests = `
+
+`;
+
+const wrapBlockElementExpected = `
+
+
+
- img
+
+
+
- $hithere
+
+
+`;
+
+const wrapInlineElementExpected = `
+
+`;
+
+const wrapSnippetExpected = `
+
+`;
+
+const wrapMultiLineAbbrExpected = `
+
+`;
+
+suite('Tests for Wrap with Abbreviations', () => {
+ teardown(closeAllEditors);
+
+ const multiCursors = [new Selection(2, 6, 2, 6), new Selection(3, 6, 3, 6)];
+ const multiCursorsWithSelection = [new Selection(2, 2, 2, 28), new Selection(3, 2, 3, 33)];
+ const multiCursorsWithFullLineSelection = [new Selection(2, 0, 2, 28), new Selection(3, 0, 3, 33)];
+
+
+ test('Wrap with block element using multi cursor', () => {
+ return testWrapWithAbbreviation(multiCursors, 'div', wrapBlockElementExpected);
+ });
+
+ test('Wrap with inline element using multi cursor', () => {
+ return testWrapWithAbbreviation(multiCursors, 'span', wrapInlineElementExpected);
+ });
+
+ test('Wrap with snippet using multi cursor', () => {
+ return testWrapWithAbbreviation(multiCursors, 'a', wrapSnippetExpected);
+ });
+
+ test('Wrap with multi line abbreviation using multi cursor', () => {
+ return testWrapWithAbbreviation(multiCursors, 'ul>li', wrapMultiLineAbbrExpected);
+ });
+
+ test('Wrap with block element using multi cursor selection', () => {
+ return testWrapWithAbbreviation(multiCursorsWithSelection, 'div', wrapBlockElementExpected);
+ });
+
+ test('Wrap with inline element using multi cursor selection', () => {
+ return testWrapWithAbbreviation(multiCursorsWithSelection, 'span', wrapInlineElementExpected);
+ });
+
+ test('Wrap with snippet using multi cursor selection', () => {
+ return testWrapWithAbbreviation(multiCursorsWithSelection, 'a', wrapSnippetExpected);
+ });
+
+ test('Wrap with multi line abbreviation using multi cursor selection', () => {
+ return testWrapWithAbbreviation(multiCursorsWithSelection, 'ul>li', wrapMultiLineAbbrExpected);
+ });
+
+ test('Wrap with block element using multi cursor full line selection', () => {
+ return testWrapWithAbbreviation(multiCursorsWithFullLineSelection, 'div', wrapBlockElementExpected);
+ });
+
+ test('Wrap with inline element using multi cursor full line selection', () => {
+ return testWrapWithAbbreviation(multiCursorsWithFullLineSelection, 'span', wrapInlineElementExpected);
+ });
+
+ test('Wrap with snippet using multi cursor full line selection', () => {
+ return testWrapWithAbbreviation(multiCursorsWithFullLineSelection, 'a', wrapSnippetExpected);
+ });
+
+ test('Wrap with multi line abbreviation using multi cursor full line selection', () => {
+ return testWrapWithAbbreviation(multiCursorsWithFullLineSelection, 'ul>li', wrapMultiLineAbbrExpected);
+ });
+
+ test('Wrap individual lines with abbreviation', () => {
+ const contents = `
+
+`;
+ const wrapIndividualLinesExpected = `
+
+`;
+ return withRandomFileEditor(contents, 'html', (editor, doc) => {
+ editor.selections = [new Selection(2, 2, 3, 33)];
+ const promise = wrapIndividualLinesWithAbbreviation({ abbreviation: 'ul>li.hello$*' });
+ if (!promise) {
+ assert.equal(1, 2, 'Wrap Individual Lines with Abbreviation returned udnefined.');
+ return Promise.resolve();
+ }
+ return promise.then(() => {
+ assert.equal(editor.document.getText(), wrapIndividualLinesExpected);
+ return Promise.resolve();
+ });
+ });
+ });
+
+ test('Wrap individual lines with abbreviation and trim', () => {
+ const contents = `
+
+ • lorem ipsum
+ • lorem ipsum
+
+ `;
+ const wrapIndividualLinesExpected = `
+
+
+ - lorem ipsum
+ - lorem ipsum
+
+
+ `;
+ return withRandomFileEditor(contents, 'html', (editor, doc) => {
+ editor.selections = [new Selection(2, 3, 3, 16)];
+ const promise = wrapIndividualLinesWithAbbreviation({ abbreviation: 'ul>li.hello$*|t' });
+ if (!promise) {
+ assert.equal(1, 2, 'Wrap Individual Lines with Abbreviation returned udnefined.');
+ return Promise.resolve();
+ }
+
+ return promise.then(() => {
+ assert.equal(editor.document.getText(), wrapIndividualLinesExpected);
+ return Promise.resolve();
+ });
+ });
+ });
+});
+
+
+function testWrapWithAbbreviation(selections: Selection[], abbreviation: string, expectedContents: string): Thenable {
+ return withRandomFileEditor(htmlContentsForWrapTests, 'html', (editor, doc) => {
+ editor.selections = selections;
+ const promise = wrapWithAbbreviation({ abbreviation });
+ if (!promise) {
+ assert.equal(1, 2, 'Wrap with Abbreviation returned udnefined.');
+ return Promise.resolve();
+ }
+
+ return promise.then(() => {
+ assert.equal(editor.document.getText(), expectedContents);
+ return Promise.resolve();
+ });
+ });
+}