110 lines
5.6 KiB
Dart
110 lines
5.6 KiB
Dart
import 'dart:io';
|
|
import 'dart:ui' as ui;
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/gestures.dart' show kSecondaryButton;
|
|
import 'package:flutter/rendering.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:integration_test/integration_test.dart';
|
|
import 'package:jj_mkvmaker/ui/theme.dart';
|
|
import 'package:jj_mkvmaker/app/app_controller.dart';
|
|
import 'package:jj_mkvmaker/app/i18n_controller.dart';
|
|
import 'package:jj_mkvmaker/core/models.dart';
|
|
import 'package:jj_mkvmaker/main.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/license_texts.dart';
|
|
import 'package:path/path.dart' as p;
|
|
|
|
/// 140 · 158 기기 감독 확인용 (Windows): 실제 앱 (JjMkvMakerApp) 에서 Flutter 기본 화면 · 버튼이 화면 언어로 나오는지 PNG (JJ_SHOT_DIR).
|
|
/// 라이선스 화면 · 글 칸의 복사 · 붙여넣기 메뉴 · 뒤로 버튼 이름. 설정은 메모리에만 (저장하지 않음).
|
|
void main() {
|
|
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
|
|
// ⑦ 밝은 화면 캡처: JJ_SHOT_THEME=light (JJ_SHOT_DIR 를 따로 두어 어두운 것과 견줌)
|
|
if (Platform.environment['JJ_SHOT_THEME'] == 'light') JjColors.use(Brightness.light);
|
|
final out = Platform.environment['JJ_SHOT_DIR'] ?? p.join(Directory.systemTemp.path, 'jj_shots_i18n');
|
|
final navKey = GlobalKey<NavigatorState>();
|
|
final shotKey = GlobalKey();
|
|
registerAppLicenses();
|
|
|
|
Future<void> settle(WidgetTester t, [int rounds = 10]) async {
|
|
for (var i = 0; i < rounds; i++) {
|
|
await t.runAsync(() => Future<void>.delayed(const Duration(milliseconds: 100)));
|
|
await t.pump();
|
|
}
|
|
}
|
|
|
|
Future<void> shot(WidgetTester t, String name) async {
|
|
await settle(t, 3);
|
|
// 앱 전체 (창 · 메뉴 · 말풍선까지 - 앱을 감싼 경계)
|
|
final b = shotKey.currentContext!.findRenderObject()! as RenderRepaintBoundary;
|
|
final img = await t.runAsync(() => b.toImage());
|
|
final bytes = await t.runAsync(() => img!.toByteData(format: ui.ImageByteFormat.png));
|
|
Directory(out).createSync(recursive: true);
|
|
File(p.join(out, '$name.png')).writeAsBytesSync(bytes!.buffer.asUint8List());
|
|
}
|
|
|
|
for (final lang in ['ko', 'ja']) {
|
|
testWidgets('140 · 158: Flutter 기본 화면 · 버튼이 화면 언어로 ($lang)', (t) async {
|
|
t.view.physicalSize = const Size(1280, 800);
|
|
t.view.devicePixelRatio = 1;
|
|
final c = AppController(PlatformServices(mediaTool: ProcessMediaTool('x', 'y'), storage: DesktopStorageService()));
|
|
if (Platform.environment['JJ_SHOT_THEME'] == 'light') c.settings.display.brightness = 'light';
|
|
await t.runAsync(() => i18n.apply(lang, save: false));
|
|
await t.runAsync(() => t.pumpWidget(RepaintBoundary(key: shotKey, child: JjMkvMakerApp(controller: c, navigatorKey: navKey))));
|
|
await settle(t);
|
|
// 1) 라이선스 화면 (제목 · 뒤로)
|
|
showLicensePage(context: navKey.currentContext!, applicationName: 'JJ_MKVMaker');
|
|
await settle(t, 15);
|
|
await shot(t, 'i18n_${lang}_licenses');
|
|
// 목록을 다 읽은 뒤 (줄마다 "라이선스 n개" 같은 개수 글이 화면 언어로)
|
|
for (var i = 0; i < 600 && find.text('aria2').evaluate().isEmpty; i++) {
|
|
await settle(t, 1);
|
|
}
|
|
await shot(t, 'i18n_${lang}_licenses_loaded');
|
|
// 2) 뒤로 버튼 이름 (말풍선)
|
|
await t.longPress(find.byType(BackButton).first);
|
|
await settle(t, 5);
|
|
await shot(t, 'i18n_${lang}_back_tooltip');
|
|
navKey.currentState!.pop();
|
|
await settle(t, 5);
|
|
// 3) 글 칸의 복사 · 붙여넣기 메뉴 (오른쪽 클릭)
|
|
final ctl = TextEditingController(text: 'JJ_MKVMaker 123');
|
|
showDialog<void>(
|
|
context: navKey.currentContext!,
|
|
builder: (_) => AlertDialog(content: SizedBox(width: 360, child: TextField(controller: ctl))),
|
|
);
|
|
await settle(t, 5);
|
|
await t.tapAt(t.getCenter(find.byType(TextField)), buttons: kSecondaryButton);
|
|
await settle(t, 5);
|
|
await shot(t, 'i18n_${lang}_text_menu');
|
|
await t.runAsync(() => i18n.apply('ko', save: false));
|
|
});
|
|
}
|
|
|
|
// 61: 일본어 가로 (태블릿 크기) 에서 맨 위 버튼 글이 잘리는지 - MKV 첫 화면의 맨 위 줄.
|
|
// 실제 서비스 (AI 자막 · 플레이어 버튼이 보이게), 체크 0개 · 50개 ("(50)" 이 붙으면 더 좁다). S10 Ultra 가로 ≈ 1480 · 앱 크기 90% ≈ 1644
|
|
for (final (w, h) in [(1644, 1027), (1480, 924), (1280, 800), (1138, 712), (960, 600), (412, 900)]) {
|
|
for (final checked in [0, 50]) {
|
|
testWidgets('61: 일본어 가로 ${w}x$h · 체크 $checked - 맨 위 버튼', (t) async {
|
|
t.view.physicalSize = Size(w.toDouble(), h.toDouble());
|
|
t.view.devicePixelRatio = 1;
|
|
addTearDown(t.view.reset);
|
|
final c = AppController(PlatformServices.create());
|
|
if (Platform.environment['JJ_SHOT_THEME'] == 'light') c.settings.display.brightness = 'light';
|
|
for (var i = 0; i < checked; i++) {
|
|
final v = VideoItem(p.join(Directory.systemTemp.path, 'jj_i18n_none', 'v$i.mp4'));
|
|
c.videos.add(v);
|
|
c.checked.add(v);
|
|
}
|
|
await t.runAsync(() => i18n.apply('ja', save: false));
|
|
await t.runAsync(() => t.pumpWidget(RepaintBoundary(key: shotKey, child: JjMkvMakerApp(controller: c, navigatorKey: navKey))));
|
|
await settle(t, 20);
|
|
await shot(t, 'i18n_ja_home_${w}_c$checked');
|
|
await t.runAsync(() => i18n.apply('ko', save: false));
|
|
});
|
|
}
|
|
}
|
|
}
|