| 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/analysis_server.dart'; | |
| 11 import 'package:analysis_server/src/channel/channel.dart'; | |
| 12 import 'package:analysis_server/src/context_manager.dart'; | |
| 13 import 'package:analysis_server/src/domain_analysis.dart'; | |
| 14 import 'package:analysis_server/src/domain_completion.dart'; | 10 import 'package:analysis_server/src/domain_completion.dart'; |
| 15 import 'package:analysis_server/src/plugin/server_plugin.dart'; | |
| 16 import 'package:analysis_server/src/provisional/completion/completion_core.dart' | 11 import 'package:analysis_server/src/provisional/completion/completion_core.dart' |
| 17 show AnalysisRequest, CompletionRequest, CompletionResult; | 12 show AnalysisRequest, CompletionRequest, CompletionResult; |
| 18 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.
dart'; | 13 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.
dart'; |
| 19 import 'package:analysis_server/src/services/completion/completion_manager.dart'
; | |
| 20 import 'package:analysis_server/src/services/completion/dart/completion_manager.
dart'; | 14 import 'package:analysis_server/src/services/completion/dart/completion_manager.
dart'; |
| 21 import 'package:analysis_server/src/services/completion/dart/contribution_sorter
.dart'; | 15 import 'package:analysis_server/src/services/completion/dart/contribution_sorter
.dart'; |
| 22 import 'package:analysis_server/src/services/index/index.dart' show Index; | |
| 23 import 'package:analysis_server/src/services/index/local_memory_index.dart'; | |
| 24 import 'package:analysis_server/src/services/search/search_engine.dart'; | |
| 25 import 'package:analyzer/file_system/file_system.dart'; | |
| 26 import 'package:analyzer/instrumentation/instrumentation.dart'; | |
| 27 import 'package:analyzer/source/pub_package_map_provider.dart'; | |
| 28 import 'package:analyzer/src/generated/engine.dart'; | |
| 29 import 'package:analyzer/src/generated/sdk.dart'; | |
| 30 import 'package:analyzer/src/generated/source.dart'; | |
| 31 import 'package:plugin/manager.dart'; | |
| 32 import 'package:plugin/plugin.dart'; | |
| 33 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 16 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
| 34 import 'package:unittest/unittest.dart'; | 17 import 'package:unittest/unittest.dart'; |
| 35 | 18 |
| 36 import 'analysis_abstract.dart'; | 19 import 'analysis_abstract.dart'; |
| 37 import 'domain_completion_util.dart'; | 20 import 'domain_completion_util.dart'; |
| 38 import 'mock_sdk.dart'; | |
| 39 import 'mocks.dart'; | |
| 40 import 'utils.dart'; | 21 import 'utils.dart'; |
| 41 | 22 |
| 42 main() { | 23 main() { |
| 43 initializeTestEnvironment(); | 24 initializeTestEnvironment(); |
| 44 defineReflectiveTests(CompletionManagerTest); | 25 defineReflectiveTests(CompletionDomainHandlerTest); |
| 45 defineReflectiveTests(CompletionTest); | |
| 46 defineReflectiveTests(_NoSearchEngine); | 26 defineReflectiveTests(_NoSearchEngine); |
| 47 } | 27 } |
| 48 | 28 |
| 49 @reflectiveTest | 29 @reflectiveTest |
| 50 class CompletionManagerTest extends AbstractAnalysisTest { | 30 class CompletionDomainHandlerTest extends AbstractCompletionDomainTest { |
| 51 AnalysisDomainHandler analysisDomain; | |
| 52 Test_CompletionDomainHandler completionDomain; | |
| 53 Request request; | |
| 54 int requestCount = 0; | |
| 55 String testFile2 = '/project/bin/test2.dart'; | |
| 56 | |
| 57 AnalysisServer createAnalysisServer(Index index) { | |
| 58 // | |
| 59 // Collect plugins | |
| 60 // | |
| 61 ServerPlugin serverPlugin = new ServerPlugin(); | |
| 62 List<Plugin> plugins = <Plugin>[]; | |
| 63 plugins.addAll(AnalysisEngine.instance.requiredPlugins); | |
| 64 plugins.add(serverPlugin); | |
| 65 addServerPlugins(plugins); | |
| 66 // | |
| 67 // Process plugins | |
| 68 // | |
| 69 ExtensionManager manager = new ExtensionManager(); | |
| 70 manager.processPlugins(plugins); | |
| 71 // | |
| 72 // Create the server | |
| 73 // | |
| 74 return new Test_AnalysisServer( | |
| 75 super.serverChannel, | |
| 76 super.resourceProvider, | |
| 77 super.packageMapProvider, | |
| 78 index, | |
| 79 serverPlugin, | |
| 80 new AnalysisServerOptions(), | |
| 81 new MockSdk(), | |
| 82 InstrumentationService.NULL_SERVICE); | |
| 83 } | |
| 84 | |
| 85 @override | |
| 86 Index createIndex() { | |
| 87 return createLocalMemoryIndex(); | |
| 88 } | |
| 89 | |
| 90 void sendRequest(String path) { | |
| 91 String id = (++requestCount).toString(); | |
| 92 request = new CompletionGetSuggestionsParams(path, 0).toRequest(id); | |
| 93 Response response = handler.handleRequest(request); | |
| 94 expect(response, isResponseSuccess(id)); | |
| 95 } | |
| 96 | |
| 97 @override | |
| 98 void setUp() { | |
| 99 super.setUp(); | |
| 100 createProject(); | |
| 101 analysisDomain = handler; | |
| 102 completionDomain = new Test_CompletionDomainHandler(server); | |
| 103 handler = completionDomain; | |
| 104 addTestFile('^library A; cl'); | |
| 105 addFile(testFile2, 'library B; cl'); | |
| 106 } | |
| 107 | |
| 108 void tearDown() { | |
| 109 super.tearDown(); | |
| 110 analysisDomain = null; | |
| 111 completionDomain = null; | |
| 112 } | |
| 113 | |
| 114 /** | |
| 115 * Assert different managers are used for different sources | |
| 116 */ | |
| 117 test_2_requests_different_sources() { | |
| 118 expect(completionDomain.manager, isNull); | |
| 119 sendRequest(testFile); | |
| 120 expect(completionDomain.manager, isNotNull); | |
| 121 MockCompletionManager expectedManager = completionDomain.manager; | |
| 122 expect(expectedManager.disposeCallCount, 0); | |
| 123 expect(completionDomain.mockContext.mockStream.listenCount, 1); | |
| 124 expect(completionDomain.mockContext.mockStream.cancelCount, 0); | |
| 125 return pumpEventQueue().then((_) { | |
| 126 expect(completionDomain.manager, expectedManager); | |
| 127 expect(completionDomain.mockManager.computeCallCount, 1); | |
| 128 sendRequest(testFile2); | |
| 129 expect(completionDomain.manager, isNotNull); | |
| 130 expect(completionDomain.manager, isNot(expectedManager)); | |
| 131 expect(expectedManager.disposeCallCount, 1); | |
| 132 expectedManager = completionDomain.manager; | |
| 133 expect(completionDomain.mockContext.mockStream.listenCount, 2); | |
| 134 expect(completionDomain.mockContext.mockStream.cancelCount, 1); | |
| 135 return pumpEventQueue(); | |
| 136 }).then((_) { | |
| 137 expect(completionDomain.manager, expectedManager); | |
| 138 expect(completionDomain.mockContext.mockStream.listenCount, 2); | |
| 139 expect(completionDomain.mockContext.mockStream.cancelCount, 1); | |
| 140 expect(completionDomain.mockManager.computeCallCount, 1); | |
| 141 }); | |
| 142 } | |
| 143 | |
| 144 /** | |
| 145 * Assert same manager is used for multiple requests on same source | |
| 146 */ | |
| 147 test_2_requests_same_source() { | |
| 148 expect(completionDomain.manager, isNull); | |
| 149 sendRequest(testFile); | |
| 150 expect(completionDomain.manager, isNotNull); | |
| 151 expect(completionDomain.manager.source, isNotNull); | |
| 152 CompletionManager expectedManager = completionDomain.manager; | |
| 153 expect(completionDomain.mockContext.mockStream.listenCount, 1); | |
| 154 expect(completionDomain.mockContext.mockStream.cancelCount, 0); | |
| 155 return pumpEventQueue().then((_) { | |
| 156 expect(completionDomain.manager, expectedManager); | |
| 157 expect(completionDomain.mockManager.computeCallCount, 1); | |
| 158 sendRequest(testFile); | |
| 159 expect(completionDomain.manager, expectedManager); | |
| 160 expect(completionDomain.mockContext.mockStream.listenCount, 1); | |
| 161 expect(completionDomain.mockContext.mockStream.cancelCount, 0); | |
| 162 return pumpEventQueue(); | |
| 163 }).then((_) { | |
| 164 expect(completionDomain.manager, expectedManager); | |
| 165 expect(completionDomain.mockContext.mockStream.listenCount, 1); | |
| 166 expect(completionDomain.mockContext.mockStream.cancelCount, 0); | |
| 167 expect(completionDomain.mockManager.computeCallCount, 2); | |
| 168 }); | |
| 169 } | |
| 170 | |
| 171 /** | |
| 172 * Assert manager is NOT cleared when context NOT associated with manager chan
ges. | |
| 173 */ | |
| 174 test_contextsChanged_different() { | |
| 175 sendRequest(testFile); | |
| 176 CompletionManager expectedManager; | |
| 177 return pumpEventQueue().then((_) { | |
| 178 expect(completionDomain.manager, isNotNull); | |
| 179 expectedManager = completionDomain.manager; | |
| 180 completionDomain.contextsChangedRaw( | |
| 181 new ContextsChangedEvent(changed: [new MockContext()])); | |
| 182 return pumpEventQueue(); | |
| 183 }).then((_) { | |
| 184 expect(completionDomain.manager, expectedManager); | |
| 185 }); | |
| 186 } | |
| 187 | |
| 188 /** | |
| 189 * Assert manager is cleared when context associated with manager changes. | |
| 190 */ | |
| 191 test_contextsChanged_same() { | |
| 192 sendRequest(testFile); | |
| 193 return pumpEventQueue().then((_) { | |
| 194 expect(completionDomain.manager, isNotNull); | |
| 195 completionDomain.contextsChangedRaw( | |
| 196 new ContextsChangedEvent(changed: [completionDomain.mockContext])); | |
| 197 return pumpEventQueue(); | |
| 198 }).then((_) { | |
| 199 expect(completionDomain.manager, isNull); | |
| 200 }); | |
| 201 } | |
| 202 | |
| 203 /** | |
| 204 * Assert manager is cleared when analysis roots are set | |
| 205 */ | |
| 206 test_setAnalysisRoots() { | |
| 207 sendRequest(testFile); | |
| 208 return pumpEventQueue().then((_) { | |
| 209 expect(completionDomain.manager, isNotNull); | |
| 210 request = new AnalysisSetAnalysisRootsParams([], []).toRequest('7'); | |
| 211 Response response = analysisDomain.handleRequest(request); | |
| 212 expect(response, isResponseSuccess('7')); | |
| 213 return pumpEventQueue(); | |
| 214 }).then((_) { | |
| 215 expect(completionDomain.manager, isNull); | |
| 216 }); | |
| 217 } | |
| 218 | |
| 219 /** | |
| 220 * Assert manager is cleared when source NOT associated with manager is change
d. | |
| 221 */ | |
| 222 test_sourcesChanged_different_source_changed() { | |
| 223 sendRequest(testFile); | |
| 224 return pumpEventQueue().then((_) { | |
| 225 expect(completionDomain.manager, isNotNull); | |
| 226 ContextSourcePair contextSource = server.getContextSourcePair(testFile2); | |
| 227 ChangeSet changeSet = new ChangeSet(); | |
| 228 changeSet.changedSource(contextSource.source); | |
| 229 completionDomain.sourcesChanged(new SourcesChangedEvent(changeSet)); | |
| 230 expect(completionDomain.manager, isNull); | |
| 231 }); | |
| 232 } | |
| 233 | |
| 234 /** | |
| 235 * Assert manager is NOT cleared when source associated with manager is change
d. | |
| 236 */ | |
| 237 test_sourcesChanged_same_source_changed() { | |
| 238 sendRequest(testFile); | |
| 239 return pumpEventQueue().then((_) { | |
| 240 expect(completionDomain.manager, isNotNull); | |
| 241 CompletionManager expectedManager = completionDomain.manager; | |
| 242 ChangeSet changeSet = new ChangeSet(); | |
| 243 changeSet.changedSource(completionDomain.manager.source); | |
| 244 completionDomain.sourcesChanged(new SourcesChangedEvent(changeSet)); | |
| 245 expect(completionDomain.manager, expectedManager); | |
| 246 }); | |
| 247 } | |
| 248 | |
| 249 /** | |
| 250 * Assert manager is cleared when source is deleted | |
| 251 */ | |
| 252 test_sourcesChanged_source_deleted() { | |
| 253 sendRequest(testFile); | |
| 254 return pumpEventQueue().then((_) { | |
| 255 expect(completionDomain.manager, isNotNull); | |
| 256 ChangeSet changeSet = new ChangeSet(); | |
| 257 changeSet.deletedSource(completionDomain.manager.source); | |
| 258 completionDomain.sourcesChanged(new SourcesChangedEvent(changeSet)); | |
| 259 expect(completionDomain.manager, isNull); | |
| 260 }); | |
| 261 } | |
| 262 | |
| 263 /** | |
| 264 * Assert manager is cleared when source is removed | |
| 265 */ | |
| 266 test_sourcesChanged_source_removed() { | |
| 267 sendRequest(testFile); | |
| 268 return pumpEventQueue().then((_) { | |
| 269 expect(completionDomain.manager, isNotNull); | |
| 270 ChangeSet changeSet = new ChangeSet(); | |
| 271 changeSet.removedSource(completionDomain.manager.source); | |
| 272 completionDomain.sourcesChanged(new SourcesChangedEvent(changeSet)); | |
| 273 expect(completionDomain.manager, isNull); | |
| 274 }); | |
| 275 } | |
| 276 } | |
| 277 | |
| 278 @reflectiveTest | |
| 279 class CompletionTest extends AbstractCompletionDomainTest { | |
| 280 test_html() { | 31 test_html() { |
| 281 testFile = '/project/web/test.html'; | 32 testFile = '/project/web/test.html'; |
| 282 addTestFile(''' | 33 addTestFile(''' |
| 283 <html>^</html> | 34 <html>^</html> |
| 284 '''); | 35 '''); |
| 285 return getSuggestions().then((_) { | 36 return getSuggestions().then((_) { |
| 286 expect(replacementOffset, equals(completionOffset)); | 37 expect(replacementOffset, equals(completionOffset)); |
| 287 expect(replacementLength, equals(0)); | 38 expect(replacementLength, equals(0)); |
| 288 expect(suggestions, hasLength(0)); | 39 expect(suggestions, hasLength(0)); |
| 289 }); | 40 }); |
| (...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 686 expect(replacementLength, equals(4)); | 437 expect(replacementLength, equals(4)); |
| 687 // Suggestions based upon imported elements are partially filtered | 438 // Suggestions based upon imported elements are partially filtered |
| 688 //assertHasResult(CompletionSuggestionKind.INVOCATION, 'Object'); | 439 //assertHasResult(CompletionSuggestionKind.INVOCATION, 'Object'); |
| 689 assertHasResult(CompletionSuggestionKind.INVOCATION, 'test', | 440 assertHasResult(CompletionSuggestionKind.INVOCATION, 'test', |
| 690 relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE); | 441 relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE); |
| 691 assertNoResult('HtmlElement'); | 442 assertNoResult('HtmlElement'); |
| 692 }); | 443 }); |
| 693 } | 444 } |
| 694 } | 445 } |
| 695 | 446 |
| 696 class MockCompletionManager implements CompletionManager { | |
| 697 final AnalysisContext context; | |
| 698 final Source source; | |
| 699 final SearchEngine searchEngine; | |
| 700 StreamController<CompletionResult> controller; | |
| 701 int computeCallCount = 0; | |
| 702 int disposeCallCount = 0; | |
| 703 | |
| 704 MockCompletionManager(this.context, this.source, this.searchEngine); | |
| 705 | |
| 706 @override | |
| 707 Future<bool> computeCache() { | |
| 708 return new Future.value(true); | |
| 709 } | |
| 710 | |
| 711 @override | |
| 712 void computeSuggestions(CompletionRequest request) { | |
| 713 ++computeCallCount; | |
| 714 CompletionResult result = new CompletionResultImpl(0, 0, [], true); | |
| 715 controller.add(result); | |
| 716 } | |
| 717 | |
| 718 @override | |
| 719 void dispose() { | |
| 720 ++disposeCallCount; | |
| 721 } | |
| 722 | |
| 723 @override | |
| 724 Stream<CompletionResult> results(CompletionRequest request) { | |
| 725 controller = new StreamController<CompletionResult>(onListen: () { | |
| 726 scheduleMicrotask(() { | |
| 727 computeSuggestions(request); | |
| 728 }); | |
| 729 }); | |
| 730 return controller.stream; | |
| 731 } | |
| 732 } | |
| 733 | |
| 734 /** | |
| 735 * Mock [AnaysisContext] for tracking usage of onSourcesChanged. | |
| 736 */ | |
| 737 class MockContext implements AnalysisContext { | |
| 738 static final SourceFactory DEFAULT_SOURCE_FACTORY = new SourceFactory([]); | |
| 739 | |
| 740 MockStream<SourcesChangedEvent> mockStream; | |
| 741 | |
| 742 SourceFactory sourceFactory = DEFAULT_SOURCE_FACTORY; | |
| 743 | |
| 744 MockContext() { | |
| 745 mockStream = new MockStream<SourcesChangedEvent>(); | |
| 746 } | |
| 747 | |
| 748 @override | |
| 749 Stream<SourcesChangedEvent> get onSourcesChanged => mockStream; | |
| 750 | |
| 751 @override | |
| 752 bool exists(Source source) { | |
| 753 return source != null && source.exists(); | |
| 754 } | |
| 755 | |
| 756 @override | |
| 757 TimestampedData<String> getContents(Source source) { | |
| 758 return source.contents; | |
| 759 } | |
| 760 | |
| 761 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); | |
| 762 } | |
| 763 | |
| 764 class MockRelevancySorter implements DartContributionSorter { | 447 class MockRelevancySorter implements DartContributionSorter { |
| 765 bool enabled = true; | 448 bool enabled = true; |
| 766 | 449 |
| 767 @override | 450 @override |
| 768 Future sort( | 451 Future sort( |
| 769 CompletionRequest request, Iterable<CompletionSuggestion> suggestions) { | 452 CompletionRequest request, Iterable<CompletionSuggestion> suggestions) { |
| 770 if (!enabled) { | 453 if (!enabled) { |
| 771 throw 'unexpected sort'; | 454 throw 'unexpected sort'; |
| 772 } | 455 } |
| 773 return new Future.value(); | 456 return new Future.value(); |
| 774 } | 457 } |
| 775 } | 458 } |
| 776 | 459 |
| 777 /** | |
| 778 * Mock stream for tracking calls to listen and subscription.cancel. | |
| 779 */ | |
| 780 class MockStream<E> implements Stream<E> { | |
| 781 MockSubscription<E> mockSubscription = new MockSubscription<E>(); | |
| 782 int listenCount = 0; | |
| 783 | |
| 784 int get cancelCount => mockSubscription.cancelCount; | |
| 785 | |
| 786 @override | |
| 787 StreamSubscription<E> listen(void onData(E event), | |
| 788 {Function onError, void onDone(), bool cancelOnError}) { | |
| 789 ++listenCount; | |
| 790 return mockSubscription; | |
| 791 } | |
| 792 | |
| 793 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); | |
| 794 } | |
| 795 | |
| 796 /** | |
| 797 * Mock subscription for tracking calls to subscription.cancel. | |
| 798 */ | |
| 799 class MockSubscription<E> implements StreamSubscription<E> { | |
| 800 int cancelCount = 0; | |
| 801 | |
| 802 Future cancel() { | |
| 803 ++cancelCount; | |
| 804 return new Future.value(true); | |
| 805 } | |
| 806 | |
| 807 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); | |
| 808 } | |
| 809 | |
| 810 class Test_AnalysisServer extends AnalysisServer { | |
| 811 final MockContext mockContext = new MockContext(); | |
| 812 | |
| 813 Test_AnalysisServer( | |
| 814 ServerCommunicationChannel channel, | |
| 815 ResourceProvider resourceProvider, | |
| 816 PubPackageMapProvider packageMapProvider, | |
| 817 Index index, | |
| 818 ServerPlugin serverPlugin, | |
| 819 AnalysisServerOptions analysisServerOptions, | |
| 820 DartSdk defaultSdk, | |
| 821 InstrumentationService instrumentationService) | |
| 822 : super( | |
| 823 channel, | |
| 824 resourceProvider, | |
| 825 packageMapProvider, | |
| 826 index, | |
| 827 serverPlugin, | |
| 828 analysisServerOptions, | |
| 829 defaultSdk, | |
| 830 instrumentationService); | |
| 831 | |
| 832 @override | |
| 833 AnalysisContext getAnalysisContext(String path) { | |
| 834 return mockContext; | |
| 835 } | |
| 836 | |
| 837 @override | |
| 838 ContextSourcePair getContextSourcePair(String path) { | |
| 839 ContextSourcePair pair = super.getContextSourcePair(path); | |
| 840 return new ContextSourcePair(mockContext, pair.source); | |
| 841 } | |
| 842 } | |
| 843 | |
| 844 /** | |
| 845 * A [CompletionDomainHandler] subclass that returns a mock completion manager | |
| 846 * so that the domain handler cache management can be tested. | |
| 847 */ | |
| 848 class Test_CompletionDomainHandler extends CompletionDomainHandler { | |
| 849 Test_CompletionDomainHandler(Test_AnalysisServer server) : super(server); | |
| 850 | |
| 851 MockContext get mockContext => (server as Test_AnalysisServer).mockContext; | |
| 852 | |
| 853 MockCompletionManager get mockManager => manager; | |
| 854 | |
| 855 void contextsChanged(ContextsChangedEvent event) { | |
| 856 contextsChangedRaw(new ContextsChangedEvent( | |
| 857 added: event.added.length > 0 ? [mockContext] : [], | |
| 858 changed: event.changed.length > 0 ? [mockContext] : [], | |
| 859 removed: event.removed.length > 0 ? [mockContext] : [])); | |
| 860 } | |
| 861 | |
| 862 void contextsChangedRaw(ContextsChangedEvent newEvent) { | |
| 863 super.contextsChanged(newEvent); | |
| 864 } | |
| 865 | |
| 866 CompletionManager createCompletionManager( | |
| 867 AnalysisServer server, AnalysisContext context, Source source) { | |
| 868 return new MockCompletionManager(mockContext, source, searchEngine); | |
| 869 } | |
| 870 } | |
| 871 | |
| 872 @reflectiveTest | 460 @reflectiveTest |
| 873 class _NoSearchEngine extends AbstractAnalysisTest { | 461 class _NoSearchEngine extends AbstractAnalysisTest { |
| 874 @override | 462 @override |
| 875 void setUp() { | 463 void setUp() { |
| 876 super.setUp(); | 464 super.setUp(); |
| 877 createProject(); | 465 createProject(); |
| 878 handler = new CompletionDomainHandler(server); | 466 handler = new CompletionDomainHandler(server); |
| 879 } | 467 } |
| 880 | 468 |
| 881 test_noSearchEngine() async { | 469 test_noSearchEngine() async { |
| 882 addTestFile(''' | 470 addTestFile(''' |
| 883 main() { | 471 main() { |
| 884 ^ | 472 ^ |
| 885 } | 473 } |
| 886 '''); | 474 '''); |
| 887 await waitForTasksFinished(); | 475 await waitForTasksFinished(); |
| 888 Request request = | 476 Request request = |
| 889 new CompletionGetSuggestionsParams(testFile, 0).toRequest('0'); | 477 new CompletionGetSuggestionsParams(testFile, 0).toRequest('0'); |
| 890 Response response = handler.handleRequest(request); | 478 Response response = handler.handleRequest(request); |
| 891 expect(response.error, isNotNull); | 479 expect(response.error, isNotNull); |
| 892 expect(response.error.code, RequestErrorCode.NO_INDEX_GENERATED); | 480 expect(response.error.code, RequestErrorCode.NO_INDEX_GENERATED); |
| 893 } | 481 } |
| 894 } | 482 } |
| OLD | NEW |