| // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| import 'package:analysis_server/protocol/protocol.dart'; |
| import 'package:analysis_server/protocol/protocol_generated.dart'; |
| import 'package:analysis_server/src/edit/edit_domain.dart'; |
| import 'package:analyzer_plugin/protocol/protocol_common.dart'; |
| import 'package:test/test.dart'; |
| import 'package:test_reflective_loader/test_reflective_loader.dart'; |
| |
| import '../analysis_abstract.dart'; |
| |
| main() { |
| defineReflectiveSuite(() { |
| defineReflectiveTests(PostfixCompletionTest); |
| }); |
| } |
| |
| @reflectiveTest |
| class PostfixCompletionTest extends AbstractAnalysisTest { |
| SourceChange change; |
| |
| @override |
| void setUp() { |
| super.setUp(); |
| createProject(); |
| handler = new EditDomainHandler(server); |
| } |
| |
| test_for() async { |
| addTestFile(''' |
| main() { |
| [].for |
| } |
| '''); |
| await waitForTasksFinished(); |
| await _prepareCompletion('.for', atStart: true); |
| _assertHasChange('Expand .for', ''' |
| main() { |
| for (var value in []) { |
| /*caret*/ |
| } |
| } |
| '''); |
| } |
| |
| void _assertHasChange(String message, String expectedCode, [Function cmp]) { |
| if (change.message == message) { |
| if (!change.edits.isEmpty) { |
| String resultCode = |
| SourceEdit.applySequence(testCode, change.edits[0].edits); |
| expect(resultCode, expectedCode.replaceAll('/*caret*/', '')); |
| if (cmp != null) { |
| int offset = cmp(resultCode); |
| expect(change.selection.offset, offset); |
| } |
| } else { |
| if (cmp != null) { |
| int offset = cmp(testCode); |
| expect(change.selection.offset, offset); |
| } |
| } |
| return; |
| } |
| fail("Expected to find |$message| but got: " + change.message); |
| } |
| |
| _prepareCompletion(String key, |
| {bool atStart: false, bool atEnd: false, int delta: 0}) async { |
| int offset = findOffset(key); |
| String src = testCode.replaceFirst(key, '', offset); |
| modifyTestFile(src); |
| await _prepareCompletionAt(offset, key); |
| } |
| |
| _prepareCompletionAt(int offset, String key) async { |
| var params = new EditGetPostfixCompletionParams(testFile, key, offset); |
| var request = |
| new Request('0', "edit.isPostfixCompletionApplicable", params.toJson()); |
| Response response = await waitResponse(request); |
| var isApplicable = |
| new EditIsPostfixCompletionApplicableResult.fromResponse(response); |
| if (!isApplicable.value) { |
| fail("Postfix completion not applicable at given location"); |
| } |
| request = new EditGetPostfixCompletionParams(testFile, key, offset) |
| .toRequest('1'); |
| response = await waitResponse(request); |
| var result = new EditGetPostfixCompletionResult.fromResponse(response); |
| change = result.change; |
| } |
| } |