From f3f1cebbc8625e948ca967f278e9500584463808 Mon Sep 17 00:00:00 2001 From: RyuJongJin <266630912+RyuJongJin@users.noreply.github.com> Date: Wed, 21 Oct 2026 00:26:40 +0900 Subject: [PATCH] =?UTF-8?q?WIP=20=EB=B3=B4=EA=B8=B0=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=20=EC=82=AC=EC=A7=84=20=EC=A0=95=EB=B3=B4=20=EC=B0=BD:=20?= =?UTF-8?q?=EB=94=94=EB=B2=84=EA=B7=B8=20=EC=9D=98=EB=AF=B8=20=ED=8A=B8?= =?UTF-8?q?=EB=A6=AC=20assertion=20('node.built',=2028=20=EC=A7=80?= =?UTF-8?q?=EC=A0=81=2010/20)=20-=20=EC=9E=A5=EC=9D=84=20=EC=86=90?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=84=98=EA=B8=B4=20=EB=92=A4=20=EC=9C=84?= =?UTF-8?q?=20=EB=A7=89=EB=8C=80=20=EB=8B=A8=EC=B6=94=EB=A5=BC=20=EB=88=84?= =?UTF-8?q?=EB=A5=B8=20=EA=B7=B8=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EC=95=88?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=B0=BD=EC=9D=84=20=EB=9D=84=EC=9A=B0?= =?UTF-8?q?=EB=A9=B4=20=EC=B0=BD=EC=9D=84=20=EB=8B=AB=EC=9D=84=20=EB=95=8C?= =?UTF-8?q?=20=EB=82=AC=EB=8B=A4=20(=EA=B0=A4=EB=9F=AC=EB=A6=AC=20?= =?UTF-8?q?=EC=A4=84=EA=B3=BC=20=EC=83=81=EA=B4=80=EC=97=86=EC=9D=8C=20-?= =?UTF-8?q?=20=EB=81=84=EA=B3=A0=EB=8F=84=20=EB=82=A8,=20=EC=8B=9C?= =?UTF-8?q?=ED=97=98=EC=9D=B4=20=EB=9D=84=EC=9A=B4=20=EC=B0=BD=20=C2=B7=20?= =?UTF-8?q?=EB=84=98=EA=B8=B0=EC=A7=80=20=EC=95=8A=EC=9D=80=20=EB=95=8C?= =?UTF-8?q?=EB=8A=94=20=EC=95=88=20=EB=82=A8).=20=EC=A7=80=EA=B8=88=20?= =?UTF-8?q?=EC=9E=A5=EB=A9=B4=EC=9D=B4=20=EB=81=9D=EB=82=9C=20=EB=92=A4=20?= =?UTF-8?q?=EB=9D=84=EC=9B=80=20(=EC=9E=AC=ED=98=84=204=EB=B2=88=20?= =?UTF-8?q?=E2=86=92=200=EB=B2=88)=20=C2=B7=20=ED=86=B5=ED=95=A9=20?= =?UTF-8?q?=EC=8B=9C=ED=97=98=20integration=5Ftest/reader=5Fdialog=5Fseman?= =?UTF-8?q?tics=5Ftest.dart=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 --- .../reader_dialog_semantics_test.dart | 60 +++++++++++++++++++ lib/ui/reader_page.dart | 5 ++ 2 files changed, 65 insertions(+) create mode 100644 integration_test/reader_dialog_semantics_test.dart diff --git a/integration_test/reader_dialog_semantics_test.dart b/integration_test/reader_dialog_semantics_test.dart new file mode 100644 index 0000000..9470b00 --- /dev/null +++ b/integration_test/reader_dialog_semantics_test.dart @@ -0,0 +1,60 @@ +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); + }); + } +} diff --git a/lib/ui/reader_page.dart b/lib/ui/reader_page.dart index 05d158e..55c9b1f 100644 --- a/lib/ui/reader_page.dart +++ b/lib/ui/reader_page.dart @@ -882,6 +882,11 @@ class _ReaderPageState extends State { /// X-plore 맞추기 (관리자 지시 10/20): 지금 그림의 사진 정보 (찍은 날 · 기기 · 크기 · 위치). 위치는 [위치 보기] 를 누를 때만 /// 보이고, 지도 · 인터넷으로 보내지 않는다 (링크 없음) Future _showPhotoInfo() async { + // 28 지적 (10/20): 장을 손으로 몇 번 넘긴 뒤 위 막대 단추를 누른 그 이벤트 안에서 창을 띄우면, 창을 닫을 때 디버그 판에서 + // 의미 트리 assertion ('node.built', rendering/object.dart) 이 났다 (Windows 통합 시험에서 재현 - 넘기지 않거나, 시험에서 따로 띄운 + // 창은 괜찮음). 지금 장면이 끝난 뒤에 띄우면 나지 않는다 (재현 시험 4번 → 0번) + await WidgetsBinding.instance.endOfFrame; + if (!mounted) return; final s = src; if (s is! ImageFilesSource || _v.isEmpty) return; final path = s.paths[_cur.page];