codeActionModel.test.ts 4.9 KB
Newer Older
1 2 3 4 5 6 7
/*---------------------------------------------------------------------------------------------
 *  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';
M
Matt Bierner 已提交
8
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
9
import URI from 'vs/base/common/uri';
M
Matt Bierner 已提交
10 11
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
import { Selection } from 'vs/editor/common/core/selection';
A
Alex Dima 已提交
12
import { TextModel } from 'vs/editor/common/model/textModel';
M
Matt Bierner 已提交
13 14 15
import { CodeActionProviderRegistry, LanguageIdentifier } from 'vs/editor/common/modes';
import { CodeActionOracle } from 'vs/editor/contrib/codeAction/codeActionModel';
import { CodeActionKind } from 'vs/editor/contrib/codeAction/codeActionTrigger';
A
Alex Dima 已提交
16
import { createTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor';
17 18
import { MarkerService } from 'vs/platform/markers/common/markerService';

M
Matt Bierner 已提交
19 20 21 22 23
const testProvider = {
	provideCodeActions() {
		return [{ id: 'test-command', title: 'test', arguments: [] }];
	}
};
M
Matt Bierner 已提交
24
suite('CodeAction', () => {
25

J
Johannes Rieken 已提交
26
	const languageIdentifier = new LanguageIdentifier('foo-lang', 3);
27
	let uri = URI.parse('untitled:path');
A
Alex Dima 已提交
28
	let model: TextModel;
29
	let markerService: MarkerService;
30
	let editor: ICodeEditor;
M
Matt Bierner 已提交
31
	let disposables: IDisposable[];
32 33

	setup(() => {
M
Matt Bierner 已提交
34
		disposables = [];
35
		markerService = new MarkerService();
A
Alex Dima 已提交
36
		model = TextModel.createFromString('foobar  foo bar\nfarboo far boo', undefined, languageIdentifier, uri);
37
		editor = createTestCodeEditor({ model: model });
38 39 40
		editor.setPosition({ lineNumber: 1, column: 1 });
	});

J
Johannes Rieken 已提交
41
	teardown(() => {
M
Matt Bierner 已提交
42
		dispose(disposables);
J
Johannes Rieken 已提交
43
		editor.dispose();
J
Johannes Rieken 已提交
44
		model.dispose();
J
Johannes Rieken 已提交
45
		markerService.dispose();
J
Johannes Rieken 已提交
46 47
	});

48
	test('Orcale -> marker added', done => {
M
Matt Bierner 已提交
49 50
		const reg = CodeActionProviderRegistry.register(languageIdentifier.language, testProvider);
		disposables.push(reg);
51

52
		const oracle = new CodeActionOracle(editor, markerService, e => {
M
Matt Bierner 已提交
53
			assert.equal(e.trigger.type, 'auto');
54
			assert.ok(e.actions);
55

56
			e.actions.then(fixes => {
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
				oracle.dispose();
				assert.equal(fixes.length, 1);
				done();
			}, done);
		});

		// start here
		markerService.changeOne('fake', uri, [{
			startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 6,
			message: 'error',
			severity: 1,
			code: '',
			source: ''
		}]);

	});

74
	test('Orcale -> position changed', () => {
M
Matt Bierner 已提交
75 76
		const reg = CodeActionProviderRegistry.register(languageIdentifier.language, testProvider);
		disposables.push(reg);
77 78 79 80 81 82 83 84 85 86 87

		markerService.changeOne('fake', uri, [{
			startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 6,
			message: 'error',
			severity: 1,
			code: '',
			source: ''
		}]);

		editor.setPosition({ lineNumber: 2, column: 1 });

J
Johannes Rieken 已提交
88
		return new Promise((resolve, reject) => {
89

90
			const oracle = new CodeActionOracle(editor, markerService, e => {
M
Matt Bierner 已提交
91
				assert.equal(e.trigger.type, 'auto');
92 93
				assert.ok(e.actions);
				e.actions.then(fixes => {
94 95 96 97 98 99 100
					oracle.dispose();
					assert.equal(fixes.length, 1);
					resolve(undefined);
				}, reject);
			});
			// start here
			editor.setPosition({ lineNumber: 1, column: 1 });
101
		});
J
Johannes Rieken 已提交
102
	});
103

J
Johannes Rieken 已提交
104
	test('Lightbulb is in the wrong place, #29933', async function () {
M
Matt Bierner 已提交
105 106
		const reg = CodeActionProviderRegistry.register(languageIdentifier.language, {
			provideCodeActions(_doc, _range) {
J
Johannes Rieken 已提交
107 108 109
				return [];
			}
		});
M
Matt Bierner 已提交
110
		disposables.push(reg);
J
Johannes Rieken 已提交
111 112 113 114 115 116 117 118 119 120 121

		editor.getModel().setValue('// @ts-check\n2\ncon\n');

		markerService.changeOne('fake', uri, [{
			startLineNumber: 3, startColumn: 1, endLineNumber: 3, endColumn: 4,
			message: 'error',
			severity: 1,
			code: '',
			source: ''
		}]);

122
		// case 1 - drag selection over multiple lines -> range of enclosed marker, position or marker
J
Johannes Rieken 已提交
123
		await new Promise(resolve => {
J
Johannes Rieken 已提交
124

125
			let oracle = new CodeActionOracle(editor, markerService, e => {
M
Matt Bierner 已提交
126
				assert.equal(e.trigger.type, 'auto');
127 128 129 130 131
				const selection = <Selection>e.rangeOrSelection;
				assert.deepEqual(selection.selectionStartLineNumber, 1);
				assert.deepEqual(selection.selectionStartColumn, 1);
				assert.deepEqual(selection.endLineNumber, 4);
				assert.deepEqual(selection.endColumn, 1);
132
				assert.deepEqual(e.position, { lineNumber: 3, column: 1 });
J
Johannes Rieken 已提交
133 134 135 136 137 138 139 140

				oracle.dispose();
				resolve(null);
			}, 5);

			editor.setSelection({ startLineNumber: 1, startColumn: 1, endLineNumber: 4, endColumn: 1 });
		});

141 142
		// // case 2 - selection over multiple lines & manual trigger -> lightbulb
		// await new TPromise(resolve => {
J
Johannes Rieken 已提交
143

144
		// 	editor.setSelection({ startLineNumber: 1, startColumn: 1, endLineNumber: 4, endColumn: 1 });
J
Johannes Rieken 已提交
145

146 147 148
		// 	let oracle = new QuickFixOracle(editor, markerService, e => {
		// 		assert.equal(e.type, 'manual');
		// 		assert.ok(e.range.equalsRange({ startLineNumber: 1, startColumn: 1, endLineNumber: 4, endColumn: 1 }));
J
Johannes Rieken 已提交
149

150 151 152
		// 		oracle.dispose();
		// 		resolve(null);
		// 	}, 5);
J
Johannes Rieken 已提交
153

154 155
		// 	oracle.trigger('manual');
		// });
J
Johannes Rieken 已提交
156
	});
157
});