import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:image/image.dart' as img; import 'package:integration_test/integration_test.dart'; import 'package:jj_mkvmaker/app/app_controller.dart'; import 'package:jj_mkvmaker/core/reader_sources.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/reader_page.dart'; import 'package:path/path.dart' as p; /// 28 지적 (10/20): 보기 화면에서 장을 손으로 몇 번 넘긴 뒤 위 막대 [사진 정보 (Exif)] 창을 닫으면 디버그 판에서 /// 의미 트리 assertion ('node.built': is not true, rendering/object.dart) 이 났다. 실제 프레임 · 끌기 애니메이션 (통합 시험) 에서만 나온다. /// 실행: flutter test integration_test\reader_dialog_semantics_test.dart -d windows void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); for (final gallery in [false, true]) { testWidgets('장을 넘긴 뒤 사진 정보 창을 열고 닫아도 오류 없음 (갤러리 줄 $gallery)', (t) async { t.view.physicalSize = const Size(960, 600); t.view.devicePixelRatio = 1; addTearDown(t.view.reset); final tmp = Directory.systemTemp.createTempSync('jj_readersem_'); addTearDown(() => tmp.deleteSync(recursive: true)); final files = [ for (var i = 0; i < 7; i++) (File(p.join(tmp.path, 'p$i.png'))..writeAsBytesSync(img.encodePng(img.Image(width: 300, height: 200)))).path, ]; final c = AppController(PlatformServices(mediaTool: ProcessMediaTool('x', 'y'), storage: DesktopStorageService())); c.settings.readerGallery = gallery; Future wait(int ms) async { for (var i = 0; i < ms ~/ 100; i++) { await t.runAsync(() => Future.delayed(const Duration(milliseconds: 100))); await t.pump(); } } final nav = GlobalKey(); await t.pumpWidget(MaterialApp(navigatorKey: nav, home: const Scaffold(body: SizedBox.expand()))); nav.currentState!.push(MaterialPageRoute( builder: (_) => ReaderPage(c: c, source: ImageFilesSource(files, tempDir: tmp.path, title: 'x'), start: 3))); await wait(1500); for (var k = 0; k < 3; k++) { await t.drag(find.byType(PageView).first, const Offset(-960 * 0.8, 0)); await wait(500); } await t.tap(find.byTooltip('사진 정보 (Exif)').first); await wait(600); expect(find.text('이 그림에는 Exif 정보가 없습니다 (JPEG 사진만 읽음)'), findsOneWidget); await t.tap(find.text('닫기').last); await wait(500); expect(t.takeException(), isNull); await t.pumpWidget(const SizedBox()); await wait(300); }); } }