96 lines
4.8 KiB
Dart
96 lines
4.8 KiB
Dart
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: 한 줄');
|
||
}
|
||
});
|
||
}
|
||
}
|
||
}
|
||
}
|