import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:jj_mkvmaker/app/app_controller.dart'; import 'package:jj_mkvmaker/app/version_snapshot.dart'; import 'package:jj_mkvmaker/core/app_update.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/update/update_install.dart'; import 'package:jj_mkvmaker/ui/update_dialog.dart'; /// 업데이트 나누기 (update_dialog 651줄 → lib/ui/update/) 의 모듈 약속 시험. /// 확인 · 고르기 · 설치 · Android 되돌리기 흐름 전체는 update_ui_test 가 본다 void main() { ReleaseInfo rel(String v, {bool zip = true}) => ReleaseInfo( version: v, tag: 'v$v', name: v, notes: '', pageUrl: 'https://example.com/$v', zipUrl: zip ? 'https://example.com/$v.zip' : null); test('update_install (단계): gbText (1GB 이상은 소수 한 자리 GB, 아래는 MB)', () { expect(gbText(1 << 30), '1.0GB'); expect(gbText(3 * (1 << 29)), '1.5GB'); expect(gbText(5 << 20), '5MB'); expect(gbText(0), '0MB'); }); test('update_dialog (버전 고르기): 처음 고를 버전 = 이 기기용 파일이 있는 가장 새것, 없으면 지금, 그것도 없으면 맨 앞', () { expect(initialVersionPick([rel('3', zip: false), rel('2'), rel('1')], '1').version, '2'); expect(initialVersionPick([rel('3', zip: false), rel('2', zip: false)], '2').version, '2'); expect(initialVersionPick([rel('3', zip: false), rel('2', zip: false)], '9').version, '3'); }); testWidgets('update_install (단계): withProgressDialog - 끝나면 창을 닫고 null, 실패하면 그 글 · 진행은 % 로', (t) async { late BuildContext ctx; await t.pumpWidget(MaterialApp(home: Builder(builder: (c) { ctx = c; return const Scaffold(); }))); void Function(int, int)? report; var release = false; final ok = withProgressDialog(ctx, '복사 중', (onProgress) async { report = onProgress; while (!release) { await Future.delayed(const Duration(milliseconds: 10)); } return null; }); await t.pump(); expect(find.text('복사 중'), findsOneWidget); expect(find.text('준비하는 중'), findsOneWidget); report!(1, 4); await t.pump(); expect(find.text('25%'), findsOneWidget); release = true; await t.pump(const Duration(milliseconds: 20)); await t.pumpAndSettle(); expect(await ok, isNull); expect(find.text('복사 중'), findsNothing); final bad = withProgressDialog(ctx, '되살리는 중', (_) async => throw StateError('자리 없음')); await t.pumpAndSettle(); expect(await bad, contains('자리 없음')); expect(find.text('되살리는 중'), findsNothing); }); test('update_install (단계): 설정 보관 저장소가 없으면 (VersionSnapshot 없음) 아무것도 하지 않음 · 던지지 않음', () async { final was = VersionSnapshot.instance; VersionSnapshot.instance = null; addTearDown(() => VersionSnapshot.instance = was); final c = AppController(PlatformServices(mediaTool: ProcessMediaTool('x', 'y'), storage: DesktopStorageService())); final before = c.settings.run.lastRunVersion; await saveVersionSnapshot(c, '9.9.9'); expect(c.settings.run.lastRunVersion, before); }); testWidgets('update_dialog (버전 고르기): 바뀐 내용이 비면 "(설명 없음)" · 표는 글자 그대로', (t) async { await t.pumpWidget(MaterialApp( home: Scaffold( body: Column(children: [ const SizedBox(height: 100, child: UpdateNotes('')), UpdateBadge('최신', Colors.green), ])))); expect(find.text('(설명 없음)'), findsOneWidget); expect(find.text('최신'), findsOneWidget); }); }