import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:jj_mkvmaker/core/file_ops.dart'; import 'package:jj_mkvmaker/core/text_codec.dart'; import 'package:jj_mkvmaker/ui/explorer_grid.dart'; import 'package:jj_mkvmaker/ui/text_viewer.dart'; import 'package:path/path.dart' as p; /// X-plore 비교 g · h: 격자 보기 · 글 뷰어 void main() { late Directory tmp; setUp(() => tmp = Directory.systemTemp.createTempSync('jj_xptools_')); tearDown(() => tmp.deleteSync(recursive: true)); testWidgets('h 글 뷰어: CP949 를 알아보고 나눠 읽기 [더 읽기]', (t) async { final text = List.generate(40, (i) => '줄 $i 한글').join('\n'); final f = File(p.join(tmp.path, 'k.txt'))..writeAsBytesSync(encodeText(text, 'CP949').bytes); await t.pumpWidget(MaterialApp(home: TextViewerPage(path: f.path, chunk: 120))); for (var i = 0; i < 20 && find.textContaining('줄 0').evaluate().isEmpty; i++) { await t.runAsync(() => Future.delayed(const Duration(milliseconds: 30))); await t.pump(); } expect(find.text('줄 0 한글'), findsOneWidget); expect(find.text('더 읽기'), findsOneWidget, reason: '큰 파일은 나눠 읽음'); for (var k = 0; k < 10 && find.text('더 읽기').evaluate().isNotEmpty; k++) { await t.tap(find.text('더 읽기')); for (var i = 0; i < 5; i++) { await t.runAsync(() => Future.delayed(const Duration(milliseconds: 30))); await t.pump(); } } expect(find.text('더 읽기'), findsNothing, reason: '다 읽음'); expect(find.text('CP949 (EUC-KR)'), findsOneWidget); }); testWidgets('g 격자 보기: 그림 · 동영상만, 누르면 열기', (t) async { final png = File(p.join(tmp.path, 'a.png'))..writeAsBytesSync([0x89, 0x50]); final opened = []; final entries = [ FileEntry(png.path, isDir: false, size: 2, modified: DateTime(2026)), FileEntry(p.join(tmp.path, 'b.mkv'), isDir: false, size: 2, modified: DateTime(2026)), FileEntry(p.join(tmp.path, 'c.txt'), isDir: false, size: 2, modified: DateTime(2026)), FileEntry(p.join(tmp.path, 'dir'), isDir: true, modified: DateTime(2026)), ]; expect(ExplorerGridPage.pick(entries, const ['png']).map((e) => e.name), ['a.png', 'b.mkv']); await t.pumpWidget(MaterialApp( home: ExplorerGridPage( title: 'T', entries: entries, imageExts: const ['png'], videoThumb: (_) async => null, onOpen: (e) async => opened.add(e.name), ), )); await t.pump(); expect(find.text('a.png'), findsOneWidget); expect(find.text('c.txt'), findsNothing); await t.tap(find.text('b.mkv')); expect(opened, ['b.mkv']); }); }