From 1396ba41c889e7f043618c88c0b9039577fb9553 Mon Sep 17 00:00:00 2001 From: RyuJongJin <266630912+RyuJongJin@users.noreply.github.com> Date: Mon, 19 Oct 2026 21:20:36 +0900 Subject: [PATCH] =?UTF-8?q?WIP=20=EC=8B=9C=ED=97=98:=20Total=20Commander?= =?UTF-8?q?=20=EB=AA=A8=EC=96=91=20F8=20=3D=20=EC=A7=80=EC=9A=B0=EA=B8=B0?= =?UTF-8?q?=20-=20=ED=99=95=EC=9D=B8=20=EC=B0=BD=20[=EC=B7=A8=EC=86=8C]=20?= =?UTF-8?q?=EB=A9=B4=20=EA=B7=B8=EB=8C=80=EB=A1=9C,=20[=ED=9C=B4=EC=A7=80?= =?UTF-8?q?=ED=86=B5=EC=9C=BC=EB=A1=9C]=20=EB=A9=B4=20(=EA=B0=80=EC=A7=9C)?= =?UTF-8?q?=20=ED=9C=B4=EC=A7=80=ED=86=B5=EC=9C=BC=EB=A1=9C=20(28=20?= =?UTF-8?q?=EC=A7=80=EC=A0=81)=20(=EA=B2=80=ED=86=A0=20=EB=8C=80=EA=B8=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- test/explorer_test.dart | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/test/explorer_test.dart b/test/explorer_test.dart index d70bf15..da54d9d 100644 --- a/test/explorer_test.dart +++ b/test/explorer_test.dart @@ -26,6 +26,7 @@ import 'package:jj_mkvmaker/ui/storage_page.dart'; import 'package:jj_mkvmaker/ui/path_label.dart'; import 'package:path/path.dart' as p; import 'support/fake_recycle_bin.dart'; +import 'package:jj_mkvmaker/platform/windows/recycle_bin.dart' show recycleBinForTest; /// 다른 앱으로 열기를 기록만 하는 셸 (실제로 프로그램을 띄우지 않게) class _Shell extends NoopShell { @@ -1297,6 +1298,39 @@ void main() { await calm(tester); }); + testWidgets('83 (28 지적): Total Commander 모양 F8 = 지우기 - 확인 창 [취소] 면 그대로, [휴지통으로] 면 휴지통으로', (tester) async { + final bin = recycleBinForTest; + if (bin is! FakeRecycleBin) return markTestSkipped('실제 휴지통 (JJ_TEST_REAL_RECYCLE=1) 에서는 건너뜀'); + if (!Platform.isWindows) return markTestSkipped('휴지통은 Windows 만 (Android 는 앱 휴지통 시험)'); + final victim = File(p.join(left, 'tcdel.txt'))..writeAsStringSync('x'); + c.settings.explorerStyle = 'totalcmd'; + await open(tester); + await settle(tester, () => find.text('tcdel').evaluate().isNotEmpty); + await act(tester, () => tester.tap(find.text('tcdel'))); + await settle(tester, () => false, rounds: 15); + + // F8 → 확인 창 → [취소]: 아무것도 지우지 않음 + await act(tester, () => tester.sendKeyEvent(LogicalKeyboardKey.f8)); + await calm(tester); + expect(find.text('휴지통으로 보내기'), findsOneWidget); + expect(find.widgetWithText(FilledButton, '휴지통으로'), findsOneWidget, reason: '처음 값은 휴지통 (영구 삭제 아님)'); + await tester.tap(find.text('취소').last); + await calm(tester); + expect(victim.existsSync(), isTrue); + expect(bin.items, isEmpty); + + // F8 → [휴지통으로]: 휴지통 길로 (영구 삭제가 아님) + await act(tester, () => tester.sendKeyEvent(LogicalKeyboardKey.f8)); + await calm(tester); + await act(tester, () => tester.tap(find.widgetWithText(FilledButton, '휴지통으로'))); + await settle(tester, () => !victim.existsSync() && find.byType(SnackBar).evaluate().isNotEmpty); + expect(victim.existsSync(), isFalse); + expect(bin.items.keys, [victim.path], reason: '휴지통으로 보냄 (되돌릴 수 있음)'); + expect(File(p.join(left, 'doc.txt')).existsSync(), isTrue, reason: '고른 것만'); + expect(find.text('되돌리기'), findsOneWidget); + await calm(tester); + }); + testWidgets('83: Windows 탐색기 모양 단축키 - Ctrl+A 모두 표시 · Ctrl+C 담기 · Ctrl+V 붙여넣기', (tester) async { c.settings.explorerStyle = 'windows'; await open(tester);