import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:jj_mkvmaker/ui/progress_dialog.dart'; /// 관리자 지시 (10/20, 28 지적): 진행 창이 ← · [취소] 로 먼저 닫혀도, 일이 끝난 뒤 close() 가 아래 화면을 닫지 않는다 void main() { Future pushPage(WidgetTester tester) async { late BuildContext page; await tester.pumpWidget(MaterialApp(home: Builder(builder: (ctx) { return Scaffold( body: TextButton( onPressed: () => Navigator.of(ctx).push(MaterialPageRoute(builder: (c) { page = c; return const Scaffold(body: Text('아래 화면')); })), child: const Text('열기'), ), ); }))); await tester.tap(find.text('열기')); await tester.pumpAndSettle(); return page; } testWidgets('← 로 닫으면 그만둔 것 - 끝난 뒤 close() 는 아래 화면을 닫지 않는다', (tester) async { final page = await pushPage(tester); final d = showProgressDialog(page, '여는 중: a.hwp'); await tester.pump(); expect(find.text('여는 중: a.hwp'), findsOneWidget); expect(d.cancelled(), isFalse); // Android ← (창을 닫음) await tester.binding.handlePopRoute(); await tester.pumpAndSettle(); expect(find.text('여는 중: a.hwp'), findsNothing); expect(d.cancelled(), isTrue); d.close(); // 일이 끝남 - 이미 닫혔으니 아무것도 닫지 않는다 await tester.pumpAndSettle(); expect(find.text('아래 화면'), findsOneWidget, reason: '예전에는 이 pop() 이 아래 화면을 닫았다'); }); testWidgets('[취소] 도 그만둔 것, 일이 끝나 close() 하면 창만 닫히고 그만둔 것이 아니다', (tester) async { final page = await pushPage(tester); final a = showProgressDialog(page, '바꾸는 중'); await tester.pump(); await tester.tap(find.text('취소')); await tester.pumpAndSettle(); expect(a.cancelled(), isTrue); expect(find.text('아래 화면'), findsOneWidget); final b = showProgressDialog(page, '바꾸는 중'); await tester.pump(); b.close(); await tester.pumpAndSettle(); await b.done; expect(b.cancelled(), isFalse); expect(find.text('바꾸는 중'), findsNothing); expect(find.text('아래 화면'), findsOneWidget); }); }