import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:miler/views/Dashboard/home/selection_bar.dart'; /// The bar is the only place a decision is committed now that stop rows are /// tick-only, so it has to carry BOTH decisions — and carry them at every /// width, since the labels sit beside a live count. void main() { Future pump( WidgetTester tester, { required int count, required double width, bool withReject = true, }) async { tester.view.physicalSize = Size(width * 3, 2532); tester.view.devicePixelRatio = 3.0; addTearDown(tester.view.resetPhysicalSize); addTearDown(tester.view.resetDevicePixelRatio); await tester.pumpWidget( ScreenUtilInit( designSize: const Size(390, 844), builder: (_, _) => MaterialApp( home: Scaffold( body: Align( alignment: Alignment.bottomCenter, child: SelectionBar( count: count, onAccept: () {}, onReject: withReject ? () {} : null, onClear: () {}, ), ), ), ), ), ); await tester.pumpAndSettle(); } testWidgets('offers both decisions on the ticked set', (tester) async { await pump(tester, count: 3, width: 390); expect(find.text('Accept 3'), findsOneWidget); expect(find.text('Reject'), findsOneWidget); }); testWidgets('reject fires with the selection', (tester) async { var rejected = 0; tester.view.physicalSize = const Size(1170, 2532); tester.view.devicePixelRatio = 3.0; addTearDown(tester.view.resetPhysicalSize); addTearDown(tester.view.resetDevicePixelRatio); await tester.pumpWidget( ScreenUtilInit( designSize: const Size(390, 844), builder: (_, _) => MaterialApp( home: Scaffold( body: Align( alignment: Alignment.bottomCenter, child: SelectionBar( count: 2, onAccept: () {}, onReject: () => rejected++, onClear: () {}, ), ), ), ), ), ); await tester.pumpAndSettle(); await tester.tap(find.text('Reject')); await tester.pumpAndSettle(); expect(rejected, 1); }); testWidgets('hides reject when the page does not offer it', (tester) async { await pump(tester, count: 2, width: 390, withReject: false); expect(find.text('Reject'), findsNothing); expect(find.text('Accept 2'), findsOneWidget); }); // Two buttons and a count on one line is exactly the shape that overflows on // a small phone, and an overflowing action bar is the one place the rider // cannot work around it. for (final width in [320.0, 360.0, 390.0, 430.0]) { testWidgets('lays out at ${width.toInt()}pt', (tester) async { await pump(tester, count: 12, width: width); expect(tester.takeException(), isNull); }); } }