import 'dart:io'; import 'package:flutter_test/flutter_test.dart'; import 'package:jj_mkvmaker/app/settings.dart'; import 'package:jj_mkvmaker/app/sync/sync_diff.dart'; import 'package:jj_mkvmaker/core/rsync_filter.dart'; import 'package:path/path.dart' as p; /// live_sync 를 나눈 SyncDiff 의 약속 (실제 폴더로): 보낼 것 · 지울 것 ("− ") · 거르기 · 개수 한도 void main() { late Directory tmp; setUp(() => tmp = Directory.systemTemp.createTempSync('jj_diff_')); tearDown(() => tmp.deleteSync(recursive: true)); void put(String path, String text) => File(p.join(tmp.path, path)) ..createSync(recursive: true) ..writeAsStringSync(text); test('약속 SyncDiff.of: 새 것 · 크기가 다른 것은 보낼 것, 지우기 포함이면 받는 쪽에만 있는 것은 "− ", 거른 것은 세지 않음', () async { put('src/new.txt', 'n'); put('src/same.txt', 'same'); put('src/changed.txt', 'longer'); put('src/sub/a.log', 'skip'); put('dst/same.txt', 'same'); put('dst/changed.txt', 'x'); put('dst/only.txt', 'gone'); final now = DateTime.now(); for (final f in ['src/same.txt', 'dst/same.txt']) { File(p.join(tmp.path, f)).setLastModifiedSync(now); } final pair = LiveSyncPair(p.join(tmp.path, 'src'), p.join(tmp.path, 'dst')); final send = await SyncDiff.of(pair, filter: RsyncFilter.parse('--exclude=*.log')); expect(send.toSet(), {'new.txt', 'changed.txt'}, reason: '같은 것 · 거른 것 (*.log) 은 빠지고, 지우기 없음'); final mirror = await SyncDiff.of(pair.copyWith(delete: true)); expect(mirror, contains('− only.txt')); expect(mirror, contains('sub/a.log'), reason: '거르기가 없으면 보낸다'); expect((await SyncDiff.of(pair.copyWith(delete: true), limit: 1)).length, 1); expect(File(p.join(tmp.path, 'dst', 'only.txt')).existsSync(), isTrue, reason: '계산만 하고 바꾸지 않는다'); }); test('약속 SyncDiff.of: 원본이 없으면 빈 목록', () async { expect(await SyncDiff.of(LiveSyncPair(p.join(tmp.path, 'none'), p.join(tmp.path, 'dst'), delete: true)), isEmpty); }); }