JJ_MKVMaker/integration_test/windows_mkvportrait_shot_te...

96 lines
4.8 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import 'dart:io';
import 'dart:ui' as ui;
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
import 'package:jj_mkvmaker/app/app_controller.dart';
import 'package:jj_mkvmaker/app/i18n_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/l10n/tr.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';
import 'package:jj_mkvmaker/ui/theme.dart';
import 'package:path/path.dart' as p;
import 'support/temp_dir.dart';
/// 261 · 266 (관리자 지시 10/21): test/mkv_portrait_detail_test 를 실제 글꼴로 - 폰 세로 (노트 10+ 412×869) · 작업 기록 켬 ·
/// 감지한 언어 줄 · DNS 닿지 않음 줄이 있어도 [AI 자막 만들기] 가 스크롤 없이 보이고, DNS 줄은 한 줄 · [시스템 DNS 로 바꾸기] 도 그 줄에.
/// ko · ja × 글자 1.0 · 1.6
void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
final out = Platform.environment['JJ_SHOT_DIR'] ?? '';
for (final lang in ['ko', 'ja']) {
for (final scale in [1.0, 1.6]) {
for (final (detected, dns) in [(false, false), (true, false), (true, true)]) {
final tag = '${lang}_s${scale}_${detected ? 'detected' : 'plain'}${dns ? '_dns' : ''}';
testWidgets('261 · 266 $tag', (t) async {
t.view.physicalSize = const Size(412, 869);
t.view.devicePixelRatio = 1;
addTearDown(t.view.reset);
await t.runAsync(() => i18n.apply(lang, save: false));
addTearDown(() => i18n.apply('ko', save: false));
final tmp = testTempDir('jj_mkvportrait_');
appTempInto(tmp);
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('보관', p.join(tmp.path, '보관'))];
for (var i = 1; i <= 4; i++) {
c.videos.add(VideoItem(p.join(tmp.path, '아주 긴 이름의 동영상 파일 $i.mp4')));
}
c.selected = c.videos.first..aiDetected = detected ? 'en' : null;
if (dns) {
NetGuard.instance.failure.value = DnsFailure('192.0.2.1', '답이 없습니다', DateTime(2026, 10, 12, 8, 42));
addTearDown(() => NetGuard.instance.failure.value = null);
}
final shotKey = GlobalKey();
await t.pumpWidget(RepaintBoundary(
key: shotKey,
child: MaterialApp(
theme: buildTheme(),
debugShowCheckedModeBanner: false,
builder: (ctx, child) => MediaQuery(data: MediaQuery.of(ctx).copyWith(textScaler: TextScaler.linear(scale)), child: child!),
home: HomePage(c: c),
),
));
for (var i = 0; i < 10; i++) {
await t.runAsync(() => Future<void>.delayed(const Duration(milliseconds: 40)));
await t.pump();
}
if (out.isNotEmpty) {
final r = shotKey.currentContext!.findRenderObject()! as RenderRepaintBoundary;
final img = await t.runAsync(() => r.toImage());
final bytes = await t.runAsync(() => img!.toByteData(format: ui.ImageByteFormat.png));
Directory(out).createSync(recursive: true);
File(p.join(out, 'mkvportrait_$tag.png')).writeAsBytesSync(bytes!.buffer.asUint8List());
}
expect(t.takeException(), isNull, reason: '$tag 넘침');
final ai = find.text(tr('AI 자막 만들기'));
expect(ai, findsOneWidget, reason: '$tag: 세부 정보 칸 아래로 밀림 (화면 밖이면 목록이 만들지 않는다)');
final view = t.getRect(find.ancestor(of: ai, matching: find.byType(Scrollable)).first);
final button = t.getRect(ai);
expect(button.bottom, lessThanOrEqualTo(view.bottom), reason: '$tag: 버튼 $button · 세부 정보 칸 $view');
if (dns) {
final line = t.getRect(find.textContaining('192.0.2.1'));
final sys = t.getRect(find.text(tr('시스템 DNS 로 바꾸기')));
expect((sys.center.dy - line.center.dy).abs(), lessThan(4), reason: '$tag: 버튼이 같은 줄 (줄 $line · 버튼 $sys)');
expect(line.height, lessThan(40 * scale), reason: '$tag: 한 줄');
}
});
}
}
}
}