Unverified Commit 14af5bbe authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

Revert "Add finders for enableFlutterDriverExtension (#64308)" (#65273)

This reverts commit db4dda20.
parent db4dda20
...@@ -33,11 +33,11 @@ class GetDiagnosticsTree extends CommandWithTarget { ...@@ -33,11 +33,11 @@ class GetDiagnosticsTree extends CommandWithTarget {
super(finder, timeout: timeout); super(finder, timeout: timeout);
/// Deserializes this command from the value generated by [serialize]. /// Deserializes this command from the value generated by [serialize].
GetDiagnosticsTree.deserialize(Map<String, String> json, DeserializeFinderFactory finderFactory) GetDiagnosticsTree.deserialize(Map<String, String> json)
: subtreeDepth = int.parse(json['subtreeDepth']), : subtreeDepth = int.parse(json['subtreeDepth']),
includeProperties = json['includeProperties'] == 'true', includeProperties = json['includeProperties'] == 'true',
diagnosticsType = _diagnosticsTypeIndex.lookupBySimpleName(json['diagnosticsType']), diagnosticsType = _diagnosticsTypeIndex.lookupBySimpleName(json['diagnosticsType']),
super.deserialize(json, finderFactory); super.deserialize(json);
/// How many levels of children to include in the JSON result. /// How many levels of children to include in the JSON result.
/// ///
......
...@@ -9,25 +9,6 @@ import 'package:meta/meta.dart'; ...@@ -9,25 +9,6 @@ import 'package:meta/meta.dart';
import 'error.dart'; import 'error.dart';
import 'message.dart'; import 'message.dart';
/// A factory for deserializing [Finder]s.
mixin DeserializeFinderFactory {
/// Deserializes the finder from JSON generated by [SerializableFinder.serialize].
SerializableFinder deserializeFinder(Map<String, String> json) {
final String finderType = json['finderType'];
switch (finderType) {
case 'ByType': return ByType.deserialize(json);
case 'ByValueKey': return ByValueKey.deserialize(json);
case 'ByTooltipMessage': return ByTooltipMessage.deserialize(json);
case 'BySemanticsLabel': return BySemanticsLabel.deserialize(json);
case 'ByText': return ByText.deserialize(json);
case 'PageBack': return const PageBack();
case 'Descendant': return Descendant.deserialize(json, this);
case 'Ancestor': return Ancestor.deserialize(json, this);
}
throw DriverError('Unsupported search specification type $finderType');
}
}
const List<Type> _supportedKeyValueTypes = <Type>[String, int]; const List<Type> _supportedKeyValueTypes = <Type>[String, int];
DriverError _createInvalidKeyValueTypeError(String invalidType) { DriverError _createInvalidKeyValueTypeError(String invalidType) {
...@@ -47,8 +28,8 @@ abstract class CommandWithTarget extends Command { ...@@ -47,8 +28,8 @@ abstract class CommandWithTarget extends Command {
} }
/// Deserializes this command from the value generated by [serialize]. /// Deserializes this command from the value generated by [serialize].
CommandWithTarget.deserialize(Map<String, String> json, DeserializeFinderFactory finderFactory) CommandWithTarget.deserialize(Map<String, String> json)
: finder = finderFactory.deserializeFinder(json), : finder = SerializableFinder.deserialize(json),
super.deserialize(json); super.deserialize(json);
/// Locates the object or objects targeted by this command. /// Locates the object or objects targeted by this command.
...@@ -77,7 +58,7 @@ class WaitFor extends CommandWithTarget { ...@@ -77,7 +58,7 @@ class WaitFor extends CommandWithTarget {
: super(finder, timeout: timeout); : super(finder, timeout: timeout);
/// Deserializes this command from the value generated by [serialize]. /// Deserializes this command from the value generated by [serialize].
WaitFor.deserialize(Map<String, String> json, DeserializeFinderFactory finderFactory) : super.deserialize(json, finderFactory); WaitFor.deserialize(Map<String, String> json) : super.deserialize(json);
@override @override
String get kind => 'waitFor'; String get kind => 'waitFor';
...@@ -107,7 +88,7 @@ class WaitForAbsent extends CommandWithTarget { ...@@ -107,7 +88,7 @@ class WaitForAbsent extends CommandWithTarget {
: super(finder, timeout: timeout); : super(finder, timeout: timeout);
/// Deserializes this command from the value generated by [serialize]. /// Deserializes this command from the value generated by [serialize].
WaitForAbsent.deserialize(Map<String, String> json, DeserializeFinderFactory finderFactory) : super.deserialize(json, finderFactory); WaitForAbsent.deserialize(Map<String, String> json) : super.deserialize(json);
@override @override
String get kind => 'waitForAbsent'; String get kind => 'waitForAbsent';
...@@ -145,6 +126,22 @@ abstract class SerializableFinder { ...@@ -145,6 +126,22 @@ abstract class SerializableFinder {
Map<String, String> serialize() => <String, String>{ Map<String, String> serialize() => <String, String>{
'finderType': finderType, 'finderType': finderType,
}; };
/// Deserializes a finder from JSON generated by [serialize].
static SerializableFinder deserialize(Map<String, String> json) {
final String finderType = json['finderType'];
switch (finderType) {
case 'ByType': return ByType.deserialize(json);
case 'ByValueKey': return ByValueKey.deserialize(json);
case 'ByTooltipMessage': return ByTooltipMessage.deserialize(json);
case 'BySemanticsLabel': return BySemanticsLabel.deserialize(json);
case 'ByText': return ByText.deserialize(json);
case 'PageBack': return const PageBack();
case 'Descendant': return Descendant.deserialize(json);
case 'Ancestor': return Ancestor.deserialize(json);
}
throw DriverError('Unsupported search specification type $finderType');
}
} }
/// A Flutter Driver finder that finds widgets by tooltip text. /// A Flutter Driver finder that finds widgets by tooltip text.
...@@ -352,14 +349,14 @@ class Descendant extends SerializableFinder { ...@@ -352,14 +349,14 @@ class Descendant extends SerializableFinder {
} }
/// Deserializes the finder from JSON generated by [serialize]. /// Deserializes the finder from JSON generated by [serialize].
static Descendant deserialize(Map<String, String> json, DeserializeFinderFactory finderFactory) { static Descendant deserialize(Map<String, String> json) {
final Map<String, String> jsonOfMatcher = final Map<String, String> jsonOfMatcher =
Map<String, String>.from(jsonDecode(json['of']) as Map<String, dynamic>); Map<String, String>.from(jsonDecode(json['of']) as Map<String, dynamic>);
final Map<String, String> jsonMatchingMatcher = final Map<String, String> jsonMatchingMatcher =
Map<String, String>.from(jsonDecode(json['matching']) as Map<String, dynamic>); Map<String, String>.from(jsonDecode(json['matching']) as Map<String, dynamic>);
return Descendant( return Descendant(
of: finderFactory.deserializeFinder(jsonOfMatcher), of: SerializableFinder.deserialize(jsonOfMatcher),
matching: finderFactory.deserializeFinder(jsonMatchingMatcher), matching: SerializableFinder.deserialize(jsonMatchingMatcher),
matchRoot: json['matchRoot'] == 'true', matchRoot: json['matchRoot'] == 'true',
firstMatchOnly: json['firstMatchOnly'] == 'true', firstMatchOnly: json['firstMatchOnly'] == 'true',
); );
...@@ -407,14 +404,14 @@ class Ancestor extends SerializableFinder { ...@@ -407,14 +404,14 @@ class Ancestor extends SerializableFinder {
} }
/// Deserializes the finder from JSON generated by [serialize]. /// Deserializes the finder from JSON generated by [serialize].
static Ancestor deserialize(Map<String, String> json, DeserializeFinderFactory finderFactory) { static Ancestor deserialize(Map<String, String> json) {
final Map<String, String> jsonOfMatcher = final Map<String, String> jsonOfMatcher =
Map<String, String>.from(jsonDecode(json['of']) as Map<String, dynamic>); Map<String, String>.from(jsonDecode(json['of']) as Map<String, dynamic>);
final Map<String, String> jsonMatchingMatcher = final Map<String, String> jsonMatchingMatcher =
Map<String, String>.from(jsonDecode(json['matching']) as Map<String, dynamic>); Map<String, String>.from(jsonDecode(json['matching']) as Map<String, dynamic>);
return Ancestor( return Ancestor(
of: finderFactory.deserializeFinder(jsonOfMatcher), of: SerializableFinder.deserialize(jsonOfMatcher),
matching: finderFactory.deserializeFinder(jsonMatchingMatcher), matching: SerializableFinder.deserialize(jsonMatchingMatcher),
matchRoot: json['matchRoot'] == 'true', matchRoot: json['matchRoot'] == 'true',
firstMatchOnly: json['firstMatchOnly'] == 'true', firstMatchOnly: json['firstMatchOnly'] == 'true',
); );
...@@ -439,8 +436,8 @@ class GetSemanticsId extends CommandWithTarget { ...@@ -439,8 +436,8 @@ class GetSemanticsId extends CommandWithTarget {
GetSemanticsId(SerializableFinder finder, {Duration timeout}) : super(finder, timeout: timeout); GetSemanticsId(SerializableFinder finder, {Duration timeout}) : super(finder, timeout: timeout);
/// Creates a command from a JSON map. /// Creates a command from a JSON map.
GetSemanticsId.deserialize(Map<String, String> json, DeserializeFinderFactory finderFactory) GetSemanticsId.deserialize(Map<String, String> json)
: super.deserialize(json, finderFactory); : super.deserialize(json);
@override @override
String get kind => 'get_semantics_id'; String get kind => 'get_semantics_id';
......
...@@ -36,9 +36,9 @@ class GetOffset extends CommandWithTarget { ...@@ -36,9 +36,9 @@ class GetOffset extends CommandWithTarget {
GetOffset(SerializableFinder finder, this.offsetType, { Duration timeout }) : super(finder, timeout: timeout); GetOffset(SerializableFinder finder, this.offsetType, { Duration timeout }) : super(finder, timeout: timeout);
/// Deserializes this command from the value generated by [serialize]. /// Deserializes this command from the value generated by [serialize].
GetOffset.deserialize(Map<String, String> json, DeserializeFinderFactory finderFactory) GetOffset.deserialize(Map<String, String> json)
: offsetType = _offsetTypeIndex.lookupBySimpleName(json['offsetType']), : offsetType = _offsetTypeIndex.lookupBySimpleName(json['offsetType']),
super.deserialize(json, finderFactory); super.deserialize(json);
@override @override
Map<String, String> serialize() => super.serialize()..addAll(<String, String>{ Map<String, String> serialize() => super.serialize()..addAll(<String, String>{
......
...@@ -11,7 +11,7 @@ class Tap extends CommandWithTarget { ...@@ -11,7 +11,7 @@ class Tap extends CommandWithTarget {
Tap(SerializableFinder finder, { Duration timeout }) : super(finder, timeout: timeout); Tap(SerializableFinder finder, { Duration timeout }) : super(finder, timeout: timeout);
/// Deserializes this command from the value generated by [serialize]. /// Deserializes this command from the value generated by [serialize].
Tap.deserialize(Map<String, String> json, DeserializeFinderFactory finderFactory) : super.deserialize(json, finderFactory); Tap.deserialize(Map<String, String> json) : super.deserialize(json);
@override @override
String get kind => 'tap'; String get kind => 'tap';
...@@ -46,12 +46,12 @@ class Scroll extends CommandWithTarget { ...@@ -46,12 +46,12 @@ class Scroll extends CommandWithTarget {
}) : super(finder, timeout: timeout); }) : super(finder, timeout: timeout);
/// Deserializes this command from the value generated by [serialize]. /// Deserializes this command from the value generated by [serialize].
Scroll.deserialize(Map<String, String> json, DeserializeFinderFactory finderFactory) Scroll.deserialize(Map<String, String> json)
: dx = double.parse(json['dx']), : dx = double.parse(json['dx']),
dy = double.parse(json['dy']), dy = double.parse(json['dy']),
duration = Duration(microseconds: int.parse(json['duration'])), duration = Duration(microseconds: int.parse(json['duration'])),
frequency = int.parse(json['frequency']), frequency = int.parse(json['frequency']),
super.deserialize(json, finderFactory); super.deserialize(json);
/// Delta X offset per move event. /// Delta X offset per move event.
final double dx; final double dx;
...@@ -99,9 +99,9 @@ class ScrollIntoView extends CommandWithTarget { ...@@ -99,9 +99,9 @@ class ScrollIntoView extends CommandWithTarget {
ScrollIntoView(SerializableFinder finder, { this.alignment = 0.0, Duration timeout }) : super(finder, timeout: timeout); ScrollIntoView(SerializableFinder finder, { this.alignment = 0.0, Duration timeout }) : super(finder, timeout: timeout);
/// Deserializes this command from the value generated by [serialize]. /// Deserializes this command from the value generated by [serialize].
ScrollIntoView.deserialize(Map<String, String> json, DeserializeFinderFactory finderFactory) ScrollIntoView.deserialize(Map<String, String> json)
: alignment = double.parse(json['alignment']), : alignment = double.parse(json['alignment']),
super.deserialize(json, finderFactory); super.deserialize(json);
/// How the widget should be aligned. /// How the widget should be aligned.
/// ///
......
...@@ -11,7 +11,7 @@ class GetText extends CommandWithTarget { ...@@ -11,7 +11,7 @@ class GetText extends CommandWithTarget {
GetText(SerializableFinder finder, { Duration timeout }) : super(finder, timeout: timeout); GetText(SerializableFinder finder, { Duration timeout }) : super(finder, timeout: timeout);
/// Deserializes this command from the value generated by [serialize]. /// Deserializes this command from the value generated by [serialize].
GetText.deserialize(Map<String, String> json, DeserializeFinderFactory finderFactory) : super.deserialize(json, finderFactory); GetText.deserialize(Map<String, String> json) : super.deserialize(json);
@override @override
String get kind => 'get_text'; String get kind => 'get_text';
......
...@@ -43,16 +43,15 @@ const String _extensionMethod = 'ext.flutter.$_extensionMethodName'; ...@@ -43,16 +43,15 @@ const String _extensionMethod = 'ext.flutter.$_extensionMethodName';
typedef DataHandler = Future<String> Function(String message); typedef DataHandler = Future<String> Function(String message);
class _DriverBinding extends BindingBase with SchedulerBinding, ServicesBinding, GestureBinding, PaintingBinding, SemanticsBinding, RendererBinding, WidgetsBinding { class _DriverBinding extends BindingBase with SchedulerBinding, ServicesBinding, GestureBinding, PaintingBinding, SemanticsBinding, RendererBinding, WidgetsBinding {
_DriverBinding(this._handler, this._silenceErrors, this.finders); _DriverBinding(this._handler, this._silenceErrors);
final DataHandler _handler; final DataHandler _handler;
final bool _silenceErrors; final bool _silenceErrors;
final List<FinderExtension> finders;
@override @override
void initServiceExtensions() { void initServiceExtensions() {
super.initServiceExtensions(); super.initServiceExtensions();
final FlutterDriverExtension extension = FlutterDriverExtension(_handler, _silenceErrors, finders); final FlutterDriverExtension extension = FlutterDriverExtension(_handler, _silenceErrors);
registerServiceExtension( registerServiceExtension(
name: _extensionMethodName, name: _extensionMethodName,
callback: extension.call, callback: extension.call,
...@@ -87,59 +86,9 @@ class _DriverBinding extends BindingBase with SchedulerBinding, ServicesBinding, ...@@ -87,59 +86,9 @@ class _DriverBinding extends BindingBase with SchedulerBinding, ServicesBinding,
/// for tests where exceptions are expected. Defaults to false. Any errors /// for tests where exceptions are expected. Defaults to false. Any errors
/// will still be returned in the `response` field of the result JSON along /// will still be returned in the `response` field of the result JSON along
/// with an `isError` boolean. /// with an `isError` boolean.
/// void enableFlutterDriverExtension({ DataHandler handler, bool silenceErrors = false }) {
/// The `finders` parameter are used to add custom finders, as in the following example.
///
/// ```dart main
/// void main() {
/// enableFlutterDriverExtension(finders: <FinderExtension>[ SomeFinderExtension() ]);
///
/// app.main();
/// }
/// ```
///
/// ```dart
/// class Some extends SerializableFinder {
/// const Some(this.title);
///
/// final String title;
///
/// @override
/// String get finderType => 'Some';
///
/// @override
/// Map<String, String> serialize() => super.serialize()..addAll(<String, String>{
/// 'title': title,
/// });
/// }
/// ```
///
/// ```dart
/// class SomeFinderExtension extends FinderExtension {
///
/// String get finderType => 'Some';
///
/// SerializableFinder deserialize(Map<String, String> params, DeserializeFinderFactory finderFactory) {
/// return Some(json['title']);
/// }
///
/// Finder createFinder(SerializableFinder finder) {
/// Some someFinder = finder as Some;
///
/// return find.byElementPredicate((Element element) {
/// final Widget widget = element.widget;
/// if (element.widget is SomeWidget) {
/// return element.widget.title == someFinder.title;
/// }
/// return false;
/// });
/// }
/// }
/// ```
///
void enableFlutterDriverExtension({ DataHandler handler, bool silenceErrors = false, List<FinderExtension> finders}) {
assert(WidgetsBinding.instance == null); assert(WidgetsBinding.instance == null);
_DriverBinding(handler, silenceErrors, finders ?? <FinderExtension>[]); _DriverBinding(handler, silenceErrors);
assert(WidgetsBinding.instance is _DriverBinding); assert(WidgetsBinding.instance is _DriverBinding);
} }
...@@ -149,19 +98,9 @@ typedef CommandHandlerCallback = Future<Result> Function(Command c); ...@@ -149,19 +98,9 @@ typedef CommandHandlerCallback = Future<Result> Function(Command c);
/// Signature for functions that deserialize a JSON map to a command object. /// Signature for functions that deserialize a JSON map to a command object.
typedef CommandDeserializerCallback = Command Function(Map<String, String> params); typedef CommandDeserializerCallback = Command Function(Map<String, String> params);
/// Used to expand the new Finder /// Signature for functions that run the given finder and return the [Element]
abstract class FinderExtension { /// found, if any, or null otherwise.
typedef FinderConstructor = Finder Function(SerializableFinder finder);
/// Identifies the type of finder to be used by the driver extension.
String get finderType;
/// Deserializes the finder from JSON generated by [SerializableFinder.serialize].
SerializableFinder deserialize(Map<String, String> params, DeserializeFinderFactory finderFactory);
/// Signature for functions that run the given finder and return the [Element]
/// found, if any, or null otherwise.
Finder createFinder(SerializableFinder finder);
}
/// The class that manages communication between a Flutter Driver test and the /// The class that manages communication between a Flutter Driver test and the
/// application being remote-controlled, on the application side. /// application being remote-controlled, on the application side.
...@@ -169,9 +108,9 @@ abstract class FinderExtension { ...@@ -169,9 +108,9 @@ abstract class FinderExtension {
/// This is not normally used directly. It is instantiated automatically when /// This is not normally used directly. It is instantiated automatically when
/// calling [enableFlutterDriverExtension]. /// calling [enableFlutterDriverExtension].
@visibleForTesting @visibleForTesting
class FlutterDriverExtension with DeserializeFinderFactory { class FlutterDriverExtension {
/// Creates an object to manage a Flutter Driver connection. /// Creates an object to manage a Flutter Driver connection.
FlutterDriverExtension(this._requestDataHandler, this._silenceErrors, List<FinderExtension> finders) { FlutterDriverExtension(this._requestDataHandler, this._silenceErrors) {
_testTextInput.register(); _testTextInput.register();
_commandHandlers.addAll(<String, CommandHandlerCallback>{ _commandHandlers.addAll(<String, CommandHandlerCallback>{
...@@ -203,28 +142,35 @@ class FlutterDriverExtension with DeserializeFinderFactory { ...@@ -203,28 +142,35 @@ class FlutterDriverExtension with DeserializeFinderFactory {
'get_layer_tree': (Map<String, String> params) => GetLayerTree.deserialize(params), 'get_layer_tree': (Map<String, String> params) => GetLayerTree.deserialize(params),
'get_render_tree': (Map<String, String> params) => GetRenderTree.deserialize(params), 'get_render_tree': (Map<String, String> params) => GetRenderTree.deserialize(params),
'enter_text': (Map<String, String> params) => EnterText.deserialize(params), 'enter_text': (Map<String, String> params) => EnterText.deserialize(params),
'get_text': (Map<String, String> params) => GetText.deserialize(params, this), 'get_text': (Map<String, String> params) => GetText.deserialize(params),
'request_data': (Map<String, String> params) => RequestData.deserialize(params), 'request_data': (Map<String, String> params) => RequestData.deserialize(params),
'scroll': (Map<String, String> params) => Scroll.deserialize(params, this), 'scroll': (Map<String, String> params) => Scroll.deserialize(params),
'scrollIntoView': (Map<String, String> params) => ScrollIntoView.deserialize(params, this), 'scrollIntoView': (Map<String, String> params) => ScrollIntoView.deserialize(params),
'set_frame_sync': (Map<String, String> params) => SetFrameSync.deserialize(params), 'set_frame_sync': (Map<String, String> params) => SetFrameSync.deserialize(params),
'set_semantics': (Map<String, String> params) => SetSemantics.deserialize(params), 'set_semantics': (Map<String, String> params) => SetSemantics.deserialize(params),
'set_text_entry_emulation': (Map<String, String> params) => SetTextEntryEmulation.deserialize(params), 'set_text_entry_emulation': (Map<String, String> params) => SetTextEntryEmulation.deserialize(params),
'tap': (Map<String, String> params) => Tap.deserialize(params, this), 'tap': (Map<String, String> params) => Tap.deserialize(params),
'waitFor': (Map<String, String> params) => WaitFor.deserialize(params, this), 'waitFor': (Map<String, String> params) => WaitFor.deserialize(params),
'waitForAbsent': (Map<String, String> params) => WaitForAbsent.deserialize(params, this), 'waitForAbsent': (Map<String, String> params) => WaitForAbsent.deserialize(params),
'waitForCondition': (Map<String, String> params) => WaitForCondition.deserialize(params), 'waitForCondition': (Map<String, String> params) => WaitForCondition.deserialize(params),
'waitUntilNoTransientCallbacks': (Map<String, String> params) => WaitUntilNoTransientCallbacks.deserialize(params), 'waitUntilNoTransientCallbacks': (Map<String, String> params) => WaitUntilNoTransientCallbacks.deserialize(params),
'waitUntilNoPendingFrame': (Map<String, String> params) => WaitUntilNoPendingFrame.deserialize(params), 'waitUntilNoPendingFrame': (Map<String, String> params) => WaitUntilNoPendingFrame.deserialize(params),
'waitUntilFirstFrameRasterized': (Map<String, String> params) => WaitUntilFirstFrameRasterized.deserialize(params), 'waitUntilFirstFrameRasterized': (Map<String, String> params) => WaitUntilFirstFrameRasterized.deserialize(params),
'get_semantics_id': (Map<String, String> params) => GetSemanticsId.deserialize(params, this), 'get_semantics_id': (Map<String, String> params) => GetSemanticsId.deserialize(params),
'get_offset': (Map<String, String> params) => GetOffset.deserialize(params, this), 'get_offset': (Map<String, String> params) => GetOffset.deserialize(params),
'get_diagnostics_tree': (Map<String, String> params) => GetDiagnosticsTree.deserialize(params, this), 'get_diagnostics_tree': (Map<String, String> params) => GetDiagnosticsTree.deserialize(params),
}); });
for(final FinderExtension finder in finders) { _finders.addAll(<String, FinderConstructor>{
_finderExtensions[finder.finderType] = finder; 'ByText': (SerializableFinder finder) => _createByTextFinder(finder as ByText),
} 'ByTooltipMessage': (SerializableFinder finder) => _createByTooltipMessageFinder(finder as ByTooltipMessage),
'BySemanticsLabel': (SerializableFinder finder) => _createBySemanticsLabelFinder(finder as BySemanticsLabel),
'ByValueKey': (SerializableFinder finder) => _createByValueKeyFinder(finder as ByValueKey),
'ByType': (SerializableFinder finder) => _createByTypeFinder(finder as ByType),
'PageBack': (SerializableFinder finder) => _createPageBackFinder(),
'Ancestor': (SerializableFinder finder) => _createAncestorFinder(finder as Ancestor),
'Descendant': (SerializableFinder finder) => _createDescendantFinder(finder as Descendant),
});
} }
final TestTextInput _testTextInput = TestTextInput(); final TestTextInput _testTextInput = TestTextInput();
...@@ -239,7 +185,7 @@ class FlutterDriverExtension with DeserializeFinderFactory { ...@@ -239,7 +185,7 @@ class FlutterDriverExtension with DeserializeFinderFactory {
final WidgetController _prober = LiveWidgetController(WidgetsBinding.instance); final WidgetController _prober = LiveWidgetController(WidgetsBinding.instance);
final Map<String, CommandHandlerCallback> _commandHandlers = <String, CommandHandlerCallback>{}; final Map<String, CommandHandlerCallback> _commandHandlers = <String, CommandHandlerCallback>{};
final Map<String, CommandDeserializerCallback> _commandDeserializers = <String, CommandDeserializerCallback>{}; final Map<String, CommandDeserializerCallback> _commandDeserializers = <String, CommandDeserializerCallback>{};
final Map<String, FinderExtension> _finderExtensions = <String, FinderExtension>{}; final Map<String, FinderConstructor> _finders = <String, FinderConstructor>{};
/// With [_frameSync] enabled, Flutter Driver will wait to perform an action /// With [_frameSync] enabled, Flutter Driver will wait to perform an action
/// until there are no pending frames in the app under test. /// until there are no pending frames in the app under test.
...@@ -426,30 +372,12 @@ class FlutterDriverExtension with DeserializeFinderFactory { ...@@ -426,30 +372,12 @@ class FlutterDriverExtension with DeserializeFinderFactory {
} }
Finder _createFinder(SerializableFinder finder) { Finder _createFinder(SerializableFinder finder) {
switch (finder.finderType) { final FinderConstructor constructor = _finders[finder.finderType];
case 'ByText':
return _createByTextFinder(finder as ByText); if (constructor == null)
case 'ByTooltipMessage': throw 'Unsupported finder type: ${finder.finderType}';
return _createByTooltipMessageFinder(finder as ByTooltipMessage);
case 'BySemanticsLabel': return constructor(finder);
return _createBySemanticsLabelFinder(finder as BySemanticsLabel);
case 'ByValueKey':
return _createByValueKeyFinder(finder as ByValueKey);
case 'ByType':
return _createByTypeFinder(finder as ByType);
case 'PageBack':
return _createPageBackFinder();
case 'Ancestor':
return _createAncestorFinder(finder as Ancestor);
case 'Descendant':
return _createDescendantFinder(finder as Descendant);
default:
if (_finderExtensions.containsKey(finder.finderType)) {
return _finderExtensions[finder.finderType].createFinder(finder);
} else {
throw 'Unsupported finder type: ${finder.finderType}';
}
}
} }
Future<TapResult> _tap(Command command) async { Future<TapResult> _tap(Command command) async {
......
...@@ -37,7 +37,7 @@ void main() { ...@@ -37,7 +37,7 @@ void main() {
setUp(() { setUp(() {
result = null; result = null;
extension = FlutterDriverExtension((String message) async { log.add(message); return (messageId += 1).toString(); }, false, <FinderExtension>[]); extension = FlutterDriverExtension((String message) async { log.add(message); return (messageId += 1).toString(); }, false);
}); });
testWidgets('returns immediately when transient callback queue is empty', (WidgetTester tester) async { testWidgets('returns immediately when transient callback queue is empty', (WidgetTester tester) async {
...@@ -98,7 +98,7 @@ void main() { ...@@ -98,7 +98,7 @@ void main() {
setUp(() { setUp(() {
result = null; result = null;
extension = FlutterDriverExtension((String message) async { log.add(message); return (messageId += 1).toString(); }, false, <FinderExtension>[]); extension = FlutterDriverExtension((String message) async { log.add(message); return (messageId += 1).toString(); }, false);
}); });
testWidgets('waiting for NoTransientCallbacks returns immediately when transient callback queue is empty', (WidgetTester tester) async { testWidgets('waiting for NoTransientCallbacks returns immediately when transient callback queue is empty', (WidgetTester tester) async {
...@@ -464,7 +464,7 @@ void main() { ...@@ -464,7 +464,7 @@ void main() {
group('getSemanticsId', () { group('getSemanticsId', () {
FlutterDriverExtension extension; FlutterDriverExtension extension;
setUp(() { setUp(() {
extension = FlutterDriverExtension((String arg) async => '', true, <FinderExtension>[]); extension = FlutterDriverExtension((String arg) async => '', true);
}); });
testWidgets('works when semantics are enabled', (WidgetTester tester) async { testWidgets('works when semantics are enabled', (WidgetTester tester) async {
...@@ -513,7 +513,7 @@ void main() { ...@@ -513,7 +513,7 @@ void main() {
}); });
testWidgets('getOffset', (WidgetTester tester) async { testWidgets('getOffset', (WidgetTester tester) async {
final FlutterDriverExtension extension = FlutterDriverExtension((String arg) async => '', true, <FinderExtension>[]); final FlutterDriverExtension extension = FlutterDriverExtension((String arg) async => '', true);
Future<Offset> getOffset(OffsetType offset) async { Future<Offset> getOffset(OffsetType offset) async {
final Map<String, String> arguments = GetOffset(ByValueKey(1), offset).serialize(); final Map<String, String> arguments = GetOffset(ByValueKey(1), offset).serialize();
...@@ -545,7 +545,7 @@ void main() { ...@@ -545,7 +545,7 @@ void main() {
testWidgets('getText', (WidgetTester tester) async { testWidgets('getText', (WidgetTester tester) async {
await silenceDriverLogger(() async { await silenceDriverLogger(() async {
final FlutterDriverExtension extension = FlutterDriverExtension((String arg) async => '', true, <FinderExtension>[]); final FlutterDriverExtension extension = FlutterDriverExtension((String arg) async => '', true);
Future<String> getTextInternal(SerializableFinder search) async { Future<String> getTextInternal(SerializableFinder search) async {
final Map<String, String> arguments = GetText(search, timeout: const Duration(seconds: 1)).serialize(); final Map<String, String> arguments = GetText(search, timeout: const Duration(seconds: 1)).serialize();
...@@ -615,7 +615,7 @@ void main() { ...@@ -615,7 +615,7 @@ void main() {
testWidgets('descendant finder', (WidgetTester tester) async { testWidgets('descendant finder', (WidgetTester tester) async {
await silenceDriverLogger(() async { await silenceDriverLogger(() async {
final FlutterDriverExtension extension = FlutterDriverExtension((String arg) async => '', true, <FinderExtension>[]); final FlutterDriverExtension extension = FlutterDriverExtension((String arg) async => '', true);
Future<String> getDescendantText({ String of, bool matchRoot = false}) async { Future<String> getDescendantText({ String of, bool matchRoot = false}) async {
final Map<String, String> arguments = GetText(Descendant( final Map<String, String> arguments = GetText(Descendant(
...@@ -660,7 +660,7 @@ void main() { ...@@ -660,7 +660,7 @@ void main() {
testWidgets('descendant finder firstMatchOnly', (WidgetTester tester) async { testWidgets('descendant finder firstMatchOnly', (WidgetTester tester) async {
await silenceDriverLogger(() async { await silenceDriverLogger(() async {
final FlutterDriverExtension extension = FlutterDriverExtension((String arg) async => '', true, <FinderExtension>[]); final FlutterDriverExtension extension = FlutterDriverExtension((String arg) async => '', true);
Future<String> getDescendantText() async { Future<String> getDescendantText() async {
final Map<String, String> arguments = GetText(Descendant( final Map<String, String> arguments = GetText(Descendant(
...@@ -694,7 +694,7 @@ void main() { ...@@ -694,7 +694,7 @@ void main() {
testWidgets('ancestor finder', (WidgetTester tester) async { testWidgets('ancestor finder', (WidgetTester tester) async {
await silenceDriverLogger(() async { await silenceDriverLogger(() async {
final FlutterDriverExtension extension = FlutterDriverExtension((String arg) async => '', true, <FinderExtension>[]); final FlutterDriverExtension extension = FlutterDriverExtension((String arg) async => '', true);
Future<Offset> getAncestorTopLeft({ String of, String matching, bool matchRoot = false}) async { Future<Offset> getAncestorTopLeft({ String of, String matching, bool matchRoot = false}) async {
final Map<String, String> arguments = GetOffset(Ancestor( final Map<String, String> arguments = GetOffset(Ancestor(
...@@ -764,7 +764,7 @@ void main() { ...@@ -764,7 +764,7 @@ void main() {
testWidgets('ancestor finder firstMatchOnly', (WidgetTester tester) async { testWidgets('ancestor finder firstMatchOnly', (WidgetTester tester) async {
await silenceDriverLogger(() async { await silenceDriverLogger(() async {
final FlutterDriverExtension extension = FlutterDriverExtension((String arg) async => '', true, <FinderExtension>[]); final FlutterDriverExtension extension = FlutterDriverExtension((String arg) async => '', true);
Future<Offset> getAncestorTopLeft() async { Future<Offset> getAncestorTopLeft() async {
final Map<String, String> arguments = GetOffset(Ancestor( final Map<String, String> arguments = GetOffset(Ancestor(
...@@ -812,7 +812,7 @@ void main() { ...@@ -812,7 +812,7 @@ void main() {
}); });
testWidgets('GetDiagnosticsTree', (WidgetTester tester) async { testWidgets('GetDiagnosticsTree', (WidgetTester tester) async {
final FlutterDriverExtension extension = FlutterDriverExtension((String arg) async => '', true, <FinderExtension>[]); final FlutterDriverExtension extension = FlutterDriverExtension((String arg) async => '', true);
Future<Map<String, Object>> getDiagnosticsTree(DiagnosticsType type, SerializableFinder finder, { int depth = 0, bool properties = true }) async { Future<Map<String, Object>> getDiagnosticsTree(DiagnosticsType type, SerializableFinder finder, { int depth = 0, bool properties = true }) async {
final Map<String, String> arguments = GetDiagnosticsTree(finder, type, subtreeDepth: depth, includeProperties: properties).serialize(); final Map<String, String> arguments = GetDiagnosticsTree(finder, type, subtreeDepth: depth, includeProperties: properties).serialize();
...@@ -882,7 +882,7 @@ void main() { ...@@ -882,7 +882,7 @@ void main() {
Map<String, dynamic> result; Map<String, dynamic> result;
setUp(() { setUp(() {
extension = FlutterDriverExtension((String arg) async => '', true, <FinderExtension>[]); extension = FlutterDriverExtension((String arg) async => '', true);
result = null; result = null;
}); });
......
...@@ -2,15 +2,11 @@ ...@@ -2,15 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
import 'package:flutter_driver/flutter_driver.dart';
import 'package:flutter_driver/src/common/find.dart'; import 'package:flutter_driver/src/common/find.dart';
import 'package:mockito/mockito.dart';
import '../../common.dart'; import '../../common.dart';
void main() { void main() {
MockDeserialize mockDeserialize;
test('Ancestor finder serialize', () { test('Ancestor finder serialize', () {
const SerializableFinder of = ByType('Text'); const SerializableFinder of = ByType('Text');
final SerializableFinder matching = ByValueKey('hello'); final SerializableFinder matching = ByValueKey('hello');
...@@ -39,7 +35,7 @@ void main() { ...@@ -39,7 +35,7 @@ void main() {
'firstMatchOnly': 'true', 'firstMatchOnly': 'true',
}; };
final Ancestor a = Ancestor.deserialize(serialized, mockDeserialize); final Ancestor a = Ancestor.deserialize(serialized);
expect(a.of, isA<ByType>()); expect(a.of, isA<ByType>());
expect(a.matching, isA<ByValueKey>()); expect(a.matching, isA<ByValueKey>());
expect(a.matchRoot, isTrue); expect(a.matchRoot, isTrue);
...@@ -74,12 +70,10 @@ void main() { ...@@ -74,12 +70,10 @@ void main() {
'firstMatchOnly': 'true', 'firstMatchOnly': 'true',
}; };
final Descendant a = Descendant.deserialize(serialized, mockDeserialize); final Descendant a = Descendant.deserialize(serialized);
expect(a.of, isA<ByType>()); expect(a.of, isA<ByType>());
expect(a.matching, isA<ByValueKey>()); expect(a.matching, isA<ByValueKey>());
expect(a.matchRoot, isTrue); expect(a.matchRoot, isTrue);
expect(a.firstMatchOnly, isTrue); expect(a.firstMatchOnly, isTrue);
}); });
} }
class MockDeserialize with Mock, DeserializeFinderFactory { }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment