import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mews/presentation/reader/swipe_navigator.dart'; Widget _wrap(SwipeNavigator navigator) => MaterialApp( home: Scaffold( body: Center( child: SizedBox( width: 800, height: 600, child: navigator, ), ), ), ); SwipeNavigator _navigator({ required VoidCallback onBack, required VoidCallback onForward, bool canGoBack = true, bool canGoForward = true, }) => SwipeNavigator( canGoBack: canGoBack, canGoForward: canGoForward, backTitle: 'Previous page', forwardTitle: 'Next page', background: const Color(0xfffaf8f3), onBack: onBack, onForward: onForward, child: const ColoredBox( color: Color(0xff18191b), child: SizedBox.expand(), ), ); void main() { testWidgets('dragging right reveals the previous page and commits', (tester) async { var back = 0; var forward = 0; await tester.pumpWidget(_wrap(_navigator( onBack: () => back++, onForward: () => forward++, ))); final center = tester.getCenter(find.byType(SwipeNavigator)); final gesture = await tester.startGesture(center); await gesture.moveBy(const Offset(300, 0)); await tester.pump(); // The neighbor is peeking in with its title while the page slides away. expect(find.text('Previous page'), findsOneWidget); await gesture.up(); await tester.pumpAndSettle(); expect(back, 1); expect(forward, 0); }); testWidgets('dragging left commits forward navigation', (tester) async { var back = 0; var forward = 0; await tester.pumpWidget(_wrap(_navigator( onBack: () => back++, onForward: () => forward++, ))); final center = tester.getCenter(find.byType(SwipeNavigator)); final gesture = await tester.startGesture(center); await gesture.moveBy(const Offset(-300, 0)); await tester.pump(); expect(find.text('Next page'), findsOneWidget); await gesture.up(); await tester.pumpAndSettle(); expect(forward, 1); expect(back, 0); }); testWidgets('a short drag springs back without navigating', (tester) async { var back = 0; await tester.pumpWidget(_wrap(_navigator( onBack: () => back++, onForward: () {}, ))); final center = tester.getCenter(find.byType(SwipeNavigator)); final gesture = await tester.startGesture(center); await gesture.moveBy(const Offset(80, 0)); await tester.pump(); await gesture.up(); await tester.pumpAndSettle(); expect(back, 0); // The neighbor disappeared again. expect(find.text('Previous page'), findsNothing); }); testWidgets('directions without pages rubber-band and never commit', (tester) async { var back = 0; var forward = 0; await tester.pumpWidget(_wrap(_navigator( onBack: () => back++, onForward: () => forward++, canGoBack: false, canGoForward: false, ))); final center = tester.getCenter(find.byType(SwipeNavigator)); final gesture = await tester.startGesture(center); await gesture.moveBy(const Offset(400, 0)); await tester.pump(); // No neighbor title shows when there is nothing to go back to. expect(find.text('Previous page'), findsNothing); await gesture.up(); await tester.pumpAndSettle(); expect(back, 0); expect(forward, 0); }); }