Skip to content

Commit

Permalink
feat: add all navigator calls to mock (#6)
Browse files Browse the repository at this point in the history
  • Loading branch information
jeroen-meijer authored Jul 5, 2021
1 parent 66086ff commit 5bd22d7
Show file tree
Hide file tree
Showing 4 changed files with 553 additions and 38 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@
# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/
# .vscode/
.vscode/settings.json

# Flutter/Dart/Pub related
**/doc/api/
Expand Down
212 changes: 205 additions & 7 deletions lib/mock_navigator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ class MockNavigatorProvider extends Navigator {

@override
NavigatorState createState() {
return _MockNavigatorState(navigator: navigator)..child = child;
// The hack that makes it all work.
// ignore: no_logic_in_create_state
return _MockNavigatorState(navigator).._child = child;
}

@override
Expand Down Expand Up @@ -54,18 +56,214 @@ mixin MockNavigatorDiagnosticsMixin on Object {
}
}

/// Internal class that imitates a [NavigatorState] and maps all the real
/// [NavigatorState] methods to the mock methods for use in testing.
class _MockNavigatorState extends NavigatorState {
_MockNavigatorState({required this.navigator});
_MockNavigatorState(this._navigator);

MockNavigatorBase navigator;
Widget? child;
final MockNavigatorBase _navigator;
Widget? _child;

@override
Future<T?> push<T extends Object?>(Route<T> route) => navigator.push(route);
Widget build(BuildContext context) => _child!;

@override
void pop<T extends Object?>([T? result]) => navigator.pop(result);
Future<T?> push<T extends Object?>(Route<T> route) {
return _navigator.push<T>(route);
}

@override
Future<T?> pushNamed<T extends Object?>(
String routeName, {
Object? arguments,
}) {
return _navigator.pushNamed<T>(
routeName,
arguments: arguments,
);
}

@override
Future<T?> pushNamedAndRemoveUntil<T extends Object?>(
String newRouteName,
RoutePredicate predicate, {
Object? arguments,
}) {
return _navigator.pushNamedAndRemoveUntil<T>(
newRouteName,
predicate,
arguments: arguments,
);
}

@override
Future<T?> pushReplacement<T extends Object?, TO extends Object?>(
Route<T> newRoute, {
TO? result,
}) {
return _navigator.pushReplacement<T, TO>(
newRoute,
result: result,
);
}

@override
Future<T?> pushReplacementNamed<T extends Object?, TO extends Object?>(
String routeName, {
TO? result,
Object? arguments,
}) {
return _navigator.pushReplacementNamed<T, TO>(
routeName,
result: result,
arguments: arguments,
);
}

@override
void pop<T extends Object?>([T? result]) {
return _navigator.pop<T>(result);
}

@override
Future<T?> popAndPushNamed<T extends Object?, TO extends Object?>(
String routeName, {
TO? result,
Object? arguments,
}) {
return _navigator.popAndPushNamed<T, TO>(
routeName,
result: result,
arguments: arguments,
);
}

@override
void popUntil(RoutePredicate predicate) {
return _navigator.popUntil(predicate);
}

@override
Future<T?> pushAndRemoveUntil<T extends Object?>(
Route<T> newRoute,
RoutePredicate predicate,
) {
return _navigator.pushAndRemoveUntil<T>(
newRoute,
predicate,
);
}

@override
Widget build(BuildContext context) => child!;
String restorablePopAndPushNamed<T extends Object?, TO extends Object?>(
String routeName, {
TO? result,
Object? arguments,
}) {
return _navigator.restorablePopAndPushNamed<T, TO>(
routeName,
result: result,
arguments: arguments,
);
}

@override
String restorablePush<T extends Object?>(
RestorableRouteBuilder<T> routeBuilder, {
Object? arguments,
}) {
return _navigator.restorablePush<T>(
routeBuilder,
arguments: arguments,
);
}

@override
String restorablePushAndRemoveUntil<T extends Object?>(
RestorableRouteBuilder<T> newRouteBuilder,
RoutePredicate predicate, {
Object? arguments,
}) {
return _navigator.restorablePushAndRemoveUntil<T>(
newRouteBuilder,
predicate,
arguments: arguments,
);
}

@override
String restorablePushNamed<T extends Object?>(
String routeName, {
Object? arguments,
}) {
return _navigator.restorablePushNamed<T>(
routeName,
arguments: arguments,
);
}

@override
String restorablePushNamedAndRemoveUntil<T extends Object?>(
String newRouteName,
RoutePredicate predicate, {
Object? arguments,
}) {
return _navigator.restorablePushNamedAndRemoveUntil<T>(
newRouteName,
predicate,
arguments: arguments,
);
}

@override
String restorablePushReplacement<T extends Object?, TO extends Object?>(
RestorableRouteBuilder<T> routeBuilder, {
TO? result,
Object? arguments,
}) {
return _navigator.restorablePushReplacement<T, TO>(
routeBuilder,
result: result,
arguments: arguments,
);
}

@override
String restorablePushReplacementNamed<T extends Object?, TO extends Object?>(
String routeName, {
TO? result,
Object? arguments,
}) {
return _navigator.restorablePushReplacementNamed<T, TO>(
routeName,
result: result,
arguments: arguments,
);
}

@override
String restorableReplace<T extends Object?>({
required Route oldRoute,
required RestorableRouteBuilder<T> newRouteBuilder,
Object? arguments,
}) {
return _navigator.restorableReplace<T>(
oldRoute: oldRoute,
newRouteBuilder: newRouteBuilder,
arguments: arguments,
);
}

@override
String restorableReplaceRouteBelow<T extends Object?>({
required Route anchorRoute,
required RestorableRouteBuilder<T> newRouteBuilder,
Object? arguments,
}) {
return _navigator.restorableReplaceRouteBelow<T>(
anchorRoute: anchorRoute,
newRouteBuilder: newRouteBuilder,
arguments: arguments,
);
}
}
5 changes: 2 additions & 3 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,5 @@ dependencies:
dev_dependencies:
flutter_test:
sdk: flutter
coverage: 0.15.2
very_good_analysis: 2.0.3
mocktail: 0.1.1
mocktail: ^0.1.4
very_good_analysis: 2.1.2
Loading

0 comments on commit 5bd22d7

Please sign in to comment.