98 lines
2.9 KiB
Dart
98 lines
2.9 KiB
Dart
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:marianum_mobile/api/marianumcloud/webdav/queries/list_files/cacheable_file.dart';
|
|
import 'package:marianum_mobile/utils/file_clipboard.dart';
|
|
|
|
CacheableFile _file(String name) =>
|
|
CacheableFile(path: '/$name', isDirectory: false, name: name);
|
|
|
|
void main() {
|
|
// FileClipboard is a singleton — clear between tests so state doesn't leak.
|
|
setUp(FileClipboard.instance.clear);
|
|
|
|
group('FileClipboard.cut', () {
|
|
test('switches to cut state and notifies listeners', () {
|
|
final cb = FileClipboard.instance;
|
|
var notifyCount = 0;
|
|
void listener() => notifyCount++;
|
|
cb.addListener(listener);
|
|
addTearDown(() => cb.removeListener(listener));
|
|
|
|
cb.cut([_file('a.txt')]);
|
|
|
|
expect(cb.operation, FileClipboardOperation.cut);
|
|
expect(cb.files.map((f) => f.name), ['a.txt']);
|
|
expect(cb.isEmpty, isFalse);
|
|
expect(notifyCount, 1);
|
|
});
|
|
|
|
test('empty input is a no-op', () {
|
|
final cb = FileClipboard.instance;
|
|
var notifyCount = 0;
|
|
void listener() => notifyCount++;
|
|
cb.addListener(listener);
|
|
addTearDown(() => cb.removeListener(listener));
|
|
|
|
cb.cut(const []);
|
|
|
|
expect(cb.operation, isNull);
|
|
expect(cb.isEmpty, isTrue);
|
|
expect(notifyCount, 0, reason: 'no state change → no notifyListeners');
|
|
});
|
|
|
|
test('files getter returns an unmodifiable view', () {
|
|
final cb = FileClipboard.instance;
|
|
cb.cut([_file('a.txt')]);
|
|
expect(() => cb.files.add(_file('b.txt')), throwsUnsupportedError);
|
|
});
|
|
});
|
|
|
|
group('FileClipboard.copy', () {
|
|
test('switches to copy state and notifies listeners', () {
|
|
final cb = FileClipboard.instance;
|
|
cb.copy([_file('a.txt'), _file('b.txt')]);
|
|
|
|
expect(cb.operation, FileClipboardOperation.copy);
|
|
expect(cb.files, hasLength(2));
|
|
});
|
|
|
|
test('overwrites a previous cut state', () {
|
|
final cb = FileClipboard.instance;
|
|
cb.cut([_file('cut.txt')]);
|
|
cb.copy([_file('copy.txt')]);
|
|
|
|
expect(cb.operation, FileClipboardOperation.copy);
|
|
expect(cb.files.single.name, 'copy.txt');
|
|
});
|
|
});
|
|
|
|
group('FileClipboard.clear', () {
|
|
test('resets state and notifies', () {
|
|
final cb = FileClipboard.instance;
|
|
cb.copy([_file('a.txt')]);
|
|
var notifyCount = 0;
|
|
void listener() => notifyCount++;
|
|
cb.addListener(listener);
|
|
addTearDown(() => cb.removeListener(listener));
|
|
|
|
cb.clear();
|
|
|
|
expect(cb.operation, isNull);
|
|
expect(cb.isEmpty, isTrue);
|
|
expect(notifyCount, 1);
|
|
});
|
|
|
|
test('clearing an already-empty clipboard is a no-op', () {
|
|
final cb = FileClipboard.instance;
|
|
var notifyCount = 0;
|
|
void listener() => notifyCount++;
|
|
cb.addListener(listener);
|
|
addTearDown(() => cb.removeListener(listener));
|
|
|
|
cb.clear();
|
|
cb.clear();
|
|
|
|
expect(notifyCount, 0);
|
|
});
|
|
});
|
|
}
|