blob: a7153327bf4b07856315eb996882b891abd41ac2 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:go_router/go_router.dart';
import 'package:go_router/src/go_route_match.dart';
import 'package:go_router/src/go_router_delegate.dart';
import 'package:go_router/src/go_router_error_page.dart';
GoRouterDelegate createGoRouterDelegate({
Listenable? refreshListenable,
}) {
final GoRouter router = GoRouter(
initialLocation: '/',
routes: <GoRoute>[
GoRoute(path: '/', builder: (_, __) => const DummyStatefulWidget()),
GoRoute(
path: '/error',
builder: (_, __) => const GoRouterErrorScreen(null),
),
],
refreshListenable: refreshListenable,
);
return router.routerDelegate;
}
void main() {
group('pop', () {
test('removes the last element', () {
final GoRouterDelegate delegate = createGoRouterDelegate()
..push('/error')
..addListener(expectAsync0(() {}));
final GoRouteMatch last = delegate.matches.last;
delegate.pop();
expect(delegate.matches.length, 1);
expect(delegate.matches.contains(last), false);
});
test('throws when it pops more than matches count', () {
final GoRouterDelegate delegate = createGoRouterDelegate()
..push('/error');
expect(
() => delegate
..pop()
..pop(),
throwsA(isAssertionError),
);
});
});
test('dispose unsubscribes from refreshListenable', () {
final FakeRefreshListenable refreshListenable = FakeRefreshListenable();
createGoRouterDelegate(refreshListenable: refreshListenable).dispose();
expect(refreshListenable.unsubscribed, true);
});
}
class FakeRefreshListenable extends ChangeNotifier {
bool unsubscribed = false;
@override
void removeListener(VoidCallback listener) {
unsubscribed = true;
super.removeListener(listener);
}
}
class DummyStatefulWidget extends StatefulWidget {
const DummyStatefulWidget({Key? key}) : super(key: key);
@override
State<DummyStatefulWidget> createState() => _DummyStatefulWidgetState();
}
class _DummyStatefulWidgetState extends State<DummyStatefulWidget> {
@override
Widget build(BuildContext context) => Container();
}