JJ_MKVMaker/test/confirm_dialog_contract_tes...

80 lines
3.6 KiB
Dart

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:jj_mkvmaker/ui/confirm_dialog.dart';
/// E4 U7 약속 시험 (모듈 하나에 한 장): lib/ui/confirm_dialog.dart 맨 위 약속을 그대로 본다.
void main() {
testWidgets('[확인] 만 true · [취소] · Esc · 바깥 누르기는 false', (tester) async {
for (final (name, close, want) in <(String, Future<void> Function(), bool)>[
('확인', () => tester.tap(find.text('확인 단추')), true),
('취소', () => tester.tap(find.text('취소')), false),
('Esc', () => tester.sendKeyEvent(LogicalKeyboardKey.escape), false),
('바깥', () => tester.tapAt(const Offset(5, 5)), false),
]) {
late BuildContext ctx;
await tester.pumpWidget(MaterialApp(home: Builder(builder: (c) {
ctx = c;
return const Scaffold(body: SizedBox());
})));
bool? got;
unawaited(confirmDialog(ctx, title: () => '복사', confirmLabel: () => '확인 단추', body: (c, set) => const Text('내용'))
.then((v) => got = v));
await tester.pumpAndSettle();
await close();
await tester.pumpAndSettle();
expect(got, want, reason: name);
}
});
testWidgets('Enter = 첫 초점: 보통은 [확인], 되돌릴 수 없는 일은 [취소] (관리자 결정 10/22)', (tester) async {
for (final (danger, want) in [(false, true), (true, false)]) {
late BuildContext ctx;
await tester.pumpWidget(MaterialApp(home: Builder(builder: (c) {
ctx = c;
return const Scaffold(body: SizedBox());
})));
bool? got;
unawaited(confirmDialog(ctx,
title: () => '지우기', confirmLabel: () => '확인 단추', danger: () => danger, body: (c, set) => const Text('내용'))
.then((v) => got = v));
await tester.pumpAndSettle();
await tester.sendKeyEvent(LogicalKeyboardKey.enter);
await tester.pumpAndSettle();
expect(got, want, reason: 'danger=$danger');
}
});
testWidgets('창 안에서 바뀌면 제목 · 빨강이 따라 바뀌고 첫 초점은 연 때 그대로', (tester) async {
final flag = ValueNotifier(false);
late BuildContext ctx;
await tester.pumpWidget(MaterialApp(home: Builder(builder: (c) {
ctx = c;
return const Scaffold(body: SizedBox());
})));
bool? got;
unawaited(confirmDialog(ctx,
title: () => flag.value ? '영구 삭제' : '휴지통으로 보내기',
confirmLabel: () => flag.value ? '영구 삭제 단추' : '휴지통으로',
danger: () => flag.value,
body: (c, set) => CheckboxListTile(
value: flag.value, onChanged: (v) => set(() => flag.value = v ?? false), title: const Text('영구로')))
.then((v) => got = v));
await tester.pumpAndSettle();
expect(find.text('휴지통으로 보내기'), findsOneWidget);
FilledButton confirm() => tester.widget<FilledButton>(find.byType(FilledButton));
expect(confirm().style, isNull, reason: '보통 단추');
await tester.tap(find.text('영구로'));
await tester.pumpAndSettle();
expect(find.text('영구 삭제'), findsOneWidget, reason: '제목이 바뀜');
expect(find.text('영구 삭제 단추'), findsOneWidget);
expect(confirm().style, isNotNull, reason: '빨강');
expect(tester.widget<FilledButton>(find.byType(FilledButton)).autofocus, isTrue, reason: '첫 초점은 연 때 그대로 ([확인])');
await tester.tap(find.text('영구 삭제 단추'));
await tester.pumpAndSettle();
expect(got, isTrue);
});
}