blob: 488b6079644c9ad0eaeb6c0e2eb0dfcbd206d3af [file] [log] [blame]
import 'dart:async';
import 'dart:io';
import 'package:test/test.dart';
import 'package:watcher/watcher.dart';
void main() {
_MemFs memFs;
setUp(() {
memFs = _MemFs();
registerCustomWatcherFactory(_MemFsWatcherFactory(memFs));
});
tearDown(() async {
unregisterCustomWatcherFactory('MemFs');
});
test('notifes for files', () async {
var watcher = FileWatcher('file.txt');
var completer = Completer<WatchEvent>();
watcher.events.listen((event) => completer.complete(event));
await watcher.ready;
memFs.add('file.txt');
var event = await completer.future;
expect(event.type, ChangeType.ADD);
expect(event.path, 'file.txt');
});
test('notifes for directories', () async {
var watcher = DirectoryWatcher('dir');
var completer = Completer<WatchEvent>();
watcher.events.listen((event) => completer.complete(event));
await watcher.ready;
memFs.add('dir');
var event = await completer.future;
expect(event.type, ChangeType.ADD);
expect(event.path, 'dir');
});
test('unregister works', () async {
var memFactory = _MemFsWatcherFactory(memFs);
unregisterCustomWatcherFactory(memFactory.id);
var completer = Completer<dynamic>();
var watcher = FileWatcher('file.txt');
watcher.events.listen((e) {}, onError: (e) => completer.complete(e));
await watcher.ready;
memFs.add('file.txt');
var result = await completer.future;
expect(result, isA<FileSystemException>());
});
test('registering twice throws', () async {
expect(() => registerCustomWatcherFactory(_MemFsWatcherFactory(memFs)),
throwsA(isA<ArgumentError>()));
});
}
class _MemFs {
final _streams = <String, Set<StreamController<WatchEvent>>>{};
StreamController<WatchEvent> watchStream(String path) {
var controller = StreamController<WatchEvent>();
_streams.putIfAbsent(path, () => {}).add(controller);
return controller;
}
void add(String path) {
var controllers = _streams[path];
if (controllers != null) {
for (var controller in controllers) {
controller.add(WatchEvent(ChangeType.ADD, path));
}
}
}
void remove(String path) {
var controllers = _streams[path];
if (controllers != null) {
for (var controller in controllers) {
controller.add(WatchEvent(ChangeType.REMOVE, path));
}
}
}
}
class _MemFsWatcher implements FileWatcher, DirectoryWatcher, Watcher {
final String _path;
final StreamController<WatchEvent> _controller;
_MemFsWatcher(this._path, this._controller);
@override
String get path => _path;
@override
String get directory => throw UnsupportedError('directory is not supported');
@override
Stream<WatchEvent> get events => _controller.stream;
@override
bool get isReady => true;
@override
Future<void> get ready async {}
}
class _MemFsWatcherFactory implements CustomWatcherFactory {
final _MemFs _memFs;
_MemFsWatcherFactory(this._memFs);
@override
String get id => 'MemFs';
@override
DirectoryWatcher createDirectoryWatcher(String path,
{Duration pollingDelay}) =>
_MemFsWatcher(path, _memFs.watchStream(path));
@override
FileWatcher createFileWatcher(String path, {Duration pollingDelay}) =>
_MemFsWatcher(path, _memFs.watchStream(path));
}