import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:jj_mkvmaker/app/app_controller.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/settings_page.dart'; /// 255: 세로 폰의 환경 설정 - 위의 묶음 바로가기가 한 줄 (여러 줄로 감겨 화면 절반을 차지하지 않게) void main() { for (final (size, oneRow) in [(const Size(412, 900), true), (const Size(1400, 900), false)]) { testWidgets('255: 묶음 바로가기 (${size.width.round()}×${size.height.round()}) - 좁으면 한 줄', (tester) async { final tmp = Directory.systemTemp.createTempSync('jj_set255_'); addTearDown(() => tmp.deleteSync(recursive: true)); const pp = MethodChannel('plugins.flutter.io/path_provider'); tester.binding.defaultBinaryMessenger.setMockMethodCallHandler(pp, (_) async => tmp.path); addTearDown(() => tester.binding.defaultBinaryMessenger.setMockMethodCallHandler(pp, null)); tester.view.physicalSize = size; tester.view.devicePixelRatio = 1; addTearDown(tester.view.reset); final c = AppController(PlatformServices(mediaTool: ProcessMediaTool('x', 'y'), storage: DesktopStorageService())); await tester.runAsync(() => tester.pumpWidget(MaterialApp(home: SettingsPage(c: c)))); // 관리자 지시 (10/20, 15): 부하가 크면 (여러 시험을 함께 돌림) 칸들이 시작한 진짜 입출력 (레지스트리 조회 · 구성 요소 목록 · // 파일) 이 늦게 끝나 화면이 바뀌거나, 화면을 치운 뒤에야 끝나 예외가 났다 - 화면이 멈출 때까지 (위젯 수가 세 번 같음) 진짜 시간을 흘린다 Future settle() async { var last = -1, same = 0; for (var i = 0; i < 150 && same < 3; i++) { await tester.runAsync(() => Future.delayed(const Duration(milliseconds: 20))); await tester.pump(); final n = find.byType(Widget).evaluate().length; same = n == last ? same + 1 : 0; last = n; } } await settle(); final tops = {for (final e in find.byType(ActionChip).evaluate()) tester.getRect(find.byWidget(e.widget)).top.round()}; expect(tops, isNotEmpty); if (oneRow) { expect(tops, hasLength(1), reason: '좁으면 한 줄 (옆으로 밀기)'); } expect(tester.takeException(), isNull); await tester.pumpWidget(const SizedBox()); await settle(); // 치운 뒤에도 남은 비동기 일이 이 시험 안에서 끝나게 await tester.pump(const Duration(seconds: 1)); }, timeout: const Timeout(Duration(minutes: 2))); // 화면이 멈출 때까지 기다리므로 부하가 크면 30초를 넘을 수 있음 } }