| Index: pkg/analysis_server/test/domain_completion_test.dart
|
| diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
|
| index 4658e4b73f12dfa9376160284a0a503b493f8b4f..0be9b83c4caf3691bbc9aa7465d1396f52411c91 100644
|
| --- a/pkg/analysis_server/test/domain_completion_test.dart
|
| +++ b/pkg/analysis_server/test/domain_completion_test.dart
|
| @@ -7,276 +7,27 @@ library test.domain.completion;
|
| import 'dart:async';
|
|
|
| import 'package:analysis_server/plugin/protocol/protocol.dart';
|
| -import 'package:analysis_server/src/analysis_server.dart';
|
| -import 'package:analysis_server/src/channel/channel.dart';
|
| -import 'package:analysis_server/src/context_manager.dart';
|
| -import 'package:analysis_server/src/domain_analysis.dart';
|
| import 'package:analysis_server/src/domain_completion.dart';
|
| -import 'package:analysis_server/src/plugin/server_plugin.dart';
|
| import 'package:analysis_server/src/provisional/completion/completion_core.dart'
|
| show AnalysisRequest, CompletionRequest, CompletionResult;
|
| import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
|
| -import 'package:analysis_server/src/services/completion/completion_manager.dart';
|
| import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
|
| import 'package:analysis_server/src/services/completion/dart/contribution_sorter.dart';
|
| -import 'package:analysis_server/src/services/index/index.dart' show Index;
|
| -import 'package:analysis_server/src/services/index/local_memory_index.dart';
|
| -import 'package:analysis_server/src/services/search/search_engine.dart';
|
| -import 'package:analyzer/file_system/file_system.dart';
|
| -import 'package:analyzer/instrumentation/instrumentation.dart';
|
| -import 'package:analyzer/source/pub_package_map_provider.dart';
|
| -import 'package:analyzer/src/generated/engine.dart';
|
| -import 'package:analyzer/src/generated/sdk.dart';
|
| -import 'package:analyzer/src/generated/source.dart';
|
| -import 'package:plugin/manager.dart';
|
| -import 'package:plugin/plugin.dart';
|
| import 'package:test_reflective_loader/test_reflective_loader.dart';
|
| import 'package:unittest/unittest.dart';
|
|
|
| import 'analysis_abstract.dart';
|
| import 'domain_completion_util.dart';
|
| -import 'mock_sdk.dart';
|
| -import 'mocks.dart';
|
| import 'utils.dart';
|
|
|
| main() {
|
| initializeTestEnvironment();
|
| - defineReflectiveTests(CompletionManagerTest);
|
| - defineReflectiveTests(CompletionTest);
|
| + defineReflectiveTests(CompletionDomainHandlerTest);
|
| defineReflectiveTests(_NoSearchEngine);
|
| }
|
|
|
| @reflectiveTest
|
| -class CompletionManagerTest extends AbstractAnalysisTest {
|
| - AnalysisDomainHandler analysisDomain;
|
| - Test_CompletionDomainHandler completionDomain;
|
| - Request request;
|
| - int requestCount = 0;
|
| - String testFile2 = '/project/bin/test2.dart';
|
| -
|
| - AnalysisServer createAnalysisServer(Index index) {
|
| - //
|
| - // Collect plugins
|
| - //
|
| - ServerPlugin serverPlugin = new ServerPlugin();
|
| - List<Plugin> plugins = <Plugin>[];
|
| - plugins.addAll(AnalysisEngine.instance.requiredPlugins);
|
| - plugins.add(serverPlugin);
|
| - addServerPlugins(plugins);
|
| - //
|
| - // Process plugins
|
| - //
|
| - ExtensionManager manager = new ExtensionManager();
|
| - manager.processPlugins(plugins);
|
| - //
|
| - // Create the server
|
| - //
|
| - return new Test_AnalysisServer(
|
| - super.serverChannel,
|
| - super.resourceProvider,
|
| - super.packageMapProvider,
|
| - index,
|
| - serverPlugin,
|
| - new AnalysisServerOptions(),
|
| - new MockSdk(),
|
| - InstrumentationService.NULL_SERVICE);
|
| - }
|
| -
|
| - @override
|
| - Index createIndex() {
|
| - return createLocalMemoryIndex();
|
| - }
|
| -
|
| - void sendRequest(String path) {
|
| - String id = (++requestCount).toString();
|
| - request = new CompletionGetSuggestionsParams(path, 0).toRequest(id);
|
| - Response response = handler.handleRequest(request);
|
| - expect(response, isResponseSuccess(id));
|
| - }
|
| -
|
| - @override
|
| - void setUp() {
|
| - super.setUp();
|
| - createProject();
|
| - analysisDomain = handler;
|
| - completionDomain = new Test_CompletionDomainHandler(server);
|
| - handler = completionDomain;
|
| - addTestFile('^library A; cl');
|
| - addFile(testFile2, 'library B; cl');
|
| - }
|
| -
|
| - void tearDown() {
|
| - super.tearDown();
|
| - analysisDomain = null;
|
| - completionDomain = null;
|
| - }
|
| -
|
| - /**
|
| - * Assert different managers are used for different sources
|
| - */
|
| - test_2_requests_different_sources() {
|
| - expect(completionDomain.manager, isNull);
|
| - sendRequest(testFile);
|
| - expect(completionDomain.manager, isNotNull);
|
| - MockCompletionManager expectedManager = completionDomain.manager;
|
| - expect(expectedManager.disposeCallCount, 0);
|
| - expect(completionDomain.mockContext.mockStream.listenCount, 1);
|
| - expect(completionDomain.mockContext.mockStream.cancelCount, 0);
|
| - return pumpEventQueue().then((_) {
|
| - expect(completionDomain.manager, expectedManager);
|
| - expect(completionDomain.mockManager.computeCallCount, 1);
|
| - sendRequest(testFile2);
|
| - expect(completionDomain.manager, isNotNull);
|
| - expect(completionDomain.manager, isNot(expectedManager));
|
| - expect(expectedManager.disposeCallCount, 1);
|
| - expectedManager = completionDomain.manager;
|
| - expect(completionDomain.mockContext.mockStream.listenCount, 2);
|
| - expect(completionDomain.mockContext.mockStream.cancelCount, 1);
|
| - return pumpEventQueue();
|
| - }).then((_) {
|
| - expect(completionDomain.manager, expectedManager);
|
| - expect(completionDomain.mockContext.mockStream.listenCount, 2);
|
| - expect(completionDomain.mockContext.mockStream.cancelCount, 1);
|
| - expect(completionDomain.mockManager.computeCallCount, 1);
|
| - });
|
| - }
|
| -
|
| - /**
|
| - * Assert same manager is used for multiple requests on same source
|
| - */
|
| - test_2_requests_same_source() {
|
| - expect(completionDomain.manager, isNull);
|
| - sendRequest(testFile);
|
| - expect(completionDomain.manager, isNotNull);
|
| - expect(completionDomain.manager.source, isNotNull);
|
| - CompletionManager expectedManager = completionDomain.manager;
|
| - expect(completionDomain.mockContext.mockStream.listenCount, 1);
|
| - expect(completionDomain.mockContext.mockStream.cancelCount, 0);
|
| - return pumpEventQueue().then((_) {
|
| - expect(completionDomain.manager, expectedManager);
|
| - expect(completionDomain.mockManager.computeCallCount, 1);
|
| - sendRequest(testFile);
|
| - expect(completionDomain.manager, expectedManager);
|
| - expect(completionDomain.mockContext.mockStream.listenCount, 1);
|
| - expect(completionDomain.mockContext.mockStream.cancelCount, 0);
|
| - return pumpEventQueue();
|
| - }).then((_) {
|
| - expect(completionDomain.manager, expectedManager);
|
| - expect(completionDomain.mockContext.mockStream.listenCount, 1);
|
| - expect(completionDomain.mockContext.mockStream.cancelCount, 0);
|
| - expect(completionDomain.mockManager.computeCallCount, 2);
|
| - });
|
| - }
|
| -
|
| - /**
|
| - * Assert manager is NOT cleared when context NOT associated with manager changes.
|
| - */
|
| - test_contextsChanged_different() {
|
| - sendRequest(testFile);
|
| - CompletionManager expectedManager;
|
| - return pumpEventQueue().then((_) {
|
| - expect(completionDomain.manager, isNotNull);
|
| - expectedManager = completionDomain.manager;
|
| - completionDomain.contextsChangedRaw(
|
| - new ContextsChangedEvent(changed: [new MockContext()]));
|
| - return pumpEventQueue();
|
| - }).then((_) {
|
| - expect(completionDomain.manager, expectedManager);
|
| - });
|
| - }
|
| -
|
| - /**
|
| - * Assert manager is cleared when context associated with manager changes.
|
| - */
|
| - test_contextsChanged_same() {
|
| - sendRequest(testFile);
|
| - return pumpEventQueue().then((_) {
|
| - expect(completionDomain.manager, isNotNull);
|
| - completionDomain.contextsChangedRaw(
|
| - new ContextsChangedEvent(changed: [completionDomain.mockContext]));
|
| - return pumpEventQueue();
|
| - }).then((_) {
|
| - expect(completionDomain.manager, isNull);
|
| - });
|
| - }
|
| -
|
| - /**
|
| - * Assert manager is cleared when analysis roots are set
|
| - */
|
| - test_setAnalysisRoots() {
|
| - sendRequest(testFile);
|
| - return pumpEventQueue().then((_) {
|
| - expect(completionDomain.manager, isNotNull);
|
| - request = new AnalysisSetAnalysisRootsParams([], []).toRequest('7');
|
| - Response response = analysisDomain.handleRequest(request);
|
| - expect(response, isResponseSuccess('7'));
|
| - return pumpEventQueue();
|
| - }).then((_) {
|
| - expect(completionDomain.manager, isNull);
|
| - });
|
| - }
|
| -
|
| - /**
|
| - * Assert manager is cleared when source NOT associated with manager is changed.
|
| - */
|
| - test_sourcesChanged_different_source_changed() {
|
| - sendRequest(testFile);
|
| - return pumpEventQueue().then((_) {
|
| - expect(completionDomain.manager, isNotNull);
|
| - ContextSourcePair contextSource = server.getContextSourcePair(testFile2);
|
| - ChangeSet changeSet = new ChangeSet();
|
| - changeSet.changedSource(contextSource.source);
|
| - completionDomain.sourcesChanged(new SourcesChangedEvent(changeSet));
|
| - expect(completionDomain.manager, isNull);
|
| - });
|
| - }
|
| -
|
| - /**
|
| - * Assert manager is NOT cleared when source associated with manager is changed.
|
| - */
|
| - test_sourcesChanged_same_source_changed() {
|
| - sendRequest(testFile);
|
| - return pumpEventQueue().then((_) {
|
| - expect(completionDomain.manager, isNotNull);
|
| - CompletionManager expectedManager = completionDomain.manager;
|
| - ChangeSet changeSet = new ChangeSet();
|
| - changeSet.changedSource(completionDomain.manager.source);
|
| - completionDomain.sourcesChanged(new SourcesChangedEvent(changeSet));
|
| - expect(completionDomain.manager, expectedManager);
|
| - });
|
| - }
|
| -
|
| - /**
|
| - * Assert manager is cleared when source is deleted
|
| - */
|
| - test_sourcesChanged_source_deleted() {
|
| - sendRequest(testFile);
|
| - return pumpEventQueue().then((_) {
|
| - expect(completionDomain.manager, isNotNull);
|
| - ChangeSet changeSet = new ChangeSet();
|
| - changeSet.deletedSource(completionDomain.manager.source);
|
| - completionDomain.sourcesChanged(new SourcesChangedEvent(changeSet));
|
| - expect(completionDomain.manager, isNull);
|
| - });
|
| - }
|
| -
|
| - /**
|
| - * Assert manager is cleared when source is removed
|
| - */
|
| - test_sourcesChanged_source_removed() {
|
| - sendRequest(testFile);
|
| - return pumpEventQueue().then((_) {
|
| - expect(completionDomain.manager, isNotNull);
|
| - ChangeSet changeSet = new ChangeSet();
|
| - changeSet.removedSource(completionDomain.manager.source);
|
| - completionDomain.sourcesChanged(new SourcesChangedEvent(changeSet));
|
| - expect(completionDomain.manager, isNull);
|
| - });
|
| - }
|
| -}
|
| -
|
| -@reflectiveTest
|
| -class CompletionTest extends AbstractCompletionDomainTest {
|
| +class CompletionDomainHandlerTest extends AbstractCompletionDomainTest {
|
| test_html() {
|
| testFile = '/project/web/test.html';
|
| addTestFile('''
|
| @@ -693,74 +444,6 @@ class B extends A {m() {^}}
|
| }
|
| }
|
|
|
| -class MockCompletionManager implements CompletionManager {
|
| - final AnalysisContext context;
|
| - final Source source;
|
| - final SearchEngine searchEngine;
|
| - StreamController<CompletionResult> controller;
|
| - int computeCallCount = 0;
|
| - int disposeCallCount = 0;
|
| -
|
| - MockCompletionManager(this.context, this.source, this.searchEngine);
|
| -
|
| - @override
|
| - Future<bool> computeCache() {
|
| - return new Future.value(true);
|
| - }
|
| -
|
| - @override
|
| - void computeSuggestions(CompletionRequest request) {
|
| - ++computeCallCount;
|
| - CompletionResult result = new CompletionResultImpl(0, 0, [], true);
|
| - controller.add(result);
|
| - }
|
| -
|
| - @override
|
| - void dispose() {
|
| - ++disposeCallCount;
|
| - }
|
| -
|
| - @override
|
| - Stream<CompletionResult> results(CompletionRequest request) {
|
| - controller = new StreamController<CompletionResult>(onListen: () {
|
| - scheduleMicrotask(() {
|
| - computeSuggestions(request);
|
| - });
|
| - });
|
| - return controller.stream;
|
| - }
|
| -}
|
| -
|
| -/**
|
| - * Mock [AnaysisContext] for tracking usage of onSourcesChanged.
|
| - */
|
| -class MockContext implements AnalysisContext {
|
| - static final SourceFactory DEFAULT_SOURCE_FACTORY = new SourceFactory([]);
|
| -
|
| - MockStream<SourcesChangedEvent> mockStream;
|
| -
|
| - SourceFactory sourceFactory = DEFAULT_SOURCE_FACTORY;
|
| -
|
| - MockContext() {
|
| - mockStream = new MockStream<SourcesChangedEvent>();
|
| - }
|
| -
|
| - @override
|
| - Stream<SourcesChangedEvent> get onSourcesChanged => mockStream;
|
| -
|
| - @override
|
| - bool exists(Source source) {
|
| - return source != null && source.exists();
|
| - }
|
| -
|
| - @override
|
| - TimestampedData<String> getContents(Source source) {
|
| - return source.contents;
|
| - }
|
| -
|
| - noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
|
| -}
|
| -
|
| class MockRelevancySorter implements DartContributionSorter {
|
| bool enabled = true;
|
|
|
| @@ -774,101 +457,6 @@ class MockRelevancySorter implements DartContributionSorter {
|
| }
|
| }
|
|
|
| -/**
|
| - * Mock stream for tracking calls to listen and subscription.cancel.
|
| - */
|
| -class MockStream<E> implements Stream<E> {
|
| - MockSubscription<E> mockSubscription = new MockSubscription<E>();
|
| - int listenCount = 0;
|
| -
|
| - int get cancelCount => mockSubscription.cancelCount;
|
| -
|
| - @override
|
| - StreamSubscription<E> listen(void onData(E event),
|
| - {Function onError, void onDone(), bool cancelOnError}) {
|
| - ++listenCount;
|
| - return mockSubscription;
|
| - }
|
| -
|
| - noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
|
| -}
|
| -
|
| -/**
|
| - * Mock subscription for tracking calls to subscription.cancel.
|
| - */
|
| -class MockSubscription<E> implements StreamSubscription<E> {
|
| - int cancelCount = 0;
|
| -
|
| - Future cancel() {
|
| - ++cancelCount;
|
| - return new Future.value(true);
|
| - }
|
| -
|
| - noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
|
| -}
|
| -
|
| -class Test_AnalysisServer extends AnalysisServer {
|
| - final MockContext mockContext = new MockContext();
|
| -
|
| - Test_AnalysisServer(
|
| - ServerCommunicationChannel channel,
|
| - ResourceProvider resourceProvider,
|
| - PubPackageMapProvider packageMapProvider,
|
| - Index index,
|
| - ServerPlugin serverPlugin,
|
| - AnalysisServerOptions analysisServerOptions,
|
| - DartSdk defaultSdk,
|
| - InstrumentationService instrumentationService)
|
| - : super(
|
| - channel,
|
| - resourceProvider,
|
| - packageMapProvider,
|
| - index,
|
| - serverPlugin,
|
| - analysisServerOptions,
|
| - defaultSdk,
|
| - instrumentationService);
|
| -
|
| - @override
|
| - AnalysisContext getAnalysisContext(String path) {
|
| - return mockContext;
|
| - }
|
| -
|
| - @override
|
| - ContextSourcePair getContextSourcePair(String path) {
|
| - ContextSourcePair pair = super.getContextSourcePair(path);
|
| - return new ContextSourcePair(mockContext, pair.source);
|
| - }
|
| -}
|
| -
|
| -/**
|
| - * A [CompletionDomainHandler] subclass that returns a mock completion manager
|
| - * so that the domain handler cache management can be tested.
|
| - */
|
| -class Test_CompletionDomainHandler extends CompletionDomainHandler {
|
| - Test_CompletionDomainHandler(Test_AnalysisServer server) : super(server);
|
| -
|
| - MockContext get mockContext => (server as Test_AnalysisServer).mockContext;
|
| -
|
| - MockCompletionManager get mockManager => manager;
|
| -
|
| - void contextsChanged(ContextsChangedEvent event) {
|
| - contextsChangedRaw(new ContextsChangedEvent(
|
| - added: event.added.length > 0 ? [mockContext] : [],
|
| - changed: event.changed.length > 0 ? [mockContext] : [],
|
| - removed: event.removed.length > 0 ? [mockContext] : []));
|
| - }
|
| -
|
| - void contextsChangedRaw(ContextsChangedEvent newEvent) {
|
| - super.contextsChanged(newEvent);
|
| - }
|
| -
|
| - CompletionManager createCompletionManager(
|
| - AnalysisServer server, AnalysisContext context, Source source) {
|
| - return new MockCompletionManager(mockContext, source, searchEngine);
|
| - }
|
| -}
|
| -
|
| @reflectiveTest
|
| class _NoSearchEngine extends AbstractAnalysisTest {
|
| @override
|
|
|