import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:jj_mkvmaker/app/app_controller.dart'; import 'package:jj_mkvmaker/app/settings.dart'; import 'package:jj_mkvmaker/platform/windows/desktop_storage_service.dart'; import 'package:jj_mkvmaker/platform/windows/process_media_tool.dart'; import 'package:jj_mkvmaker/services/platform_services.dart'; import 'package:jj_mkvmaker/ui/explorer/style_ask.dart'; /// E6 약속: 파일 탐색기 모양의 처음 값은 기기마다 (Windows = Total Commander) · 예전 판이 저장한 X-plore 는 한 번만 묻는다 void main() { final win = Platform.isWindows; test('처음 값: 새로 설치 (빈 설정) 는 기기의 처음 값 - Windows 는 Total Commander, 묻지 않음', () { final s = AppSettings.fromJson({}); expect(s.explorer.style, win ? 'totalcmd' : 'xplore'); expect(s.explorer.styleAskPending, isFalse); expect(AppSettings().explorer.style, ExplorerSettings.defaultStyle); }); test('저장된 값: 예전 판의 xplore (또는 모양 키가 없던 예전 파일) 는 Windows 에서 한 번 묻고, 고른 windows · totalcmd 는 묻지 않음', () { final old = AppSettings.fromJson({'explorerStyle': 'xplore', 'explorerLayout': 'dual'}); expect([old.explorer.style, old.explorer.styleAskPending], ['xplore', win]); final noKey = AppSettings.fromJson({'explorerLayout': 'dual'}); expect([noKey.explorer.style, noKey.explorer.styleAskPending], ['xplore', win], reason: '그때의 처음 값 (X-plore) 을 덮지 않음'); for (final v in ['windows', 'totalcmd']) { final s = AppSettings.fromJson({'explorerStyle': v, 'explorerLayout': 'dual'}); expect([s.explorer.style, s.explorer.styleAskPending], [v, false]); } final again = AppSettings.fromJson(old.toJson()); expect([again.explorer.style, again.explorer.styleAskPending], ['xplore', false], reason: '한 번 저장하면 (물었다는 표시) 다시 묻지 않음'); }); group('묻는 창 (askExplorerStyleOnce)', () { AppController ctl(Map saved) => AppController(PlatformServices(mediaTool: ProcessMediaTool('x', 'y'), storage: DesktopStorageService())) ..settings = AppSettings.fromJson(saved); Future ask(WidgetTester t, AppController c, {String? pick}) async { final key = GlobalKey(); await t.pumpWidget(MaterialApp(navigatorKey: key, home: const Scaffold(body: SizedBox()))); final f = askExplorerStyleOnce(key.currentContext!, c); await t.pumpAndSettle(); if (pick != null) { expect(find.text('파일 탐색기 모양'), findsOneWidget); await t.tapAt(const Offset(5, 5)); // 창 밖을 눌러도 닫히지 않음 await t.pumpAndSettle(); expect(find.text('파일 탐색기 모양'), findsOneWidget); await t.tap(find.text(pick)); await t.pumpAndSettle(); } return f; } testWidgets('[그대로] 면 X-plore 를 두고 다시 묻지 않음', (t) async { final c = ctl({'explorerStyle': 'xplore', 'explorerLayout': 'dual'})..settings.explorer.styleAskPending = true; expect(await ask(t, c, pick: '그대로'), isTrue); expect([c.settings.explorer.style, c.settings.explorer.styleAskPending], ['xplore', false]); expect(await ask(t, c), isFalse); expect(find.text('파일 탐색기 모양'), findsNothing, reason: '두 번째는 창을 띄우지 않음'); expect(c.settings.toJson()['explorerStyleV2'], isTrue); }); testWidgets('[바꾸기] 면 Total Commander · 물을 것이 없으면 창 없음', (t) async { final c = ctl({'explorerStyle': 'xplore', 'explorerLayout': 'dual'})..settings.explorer.styleAskPending = true; expect(await ask(t, c, pick: '바꾸기'), isTrue); expect([c.settings.explorer.style, c.settings.explorer.styleAskPending], ['totalcmd', false]); final picked = ctl({'explorerStyle': 'windows', 'explorerLayout': 'dual'}); expect(await ask(t, picked), isFalse); expect(picked.settings.explorer.style, 'windows'); }); }); }