JJ_MKVMaker/test/progress_dialog_test.dart

60 lines
2.4 KiB
Dart

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<BuildContext> 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<void>(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);
});
}