Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(244)

Side by Side Diff: pkg/analysis_server/test/domain_completion_test.dart

Issue 1538883003: remove internal streaming of results, remove obsolete test, cleanup unused code (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: merge Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « pkg/analysis_server/test/completion_test_support.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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 }
OLDNEW
« no previous file with comments | « pkg/analysis_server/test/completion_test_support.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698