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'; | 10 import 'package:analysis_server/src/analysis_server.dart'; |
11 import 'package:analysis_server/src/channel/channel.dart'; | 11 import 'package:analysis_server/src/channel/channel.dart'; |
12 import 'package:analysis_server/src/constants.dart'; | 12 import 'package:analysis_server/src/constants.dart'; |
13 import 'package:analysis_server/src/context_manager.dart'; | 13 import 'package:analysis_server/src/context_manager.dart'; |
14 import 'package:analysis_server/src/domain_analysis.dart'; | 14 import 'package:analysis_server/src/domain_analysis.dart'; |
15 import 'package:analysis_server/src/domain_completion.dart'; | 15 import 'package:analysis_server/src/domain_completion.dart'; |
16 import 'package:analysis_server/src/plugin/server_plugin.dart'; | 16 import 'package:analysis_server/src/plugin/server_plugin.dart'; |
17 import 'package:analysis_server/src/provisional/completion/completion_core.dart' | 17 import 'package:analysis_server/src/provisional/completion/completion_core.dart' |
18 show AnalysisRequest, CompletionRequest, CompletionResult; | 18 show AnalysisRequest, CompletionRequest, CompletionResult; |
19 import 'package:analysis_server/src/services/completion/completion_manager.dart'
; | 19 import 'package:analysis_server/src/services/completion/completion_manager.dart'
; |
20 import 'package:analysis_server/src/services/completion/contribution_sorter.dart
'; | 20 import 'package:analysis_server/src/services/completion/dart/contribution_sorter
.dart'; |
21 import 'package:analysis_server/src/services/completion/dart_completion_manager.
dart'; | 21 import 'package:analysis_server/src/services/completion/dart_completion_manager.
dart'; |
22 import 'package:analysis_server/src/services/index/index.dart' show Index; | 22 import 'package:analysis_server/src/services/index/index.dart' show Index; |
23 import 'package:analysis_server/src/services/index/local_memory_index.dart'; | 23 import 'package:analysis_server/src/services/index/local_memory_index.dart'; |
24 import 'package:analysis_server/src/services/search/search_engine.dart'; | 24 import 'package:analysis_server/src/services/search/search_engine.dart'; |
25 import 'package:analyzer/file_system/file_system.dart'; | 25 import 'package:analyzer/file_system/file_system.dart'; |
26 import 'package:analyzer/instrumentation/instrumentation.dart'; | 26 import 'package:analyzer/instrumentation/instrumentation.dart'; |
27 import 'package:analyzer/source/pub_package_map_provider.dart'; | 27 import 'package:analyzer/source/pub_package_map_provider.dart'; |
28 import 'package:analyzer/src/generated/engine.dart'; | 28 import 'package:analyzer/src/generated/engine.dart'; |
29 import 'package:analyzer/src/generated/sdk.dart'; | 29 import 'package:analyzer/src/generated/sdk.dart'; |
30 import 'package:analyzer/src/generated/source.dart'; | 30 import 'package:analyzer/src/generated/source.dart'; |
31 import 'package:analyzer/src/task/dart.dart'; | |
32 import 'package:analyzer/task/dart.dart'; | |
33 import 'package:analyzer/task/model.dart'; | |
34 import 'package:plugin/manager.dart'; | 31 import 'package:plugin/manager.dart'; |
35 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 32 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
36 import 'package:unittest/unittest.dart'; | 33 import 'package:unittest/unittest.dart'; |
37 | 34 |
38 import 'analysis_abstract.dart'; | 35 import 'analysis_abstract.dart'; |
39 import 'mock_sdk.dart'; | 36 import 'mock_sdk.dart'; |
40 import 'mocks.dart'; | 37 import 'mocks.dart'; |
41 import 'utils.dart'; | 38 import 'utils.dart'; |
42 | 39 |
43 main() { | 40 main() { |
(...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
611 return getSuggestions().then((_) { | 608 return getSuggestions().then((_) { |
612 expect(replacementOffset, equals(completionOffset)); | 609 expect(replacementOffset, equals(completionOffset)); |
613 expect(replacementLength, equals(0)); | 610 expect(replacementLength, equals(0)); |
614 assertHasResult(CompletionSuggestionKind.INVOCATION, 'Object'); | 611 assertHasResult(CompletionSuggestionKind.INVOCATION, 'Object'); |
615 assertHasResult(CompletionSuggestionKind.INVOCATION, 'HtmlElement'); | 612 assertHasResult(CompletionSuggestionKind.INVOCATION, 'HtmlElement'); |
616 assertHasResult(CompletionSuggestionKind.INVOCATION, 'A'); | 613 assertHasResult(CompletionSuggestionKind.INVOCATION, 'A'); |
617 assertNoResult('test'); | 614 assertNoResult('test'); |
618 }); | 615 }); |
619 } | 616 } |
620 | 617 |
621 test_relevancy_sorter_analysis() { | |
622 var originalSorter = DartCompletionManager.defaultContributionSorter; | |
623 | |
624 // Setup the mock sorter to request additional analysis | |
625 var mockSorter = new MockRelevancySorter(); | |
626 mockSorter.addTask(PARSED_UNIT); | |
627 mockSorter.addTask(LIBRARY_ELEMENT1); | |
628 mockSorter.addTask(RESOLVED_UNIT3); | |
629 mockSorter.addTask(RESOLVED_UNIT3); | |
630 | |
631 DartCompletionManager.defaultContributionSorter = mockSorter; | |
632 addTestFile('main() {Map m; m.^}'); | |
633 | |
634 return getSuggestions().then((_) { | |
635 DartCompletionManager.defaultContributionSorter = originalSorter; | |
636 mockSorter.enabled = false; | |
637 | |
638 // Assert that the analysis requests were processed | |
639 mockSorter.assertAnalysisRequestsProcessed(); | |
640 }); | |
641 } | |
642 | |
643 test_simple() { | 618 test_simple() { |
644 addTestFile(''' | 619 addTestFile(''' |
645 void main() { | 620 void main() { |
646 ^ | 621 ^ |
647 } | 622 } |
648 '''); | 623 '''); |
649 return getSuggestions().then((_) { | 624 return getSuggestions().then((_) { |
650 expect(replacementOffset, equals(completionOffset)); | 625 expect(replacementOffset, equals(completionOffset)); |
651 expect(replacementLength, equals(0)); | 626 expect(replacementLength, equals(0)); |
652 assertHasResult(CompletionSuggestionKind.INVOCATION, 'Object'); | 627 assertHasResult(CompletionSuggestionKind.INVOCATION, 'Object'); |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
738 } | 713 } |
739 | 714 |
740 @override | 715 @override |
741 TimestampedData<String> getContents(Source source) { | 716 TimestampedData<String> getContents(Source source) { |
742 return source.contents; | 717 return source.contents; |
743 } | 718 } |
744 | 719 |
745 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); | 720 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
746 } | 721 } |
747 | 722 |
748 class MockRelevancySorter implements ContributionSorter { | 723 class MockRelevancySorter implements DartContributionSorter { |
749 bool enabled = true; | 724 bool enabled = true; |
750 List<ResultDescriptor> descriptors = <ResultDescriptor>[]; | |
751 | |
752 void addTask(ResultDescriptor descriptor) { | |
753 descriptors.add(descriptor); | |
754 } | |
755 | |
756 void assertAnalysisRequestsProcessed() { | |
757 expect(descriptors, hasLength(0)); | |
758 } | |
759 | 725 |
760 @override | 726 @override |
761 AnalysisRequest sort( | 727 Future sort( |
762 CompletionRequest request, Iterable<CompletionSuggestion> suggestions) { | 728 CompletionRequest request, Iterable<CompletionSuggestion> suggestions) { |
763 if (!enabled) { | 729 if (!enabled) { |
764 throw 'unexpected sort'; | 730 throw 'unexpected sort'; |
765 } | 731 } |
766 return _nextAnalysisRequest(request); | 732 return new Future.value(); |
767 } | |
768 | |
769 AnalysisRequest _callback(CompletionRequest request, var value) { | |
770 expect(value, isNotNull); | |
771 return _nextAnalysisRequest(request); | |
772 } | |
773 | |
774 AnalysisRequest _nextAnalysisRequest(CompletionRequest request) { | |
775 if (descriptors.length == 0) { | |
776 return null; | |
777 } | |
778 return new AnalysisRequest( | |
779 request.source, descriptors.removeAt(0), _callback); | |
780 } | 733 } |
781 } | 734 } |
782 | 735 |
783 /** | 736 /** |
784 * Mock stream for tracking calls to listen and subscription.cancel. | 737 * Mock stream for tracking calls to listen and subscription.cancel. |
785 */ | 738 */ |
786 class MockStream<E> implements Stream<E> { | 739 class MockStream<E> implements Stream<E> { |
787 MockSubscription<E> mockSubscription = new MockSubscription<E>(); | 740 MockSubscription<E> mockSubscription = new MockSubscription<E>(); |
788 int listenCount = 0; | 741 int listenCount = 0; |
789 | 742 |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
891 } | 844 } |
892 '''); | 845 '''); |
893 await waitForTasksFinished(); | 846 await waitForTasksFinished(); |
894 Request request = | 847 Request request = |
895 new CompletionGetSuggestionsParams(testFile, 0).toRequest('0'); | 848 new CompletionGetSuggestionsParams(testFile, 0).toRequest('0'); |
896 Response response = handler.handleRequest(request); | 849 Response response = handler.handleRequest(request); |
897 expect(response.error, isNotNull); | 850 expect(response.error, isNotNull); |
898 expect(response.error.code, RequestErrorCode.NO_INDEX_GENERATED); | 851 expect(response.error.code, RequestErrorCode.NO_INDEX_GENERATED); |
899 } | 852 } |
900 } | 853 } |
OLD | NEW |