OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library test.domain.completion; | 5 library test.domain.completion; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 | 8 |
9 import 'package:analysis_server/plugin/protocol/protocol.dart'; | 9 import 'package:analysis_server/plugin/protocol/protocol.dart'; |
10 import 'package:analysis_server/src/domain_completion.dart'; | 10 import 'package:analysis_server/src/domain_completion.dart'; |
11 import 'package:analysis_server/src/provisional/completion/completion_core.dart'
; | 11 import 'package:analysis_server/src/provisional/completion/completion_core.dart'
; |
12 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.
dart'; | 12 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.
dart'; |
13 import 'package:analysis_server/src/services/completion/dart/completion_manager.
dart'; | 13 import 'package:analysis_server/src/services/completion/dart/completion_manager.
dart'; |
14 import 'package:analysis_server/src/services/completion/dart/contribution_sorter
.dart'; | 14 import 'package:analysis_server/src/services/completion/dart/contribution_sorter
.dart'; |
15 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 15 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
16 import 'package:unittest/unittest.dart'; | 16 import 'package:unittest/unittest.dart'; |
17 | 17 |
18 import 'analysis_abstract.dart'; | 18 import 'analysis_abstract.dart'; |
19 import 'domain_completion_util.dart'; | 19 import 'domain_completion_util.dart'; |
| 20 import 'mocks.dart' show pumpEventQueue; |
20 import 'utils.dart'; | 21 import 'utils.dart'; |
21 | 22 |
22 main() { | 23 main() { |
23 initializeTestEnvironment(); | 24 initializeTestEnvironment(); |
24 defineReflectiveTests(CompletionDomainHandlerTest); | 25 defineReflectiveTests(CompletionDomainHandlerTest); |
25 defineReflectiveTests(_NoSearchEngine); | 26 defineReflectiveTests(_NoSearchEngine); |
26 } | 27 } |
27 | 28 |
28 @reflectiveTest | 29 @reflectiveTest |
29 class CompletionDomainHandlerTest extends AbstractCompletionDomainTest { | 30 class CompletionDomainHandlerTest extends AbstractCompletionDomainTest { |
(...skipping 16 matching lines...) Expand all Loading... |
46 '''); | 47 '''); |
47 return getSuggestions().then((_) { | 48 return getSuggestions().then((_) { |
48 expect(replacementOffset, equals(completionOffset)); | 49 expect(replacementOffset, equals(completionOffset)); |
49 expect(replacementLength, equals(0)); | 50 expect(replacementLength, equals(0)); |
50 assertHasResult(CompletionSuggestionKind.INVOCATION, 'Object'); | 51 assertHasResult(CompletionSuggestionKind.INVOCATION, 'Object'); |
51 assertHasResult(CompletionSuggestionKind.INVOCATION, 'HtmlElement'); | 52 assertHasResult(CompletionSuggestionKind.INVOCATION, 'HtmlElement'); |
52 assertNoResult('test'); | 53 assertNoResult('test'); |
53 }); | 54 }); |
54 } | 55 } |
55 | 56 |
| 57 test_imports_aborted_new_request() async { |
| 58 addTestFile(''' |
| 59 class foo { } |
| 60 c^'''); |
| 61 |
| 62 // Make a request for suggestions |
| 63 Request request = |
| 64 new CompletionGetSuggestionsParams(testFile, completionOffset) |
| 65 .toRequest('7'); |
| 66 Response response = handleSuccessfulRequest(request); |
| 67 var result1 = new CompletionGetSuggestionsResult.fromResponse(response); |
| 68 var completionId1 = result1.id; |
| 69 assertValidId(response.id); |
| 70 |
| 71 // Perform some analysis but assert that no suggestions have yet been made |
| 72 completionId = completionId1; |
| 73 await pumpEventQueue(25); |
| 74 expect(suggestionsDone, isFalse); |
| 75 expect(suggestions, hasLength(0)); |
| 76 |
| 77 // Make another request before the first request completes |
| 78 Request request2 = |
| 79 new CompletionGetSuggestionsParams(testFile, completionOffset) |
| 80 .toRequest('8'); |
| 81 Response response2 = handleSuccessfulRequest(request2); |
| 82 var result2 = new CompletionGetSuggestionsResult.fromResponse(response2); |
| 83 var completionId2 = result2.id; |
| 84 assertValidId(completionId2); |
| 85 |
| 86 // Wait for both sets of suggestions |
| 87 completionId = completionId2; |
| 88 await pumpEventQueue(); |
| 89 expect(allSuggestions[completionId1], hasLength(0)); |
| 90 expect(allSuggestions[completionId2], same(suggestions)); |
| 91 assertHasResult(CompletionSuggestionKind.KEYWORD, 'class', |
| 92 relevance: DART_RELEVANCE_HIGH); |
| 93 } |
| 94 |
| 95 test_imports_aborted_source_changed() async { |
| 96 addTestFile(''' |
| 97 class foo { } |
| 98 c^'''); |
| 99 |
| 100 // Make a request for suggestions |
| 101 Request request = |
| 102 new CompletionGetSuggestionsParams(testFile, completionOffset) |
| 103 .toRequest('0'); |
| 104 Response response = handleSuccessfulRequest(request); |
| 105 completionId = response.id; |
| 106 assertValidId(completionId); |
| 107 |
| 108 // Perform some analysis but assert that no suggestions have yet been made |
| 109 await pumpEventQueue(25); |
| 110 expect(suggestionsDone, isFalse); |
| 111 expect(suggestions, hasLength(0)); |
| 112 |
| 113 // Simulate user deleting text after request but before suggestions returned |
| 114 server.updateContent('uc1', {testFile: new AddContentOverlay(testCode)}); |
| 115 server.updateContent('uc2', { |
| 116 testFile: new ChangeContentOverlay( |
| 117 [new SourceEdit(completionOffset - 1, 1, '')]) |
| 118 }); |
| 119 |
| 120 // Expect the completion domain to discard request because source changed |
| 121 await pumpEventQueue().then((_) { |
| 122 expect(suggestionsDone, isTrue); |
| 123 }); |
| 124 expect(suggestions, hasLength(0)); |
| 125 } |
| 126 |
56 test_imports_incremental() async { | 127 test_imports_incremental() async { |
57 addTestFile('''library foo; | 128 addTestFile('''library foo; |
58 e^ | 129 e^ |
59 import "dart:async"; | 130 import "dart:async"; |
60 import "package:foo/foo.dart"; | 131 import "package:foo/foo.dart"; |
61 class foo { }'''); | 132 class foo { }'''); |
62 await waitForTasksFinished(); | 133 await waitForTasksFinished(); |
63 server.updateContent('uc1', {testFile: new AddContentOverlay(testCode)}); | 134 server.updateContent('uc1', {testFile: new AddContentOverlay(testCode)}); |
64 server.updateContent('uc2', { | 135 server.updateContent('uc2', { |
65 testFile: | 136 testFile: |
(...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
472 } | 543 } |
473 '''); | 544 '''); |
474 await waitForTasksFinished(); | 545 await waitForTasksFinished(); |
475 Request request = | 546 Request request = |
476 new CompletionGetSuggestionsParams(testFile, 0).toRequest('0'); | 547 new CompletionGetSuggestionsParams(testFile, 0).toRequest('0'); |
477 Response response = handler.handleRequest(request); | 548 Response response = handler.handleRequest(request); |
478 expect(response.error, isNotNull); | 549 expect(response.error, isNotNull); |
479 expect(response.error.code, RequestErrorCode.NO_INDEX_GENERATED); | 550 expect(response.error.code, RequestErrorCode.NO_INDEX_GENERATED); |
480 } | 551 } |
481 } | 552 } |
OLD | NEW |