| 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 |