blob: 338593bb4d13ac806c12e4ed96fb2e4c2916aeeb [file] [log] [blame]
// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:async';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/error/error.dart';
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/src/dart/analysis/driver.dart';
import 'package:analyzer/src/generated/engine.dart' show TimestampedData;
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer/src/generated/timestamped_data.dart';
import 'package:analyzer_plugin/channel/channel.dart';
import 'package:analyzer_plugin/plugin/plugin.dart';
import 'package:analyzer_plugin/protocol/protocol.dart';
import 'package:analyzer_plugin/protocol/protocol_generated.dart';
import 'package:analyzer_plugin/src/protocol/protocol_internal.dart';
import 'package:test/test.dart';
class MockAnalysisDriver implements AnalysisDriver {
@override
final Set<String> addedFiles = {};
@override
set priorityFiles(List<String> priorityPaths) {}
@override
void addFile(String path) {
addedFiles.add(path);
}
@override
dynamic noSuchMethod(Invocation invocation) {
return super.noSuchMethod(invocation);
}
}
class MockChannel implements PluginCommunicationChannel {
bool _closed = false;
void Function()? _onDone;
Function? _onError;
void Function(Notification)? _onNotification;
void Function(Request)? _onRequest;
List<Notification> sentNotifications = <Notification>[];
int idCounter = 0;
Map<String, Completer<Response>> completers = <String, Completer<Response>>{};
@override
void close() {
_closed = true;
}
@override
void listen(void Function(Request request)? onRequest,
{void Function()? onDone,
Function? onError,
Function(Notification)? onNotification}) {
_onDone = onDone;
_onError = onError;
_onNotification = onNotification;
_onRequest = onRequest;
}
void sendDone() {
if (_onDone != null) {
_onDone!();
}
}
void sendError(Object exception, StackTrace stackTrace) {
if (_onError != null) {
_onError!(exception, stackTrace);
}
}
@override
void sendNotification(Notification notification) {
if (_closed) {
throw StateError('Sent a notification to a closed channel');
}
if (_onNotification == null) {
fail('Unexpected invocation of sendNotification');
}
_onNotification!(notification);
}
Future<Response> sendRequest(RequestParams params) {
if (_onRequest == null) {
fail('Unexpected invocation of sendNotification');
}
var id = (idCounter++).toString();
var request = params.toRequest(id);
var completer = Completer<Response>();
completers[request.id] = completer;
_onRequest!(request);
return completer.future;
}
@override
void sendResponse(Response response) {
if (_closed) {
throw StateError('Sent a response to a closed channel');
}
var completer = completers.remove(response.id);
completer?.complete(response);
}
}
class MockResolvedUnitResult implements ResolvedUnitResult {
@override
final List<AnalysisError> errors;
@override
final LineInfo lineInfo;
@override
final String path;
MockResolvedUnitResult(
{List<AnalysisError>? errors, LineInfo? lineInfo, String? path})
: errors = errors ?? [],
lineInfo = lineInfo ?? LineInfo([0]),
path = path ?? '';
@override
dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}
class MockResourceProvider implements ResourceProvider {
@override
dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}
/// A concrete implementation of a server plugin that is suitable for testing.
class MockServerPlugin extends ServerPlugin {
MockServerPlugin(ResourceProvider resourceProvider) : super(resourceProvider);
@override
List<String> get fileGlobsToAnalyze => <String>['*.dart'];
@override
String get name => 'Test Plugin';
@override
String get version => '0.1.0';
@override
AnalysisDriverGeneric createAnalysisDriver(ContextRoot contextRoot) {
return MockAnalysisDriver();
}
}
class MockSource implements Source {
@override
TimestampedData<String> get contents => TimestampedData(0, '');
@override
String get encoding => '';
@override
String get fullName => '/pkg/lib/test.dart';
@override
bool get isInSystemLibrary => false;
@override
Source get librarySource => this;
@override
int get modificationStamp => 0;
@override
String get shortName => 'test.dart';
@override
Source get source => this;
@override
Uri get uri => Uri.parse('package:test/test.dart');
@override
UriKind get uriKind => UriKind.PACKAGE_URI;
@override
bool exists() => true;
}