Index: pkg/analysis_server/test/mocks.dart |
diff --git a/pkg/analysis_server/test/mocks.dart b/pkg/analysis_server/test/mocks.dart |
index 1bb28d5a35c47ca0d12963f708702d05cbece4f0..003ea4c3ba61f6ec11d0daa1972a07c7b4510ab5 100644 |
--- a/pkg/analysis_server/test/mocks.dart |
+++ b/pkg/analysis_server/test/mocks.dart |
@@ -4,21 +4,20 @@ |
library mocks; |
-import 'dart:async'; |
-import 'dart:io'; |
- |
@MirrorsUsed(targets: 'mocks', override: '*') |
import 'dart:mirrors'; |
+import 'dart:async'; |
+import 'dart:io'; |
-import 'package:analysis_server/src/services/index/index.dart'; |
-import 'package:analyzer/file_system/file_system.dart' as resource; |
-import 'package:analyzer/file_system/memory_file_system.dart' as resource; |
import 'package:analysis_server/src/analysis_server.dart'; |
import 'package:analysis_server/src/channel/channel.dart'; |
-import 'package:analysis_server/src/operation/operation_analysis.dart'; |
import 'package:analysis_server/src/operation/operation.dart'; |
-import 'package:analyzer/source/package_map_provider.dart'; |
+import 'package:analysis_server/src/operation/operation_analysis.dart'; |
import 'package:analysis_server/src/protocol.dart' hide Element, ElementKind; |
+import 'package:analysis_server/src/services/index/index.dart'; |
+import 'package:analyzer/file_system/file_system.dart' as resource; |
+import 'package:analyzer/file_system/memory_file_system.dart' as resource; |
+import 'package:analyzer/source/package_map_provider.dart'; |
import 'package:analyzer/src/generated/element.dart'; |
import 'package:analyzer/src/generated/engine.dart'; |
import 'package:analyzer/src/generated/source.dart'; |
@@ -43,6 +42,19 @@ String get sdkPath { |
} |
/** |
+ * A [Matcher] that check that the given [Response] has an expected identifier |
+ * and has an error. The error code may optionally be checked. |
+ */ |
+Matcher isResponseFailure(String id, [RequestErrorCode code]) => |
+ new _IsResponseFailure(id, code); |
+ |
+/** |
+ * A [Matcher] that check that the given [Response] has an expected identifier |
+ * and no error. |
+ */ |
+Matcher isResponseSuccess(String id) => new _IsResponseSuccess(id); |
+ |
+/** |
* Returns a [Future] that completes after pumping the event queue [times] |
* times. By default, this should pump the event queue enough times to allow |
* any code to run, as long as it's not waiting on some external event. |
@@ -68,80 +80,180 @@ Future waitForServerOperationsPerformed(AnalysisServer server) { |
// Future.value or Future() constructors use scheduleMicrotask themselves and |
// would therefore not wait for microtask callbacks that are scheduled after |
// invoking this method. |
- return new Future.delayed(Duration.ZERO, |
+ return new Future.delayed( |
+ Duration.ZERO, |
() => waitForServerOperationsPerformed(server)); |
} |
-/** |
- * A mock [WebSocket] for testing. |
- */ |
-class MockSocket<T> implements WebSocket { |
- StreamController controller = new StreamController(); |
- MockSocket twin; |
- Stream stream; |
+typedef void MockServerOperationPerformFunction(AnalysisServer server); |
- factory MockSocket.pair() { |
- MockSocket socket1 = new MockSocket(); |
- MockSocket socket2 = new MockSocket(); |
- socket1.twin = socket2; |
- socket2.twin = socket1; |
- socket1.stream = socket2.controller.stream; |
- socket2.stream = socket1.controller.stream; |
- return socket1; |
- } |
+class MockAnalysisContext extends StringTypedMock implements AnalysisContext { |
+ MockAnalysisContext(String name) : super(name); |
+ noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
+} |
- MockSocket(); |
+class MockClassElement extends TypedMock implements ClassElement { |
+ final ElementKind kind = ElementKind.CLASS; |
+ noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
+} |
- void add(T text) => controller.add(text); |
- void allowMultipleListeners() { |
- stream = stream.asBroadcastStream(); |
- } |
+class MockCompilationUnitElement extends TypedMock implements |
+ CompilationUnitElement { |
+ final ElementKind kind = ElementKind.COMPILATION_UNIT; |
+ noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
+} |
- Future close([int code, String reason]) => controller.close() |
- .then((_) => twin.controller.close()); |
+class MockConstructorElement extends TypedMock implements ConstructorElement { |
+ final kind = ElementKind.CONSTRUCTOR; |
+ noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
+} |
- StreamSubscription<T> listen(void onData(T event), |
- { Function onError, void onDone(), bool cancelOnError}) => |
- stream.listen(onData, onError: onError, onDone: onDone, |
- cancelOnError: cancelOnError); |
- Stream<T> where(bool test(T)) => stream.where(test); |
+class MockElement extends StringTypedMock implements Element { |
+ MockElement([String name = '<element>']) : super(name); |
+ |
+ @override |
+ String get displayName => _toString; |
+ |
+ @override |
+ String get name => _toString; |
noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
} |
-class NoResponseException implements Exception { |
+class MockFieldElement extends TypedMock implements FieldElement { |
+ final ElementKind kind = ElementKind.FIELD; |
+ noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
+} |
+ |
+ |
+class MockFunctionElement extends TypedMock implements FunctionElement { |
+ final ElementKind kind = ElementKind.FUNCTION; |
+ noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
+} |
+ |
+ |
+class MockFunctionTypeAliasElement extends TypedMock implements |
+ FunctionTypeAliasElement { |
+ final ElementKind kind = ElementKind.FUNCTION_TYPE_ALIAS; |
+ noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
+} |
+ |
+ |
+class MockHtmlElement extends TypedMock implements HtmlElement { |
+ final ElementKind kind = ElementKind.HTML; |
+ noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
+} |
+ |
+ |
+class MockImportElement extends TypedMock implements ImportElement { |
+ final ElementKind kind = ElementKind.IMPORT; |
+ noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
+} |
+ |
+ |
+class MockLibraryElement extends TypedMock implements LibraryElement { |
+ final ElementKind kind = ElementKind.LIBRARY; |
+ noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
+} |
+ |
+ |
+class MockLocalVariableElement extends TypedMock implements LocalVariableElement |
+ { |
+ final ElementKind kind = ElementKind.LOCAL_VARIABLE; |
+ noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
+} |
+ |
+ |
+class MockLogger extends TypedMock implements Logger { |
+ noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
+} |
+ |
+ |
+class MockMethodElement extends StringTypedMock implements MethodElement { |
+ final kind = ElementKind.METHOD; |
+ MockMethodElement([String name = 'method']) : super(name); |
+ noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
+} |
+ |
+ |
+/** |
+ * A mock [PackageMapProvider]. |
+ */ |
+class MockPackageMapProvider implements PackageMapProvider { |
/** |
- * The request that was not responded to. |
+ * Package map that will be returned by the next call to [computePackageMap]. |
*/ |
- final Request request; |
+ Map<String, List<resource.Folder>> packageMap = <String, |
+ List<resource.Folder>>{}; |
- NoResponseException(this.request); |
+ /** |
+ * Package maps that will be returned by the next call to [computePackageMap]. |
+ */ |
+ Map<String, Map<String, List<resource.Folder>>> packageMaps = null; |
- String toString() { |
- return "NoResponseException after request ${request.toJson()}"; |
+ /** |
+ * Dependency list that will be returned by the next call to [computePackageMap]. |
+ */ |
+ Set<String> dependencies = new Set<String>(); |
+ |
+ @override |
+ PackageMapInfo computePackageMap(resource.Folder folder) { |
+ if (packageMaps != null) { |
+ return new PackageMapInfo(packageMaps[folder.path], dependencies); |
+ } |
+ return new PackageMapInfo(packageMap, dependencies); |
} |
} |
+ |
+class MockParameterElement extends TypedMock implements ParameterElement { |
+ final ElementKind kind = ElementKind.PARAMETER; |
+ noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
+} |
+ |
+ |
+class MockPropertyAccessorElement extends TypedMock implements |
+ PropertyAccessorElement { |
+ final ElementKind kind; |
+ MockPropertyAccessorElement(this.kind); |
+ noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
+} |
+ |
+ |
/** |
* A mock [ServerCommunicationChannel] for testing [AnalysisServer]. |
*/ |
class MockServerChannel implements ServerCommunicationChannel { |
StreamController<Request> requestController = new StreamController<Request>(); |
- StreamController<Response> responseController = new StreamController<Response>.broadcast(); |
- StreamController<Notification> notificationController = new StreamController<Notification>(sync: true); |
+ StreamController<Response> responseController = |
+ new StreamController<Response>.broadcast(); |
+ StreamController<Notification> notificationController = |
+ new StreamController<Notification>(sync: true); |
List<Response> responsesReceived = []; |
List<Notification> notificationsReceived = []; |
bool _closed = false; |
- MockServerChannel() { |
+ MockServerChannel(); |
+ @override |
+ void close() { |
+ _closed = true; |
+ } |
+ |
+ void expectMsgCount({responseCount: 0, notificationCount: 0}) { |
+ expect(responsesReceived, hasLength(responseCount)); |
+ expect(notificationsReceived, hasLength(notificationCount)); |
} |
@override |
- void listen(void onRequest(Request request), {Function onError, void onDone()}) { |
- requestController.stream.listen(onRequest, onError: onError, onDone: onDone); |
+ void listen(void onRequest(Request request), {Function onError, void |
+ onDone()}) { |
+ requestController.stream.listen( |
+ onRequest, |
+ onError: onError, |
+ onDone: onDone); |
} |
@override |
@@ -181,11 +293,6 @@ class MockServerChannel implements ServerCommunicationChannel { |
new Future(() => responseController.add(response)); |
} |
- void expectMsgCount({responseCount: 0, notificationCount: 0}) { |
- expect(responsesReceived, hasLength(responseCount)); |
- expect(notificationsReceived, hasLength(notificationCount)); |
- } |
- |
Future<Response> waitForResponse(Request request) { |
String id = request.id; |
pumpEventQueue().then((_) { |
@@ -198,14 +305,8 @@ class MockServerChannel implements ServerCommunicationChannel { |
// return response.id == id; |
// }); |
} |
- |
- @override |
- void close() { |
- _closed = true; |
- } |
} |
-typedef void MockServerOperationPerformFunction(AnalysisServer server); |
/** |
* A mock [ServerOperation] for testing [AnalysisServer]. |
@@ -217,15 +318,15 @@ class MockServerOperation implements PerformAnalysisOperation { |
MockServerOperation(this.priority, this._perform); |
@override |
- void perform(AnalysisServer server) => this._perform(server); |
- |
- @override |
AnalysisContext get context => null; |
@override |
bool get isContinue => false; |
@override |
+ void perform(AnalysisServer server) => this._perform(server); |
+ |
+ @override |
void sendNotices(AnalysisServer server, List<ChangeNotice> notices) { |
} |
@@ -236,58 +337,98 @@ class MockServerOperation implements PerformAnalysisOperation { |
/** |
- * A [Matcher] that check that the given [Response] has an expected identifier |
- * and no error. |
+ * A mock [WebSocket] for testing. |
*/ |
-Matcher isResponseSuccess(String id) => new _IsResponseSuccess(id); |
+class MockSocket<T> implements WebSocket { |
+ StreamController controller = new StreamController(); |
+ MockSocket twin; |
+ Stream stream; |
-/** |
- * A [Matcher] that check that there are no `error` in a given [Response]. |
- */ |
-class _IsResponseSuccess extends Matcher { |
- final String _id; |
+ MockSocket(); |
- _IsResponseSuccess(this._id); |
+ factory MockSocket.pair() { |
+ MockSocket socket1 = new MockSocket(); |
+ MockSocket socket2 = new MockSocket(); |
+ socket1.twin = socket2; |
+ socket2.twin = socket1; |
+ socket1.stream = socket2.controller.stream; |
+ socket2.stream = socket1.controller.stream; |
+ return socket1; |
+ } |
- @override |
- Description describe(Description description) { |
- return description.addDescriptionOf( |
- 'response with identifier "$_id" and without error'); |
+ void add(T text) => controller.add(text); |
+ |
+ void allowMultipleListeners() { |
+ stream = stream.asBroadcastStream(); |
} |
- @override |
- bool matches(item, Map matchState) { |
- Response response = item; |
- return response != null && response.id == _id && response.error == null; |
+ Future close([int code, String reason]) => |
+ controller.close().then((_) => twin.controller.close()); |
+ |
+ StreamSubscription<T> listen(void onData(T event), {Function onError, void |
+ onDone(), bool cancelOnError}) => |
+ stream.listen( |
+ onData, |
+ onError: onError, |
+ onDone: onDone, |
+ cancelOnError: cancelOnError); |
+ |
+ noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
+ |
+ Stream<T> where(bool test(T)) => stream.where(test); |
+} |
+ |
+ |
+class MockSource extends StringTypedMock implements Source { |
+ MockSource([String name = 'mocked.dart']) : super(name); |
+ noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
+} |
+ |
+ |
+class MockTopLevelVariableElement extends TypedMock implements |
+ TopLevelVariableElement { |
+ final ElementKind kind = ElementKind.TOP_LEVEL_VARIABLE; |
+ noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
+} |
+ |
+ |
+class MockTypeParameterElement extends TypedMock implements TypeParameterElement |
+ { |
+ final ElementKind kind = ElementKind.TYPE_PARAMETER; |
+ noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
+} |
+ |
+ |
+class NoResponseException implements Exception { |
+ /** |
+ * The request that was not responded to. |
+ */ |
+ final Request request; |
+ |
+ NoResponseException(this.request); |
+ |
+ String toString() { |
+ return "NoResponseException after request ${request.toJson()}"; |
} |
+} |
+ |
+ |
+class StringTypedMock extends TypedMock { |
+ String _toString; |
+ |
+ StringTypedMock(this._toString); |
@override |
- Description describeMismatch(item, Description mismatchDescription, |
- Map matchState, bool verbose) { |
- Response response = item; |
- if (response == null) { |
- mismatchDescription.add('is null response'); |
- } else { |
- var id = response.id; |
- RequestError error = response.error; |
- mismatchDescription.add('has identifier "$id"'); |
- if (error != null) { |
- mismatchDescription.add(' and has error $error'); |
- } |
+ String toString() { |
+ if (_toString != null) { |
+ return _toString; |
} |
- return mismatchDescription; |
+ return super.toString(); |
} |
} |
/** |
- * A [Matcher] that check that the given [Response] has an expected identifier |
- * and has an error. The error code may optionally be checked. |
- */ |
-Matcher isResponseFailure(String id, [RequestErrorCode code]) => |
- new _IsResponseFailure(id, code); |
- |
-/** |
* A [Matcher] that check that there are no `error` in a given [Response]. |
*/ |
class _IsResponseFailure extends Matcher { |
@@ -298,8 +439,8 @@ class _IsResponseFailure extends Matcher { |
@override |
Description describe(Description description) { |
- description = description.add( |
- 'response with identifier "$_id" and an error'); |
+ description = |
+ description.add('response with identifier "$_id" and an error'); |
if (_code != null) { |
description = description.add(' with code ${this._code.name}'); |
} |
@@ -307,20 +448,8 @@ class _IsResponseFailure extends Matcher { |
} |
@override |
- bool matches(item, Map matchState) { |
- Response response = item; |
- if (response.id != _id || response.error == null) { |
- return false; |
- } |
- if (_code != null && response.error.code != _code) { |
- return false; |
- } |
- return true; |
- } |
- |
- @override |
Description describeMismatch(item, Description mismatchDescription, |
- Map matchState, bool verbose) { |
+ Map matchState, bool verbose) { |
Response response = item; |
var id = response.id; |
RequestError error = response.error; |
@@ -328,180 +457,60 @@ class _IsResponseFailure extends Matcher { |
if (error == null) { |
mismatchDescription.add(' and has no error'); |
} else { |
- mismatchDescription.add(' and has error code ${response.error.code.name}'); |
+ mismatchDescription.add( |
+ ' and has error code ${response.error.code.name}'); |
} |
return mismatchDescription; |
} |
-} |
- |
- |
-/** |
- * A mock [PackageMapProvider]. |
- */ |
-class MockPackageMapProvider implements PackageMapProvider { |
- /** |
- * Package map that will be returned by the next call to [computePackageMap]. |
- */ |
- Map<String, List<resource.Folder>> packageMap = <String, List<resource.Folder>>{}; |
- |
- /** |
- * Package maps that will be returned by the next call to [computePackageMap]. |
- */ |
- Map<String, Map<String, List<resource.Folder>>> packageMaps = null; |
- |
- /** |
- * Dependency list that will be returned by the next call to [computePackageMap]. |
- */ |
- Set<String> dependencies = new Set<String>(); |
@override |
- PackageMapInfo computePackageMap(resource.Folder folder) { |
- if (packageMaps != null) { |
- return new PackageMapInfo(packageMaps[folder.path], dependencies); |
+ bool matches(item, Map matchState) { |
+ Response response = item; |
+ if (response.id != _id || response.error == null) { |
+ return false; |
} |
- return new PackageMapInfo(packageMap, dependencies); |
+ if (_code != null && response.error.code != _code) { |
+ return false; |
+ } |
+ return true; |
} |
} |
-class MockAnalysisContext extends StringTypedMock implements AnalysisContext { |
- MockAnalysisContext(String name) : super(name); |
- noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
-} |
- |
- |
-class MockClassElement extends TypedMock implements ClassElement { |
- final ElementKind kind = ElementKind.CLASS; |
- noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
-} |
- |
- |
-class MockCompilationUnitElement extends TypedMock implements |
- CompilationUnitElement { |
- final ElementKind kind = ElementKind.COMPILATION_UNIT; |
- noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
-} |
- |
- |
-class MockConstructorElement extends TypedMock implements ConstructorElement { |
- final kind = ElementKind.CONSTRUCTOR; |
- noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
-} |
- |
+/** |
+ * A [Matcher] that check that there are no `error` in a given [Response]. |
+ */ |
+class _IsResponseSuccess extends Matcher { |
+ final String _id; |
-class MockElement extends StringTypedMock implements Element { |
- MockElement([String name = '<element>']) : super(name); |
+ _IsResponseSuccess(this._id); |
@override |
- String get displayName => _toString; |
+ Description describe(Description description) { |
+ return description.addDescriptionOf( |
+ 'response with identifier "$_id" and without error'); |
+ } |
@override |
- String get name => _toString; |
- |
- noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
-} |
- |
- |
-class MockFieldElement extends TypedMock implements FieldElement { |
- final ElementKind kind = ElementKind.FIELD; |
- noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
-} |
- |
- |
-class MockFunctionElement extends TypedMock implements FunctionElement { |
- final ElementKind kind = ElementKind.FUNCTION; |
- noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
-} |
- |
- |
-class MockFunctionTypeAliasElement extends TypedMock implements |
- FunctionTypeAliasElement { |
- final ElementKind kind = ElementKind.FUNCTION_TYPE_ALIAS; |
- noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
-} |
- |
- |
-class MockHtmlElement extends TypedMock implements HtmlElement { |
- final ElementKind kind = ElementKind.HTML; |
- noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
-} |
- |
- |
-class MockImportElement extends TypedMock implements ImportElement { |
- final ElementKind kind = ElementKind.IMPORT; |
- noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
-} |
- |
- |
-class MockLibraryElement extends TypedMock implements LibraryElement { |
- final ElementKind kind = ElementKind.LIBRARY; |
- noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
-} |
- |
- |
-class MockLocalVariableElement extends TypedMock implements LocalVariableElement |
- { |
- final ElementKind kind = ElementKind.LOCAL_VARIABLE; |
- noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
-} |
- |
- |
-class MockLogger extends TypedMock implements Logger { |
- noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
-} |
- |
- |
-class MockMethodElement extends StringTypedMock implements MethodElement { |
- final kind = ElementKind.METHOD; |
- MockMethodElement([String name = 'method']) : super(name); |
- noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
-} |
- |
- |
-class MockParameterElement extends TypedMock implements ParameterElement { |
- final ElementKind kind = ElementKind.PARAMETER; |
- noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
-} |
- |
- |
-class MockPropertyAccessorElement extends TypedMock implements |
- PropertyAccessorElement { |
- final ElementKind kind; |
- MockPropertyAccessorElement(this.kind); |
- noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
-} |
- |
- |
-class MockSource extends StringTypedMock implements Source { |
- MockSource([String name = 'mocked.dart']) : super(name); |
- noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
-} |
- |
- |
-class MockTopLevelVariableElement extends TypedMock implements |
- TopLevelVariableElement { |
- final ElementKind kind = ElementKind.TOP_LEVEL_VARIABLE; |
- noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
-} |
- |
- |
-class MockTypeParameterElement extends TypedMock implements TypeParameterElement |
- { |
- final ElementKind kind = ElementKind.TYPE_PARAMETER; |
- noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
-} |
- |
- |
-class StringTypedMock extends TypedMock { |
- String _toString; |
- |
- StringTypedMock(this._toString); |
+ Description describeMismatch(item, Description mismatchDescription, |
+ Map matchState, bool verbose) { |
+ Response response = item; |
+ if (response == null) { |
+ mismatchDescription.add('is null response'); |
+ } else { |
+ var id = response.id; |
+ RequestError error = response.error; |
+ mismatchDescription.add('has identifier "$id"'); |
+ if (error != null) { |
+ mismatchDescription.add(' and has error $error'); |
+ } |
+ } |
+ return mismatchDescription; |
+ } |
@override |
- String toString() { |
- if (_toString != null) { |
- return _toString; |
- } |
- return super.toString(); |
+ bool matches(item, Map matchState) { |
+ Response response = item; |
+ return response != null && response.id == _id && response.error == null; |
} |
} |