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/net_guard.dart'; import 'package:jj_mkvmaker/app/settings.dart'; import 'package:jj_mkvmaker/core/models.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/home_page.dart'; /// 261: 폰 세로 (노트 10+ 412×869) 의 MKV 세부 정보 - "감지한 언어" 줄이 생겨도 [AI 자막 만들기] 가 밀려 가려지지 않는다 void main() { for (final (detected, dns) in [(false, false), (true, false), (true, true)]) { testWidgets('261 · 266: 폰 세로 · 작업 기록 켬 · 감지한 언어 ${detected ? '있음' : '없음'}${dns ? ' · DNS 닿지 않음 줄' : ''} - [AI 자막 만들기] 가 스크롤 없이 보인다', (tester) async { tester.view.physicalSize = const Size(412, 869); tester.view.devicePixelRatio = 1; addTearDown(tester.view.reset); final c = AppController(PlatformServices( mediaTool: ProcessMediaTool('x', 'y'), storage: DesktopStorageService(), createRecognizer: () => throw UnimplementedError(), createTranslator: () => throw UnimplementedError(), )); c.settings.display.showLog = true; c.settings.mkv.moveTargets = [MoveTarget('보관', r'D:\보관')]; for (var i = 1; i <= 4; i++) { c.videos.add(VideoItem('D:/v/아주 긴 이름의 동영상 파일 $i.mp4')); } c.selected = c.videos.first..aiDetected = detected ? 'en' : null; // 266: DNS 가 닿지 않는 동안 작업 기록 위의 줄 (936 노트 10+ 에서 두 줄이 되어 버튼을 밀어냄) if (dns) { NetGuard.instance.failure.value = DnsFailure('192.0.2.1', '답이 없습니다', DateTime(2026, 10, 12, 8, 42)); addTearDown(() => NetGuard.instance.failure.value = null); } await tester.pumpWidget(MaterialApp(home: HomePage(c: c))); await tester.pump(); expect(tester.takeException(), isNull); final ai = find.text('AI 자막 만들기'); // 화면 밖이면 ListView 가 아예 만들지 않는다 expect(ai, findsOneWidget, reason: '세부 정보 칸 아래로 밀림'); final view = tester.getRect(find.ancestor(of: ai, matching: find.byType(Scrollable)).first); final button = tester.getRect(ai); expect(button.bottom, lessThanOrEqualTo(view.bottom), reason: '버튼 $button · 세부 정보 칸 $view'); if (dns) { // 한 줄 · 버튼도 그 줄에 final line = tester.getRect(find.text('DNS 서버 (192.0.2.1) 에 닿지 않음 (08:42부터)')); final sys = tester.getRect(find.text('시스템 DNS 로 바꾸기')); expect((sys.center.dy - line.center.dy).abs(), lessThan(4), reason: '버튼이 같은 줄'); } }); } }