// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

@TestOn('mac-os')

import 'package:test/test.dart';
import 'package:watcher/src/directory_watcher/mac_os.dart';
import 'package:watcher/watcher.dart';

import 'shared.dart';
import '../utils.dart';

void main() {
  watcherFactory = (dir) => MacOSDirectoryWatcher(dir);

  sharedTests();

  test('DirectoryWatcher creates a MacOSDirectoryWatcher on Mac OS', () {
    expect(DirectoryWatcher('.'), TypeMatcher<MacOSDirectoryWatcher>());
  });

  test(
      'does not notify about the watched directory being deleted and '
      'recreated immediately before watching', () async {
    createDir('dir');
    writeFile('dir/old.txt');
    deleteDir('dir');
    createDir('dir');

    await startWatcher(path: 'dir');
    writeFile('dir/newer.txt');
    await expectAddEvent('dir/newer.txt');
  });

  test('emits events for many nested files moved out then immediately back in',
      () async {
    withPermutations(
        (i, j, k) => writeFile('dir/sub/sub-$i/sub-$j/file-$k.txt'));

    await startWatcher(path: 'dir');

    renameDir('dir/sub', 'sub');
    renameDir('sub', 'dir/sub');

    await allowEither(() {
      inAnyOrder(withPermutations(
          (i, j, k) => isRemoveEvent('dir/sub/sub-$i/sub-$j/file-$k.txt')));

      inAnyOrder(withPermutations(
          (i, j, k) => isAddEvent('dir/sub/sub-$i/sub-$j/file-$k.txt')));
    }, () {
      inAnyOrder(withPermutations(
          (i, j, k) => isModifyEvent('dir/sub/sub-$i/sub-$j/file-$k.txt')));
    });
  });
}
