diff --git a/integration_test/translate_split_test.dart b/integration_test/translate_split_test.dart index 5360ada..50c5403 100644 --- a/integration_test/translate_split_test.dart +++ b/integration_test/translate_split_test.dart @@ -10,6 +10,7 @@ import 'package:jj_mkvmaker/core/languages.dart'; import 'package:jj_mkvmaker/core/models.dart'; import 'package:jj_mkvmaker/core/output_paths.dart'; import 'package:jj_mkvmaker/services/platform_services.dart'; +import 'package:jj_mkvmaker/ui/browser/browser_toolbar.dart'; import 'package:jj_mkvmaker/ui/browser_page.dart'; import 'support/temp_dir.dart'; import 'package:path/path.dart' as p; @@ -65,7 +66,7 @@ void main() { expect(c.pendingJobs, ['MKV 만들기']); // 화면 분할 열기 → 진행 표시 - await tester.tap(find.byTooltip('작업 현황 보기 · 화면 분할 (Ctrl+Shift+J)')); + await tapToolbar(tester, '작업 현황 보기 · 화면 분할 (Ctrl+Shift+J)', '작업 현황'); await tester.pump(const Duration(milliseconds: 300)); expect(find.text('작업 현황'), findsOneWidget); expect(find.textContaining('▶ 자막 번역'), findsOneWidget); @@ -103,3 +104,23 @@ void main() { await server.close(force: true); }, timeout: const Timeout(Duration(minutes: 15))); } + +/// 도구 막대 단추 누르기: 넓으면 [tip] 단추, 좁으면 (640 미만 - 시험 창 804 너비에 패널) [더 보기] 메뉴의 [item] +Future tapToolbar(WidgetTester tester, String tip, String item) async { + if (find.byTooltip(tip).evaluate().isNotEmpty) { + await tester.tap(find.byTooltip(tip)); + return; + } + // 도구 막대 안의 [더 보기] (앱 맨 위 줄에도 [더 보기] 가 있다) + await tester.tap(find.descendant(of: find.byType(BrowserToolbar), matching: find.byTooltip('더 보기'))); + for (var i = 0; i < 5; i++) { + await tester.pump(const Duration(milliseconds: 100)); + } + await tester.tap(find.text(item).last); + // 고른 결과는 메뉴가 닫힌 뒤에 들어온다 - 번역이 도는 동안은 그리기가 느려 정한 시간이 아니라 닫힐 때까지 + for (var i = 0; i < 50 && find.byType(PopupMenuItem).evaluate().isNotEmpty; i++) { + await tester.runAsync(() => Future.delayed(const Duration(milliseconds: 50))); + await tester.pump(const Duration(milliseconds: 100)); + } + await tester.pump(const Duration(milliseconds: 100)); +} diff --git a/integration_test/web_translate_test.dart b/integration_test/web_translate_test.dart index 2dd2fea..0f6a9d8 100644 --- a/integration_test/web_translate_test.dart +++ b/integration_test/web_translate_test.dart @@ -9,6 +9,7 @@ import 'package:jj_mkvmaker/app/bookmarks_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/browser/browser_toolbar.dart'; import 'package:jj_mkvmaker/ui/browser_page.dart'; import 'support/temp_dir.dart'; import 'package:path/path.dart' as p; @@ -100,7 +101,7 @@ void main() { expect(d['js'], isNot('no script')); // 페이지 스크립트가 돌았다 (그 글도 번역됨) // 2. 번역 버튼 → 원문 - await tester.tap(find.byTooltip('원문 보기 (번역 끄기)')); + await tapToolbar(tester, '원문 보기 (번역 끄기)', '원문 보기 (번역 끄기)'); d = await waitFor((d) => d['h'] == 'Hello world', '원문 보기'); expect(d['h'], 'Hello world'); expect(d['p'], ' Download the video '); @@ -129,7 +130,7 @@ void main() { if (Platform.isAndroid) { // 4. Android 웹뷰는 JavaScript 를 끄면 앱이 넣는 스크립트도 막는다 → 번역 · 페이지 읽기가 안 됨 (설정 설명대로) expect(await dom(), isEmpty); - await tester.tap(find.byTooltip('이 페이지를 한국어(으)로 번역')); + await tapToolbar(tester, '이 페이지를 한국어(으)로 번역', '이 페이지 번역'); await tester.runAsync(() => Future.delayed(const Duration(seconds: 3))); await tester.pump(); // ignore: avoid_print @@ -140,7 +141,7 @@ void main() { expect(d['late'], ''); // setTimeout 도 돌지 않음 // 4. Edge 는 JavaScript 를 꺼도 번역 버튼으로 번역된다 (앱이 넣는 스크립트는 실행) - await tester.tap(find.byTooltip('이 페이지를 한국어(으)로 번역')); + await tapToolbar(tester, '이 페이지를 한국어(으)로 번역', '이 페이지 번역'); d = await waitFor((d) => hangul.hasMatch(d['h']!), 'JavaScript 끈 채 번역'); expect(d['h'], matches(hangul)); expect(d['js'], matches(hangul)); // "no script" 도 번역 @@ -159,3 +160,23 @@ void main() { await server.close(force: true); }, timeout: const Timeout(Duration(minutes: 3))); } + +/// 도구 막대 단추 누르기: 넓으면 [tip] 단추, 좁으면 (640 미만 - 시험 창 804 너비에 패널) [더 보기] 메뉴의 [item] +Future tapToolbar(WidgetTester tester, String tip, String item) async { + if (find.byTooltip(tip).evaluate().isNotEmpty) { + await tester.tap(find.byTooltip(tip)); + return; + } + // 도구 막대 안의 [더 보기] (앱 맨 위 줄에도 [더 보기] 가 있다) + await tester.tap(find.descendant(of: find.byType(BrowserToolbar), matching: find.byTooltip('더 보기'))); + for (var i = 0; i < 5; i++) { + await tester.pump(const Duration(milliseconds: 100)); + } + await tester.tap(find.text(item).last); + // 고른 결과는 메뉴가 닫힌 뒤에 들어온다 - 번역이 도는 동안은 그리기가 느려 정한 시간이 아니라 닫힐 때까지 + for (var i = 0; i < 50 && find.byType(PopupMenuItem).evaluate().isNotEmpty; i++) { + await tester.runAsync(() => Future.delayed(const Duration(milliseconds: 50))); + await tester.pump(const Duration(milliseconds: 100)); + } + await tester.pump(const Duration(milliseconds: 100)); +}