public async Task TokensFiredForNewDirectoryContentsOnRename()
        {
            using (var root = new DisposableFileSystem())
            {
                using (var fileSystemWatcher = new MockFileSystemWatcher(root.RootPath))
                {
                    using (var physicalFilesWatcher = new PhysicalFilesWatcher(root.RootPath + Path.DirectorySeparatorChar, fileSystemWatcher))
                    {
                        using (var provider = new PhysicalFileProvider(root.RootPath, physicalFilesWatcher))
                        {
                            var oldDirectoryName = Guid.NewGuid().ToString();
                            var oldSubDirectoryName = Guid.NewGuid().ToString();
                            var oldSubDirectoryPath = Path.Combine(oldDirectoryName, oldSubDirectoryName);
                            var oldFileName = Guid.NewGuid().ToString();
                            var oldFilePath = Path.Combine(oldDirectoryName, oldSubDirectoryName, oldFileName);

                            var newDirectoryName = Guid.NewGuid().ToString();
                            var newSubDirectoryName = Guid.NewGuid().ToString();
                            var newSubDirectoryPath = Path.Combine(newDirectoryName, newSubDirectoryName);
                            var newFileName = Guid.NewGuid().ToString();
                            var newFilePath = Path.Combine(newDirectoryName, newSubDirectoryName, newFileName);

                            Directory.CreateDirectory(Path.Combine(root.RootPath, newDirectoryName));
                            Directory.CreateDirectory(Path.Combine(root.RootPath, newDirectoryName, newSubDirectoryName));
                            File.Create(Path.Combine(root.RootPath, newDirectoryName, newSubDirectoryName, newFileName));

                            await Task.Delay(WaitTimeForTokenToFire);

                            var oldDirectoryToken = provider.Watch(oldDirectoryName);
                            var oldSubDirectoryToken = provider.Watch(oldSubDirectoryPath);
                            var oldFileToken = provider.Watch(oldFilePath);

                            var newDirectoryToken = provider.Watch(newDirectoryName);
                            var newSubDirectoryToken = provider.Watch(newSubDirectoryPath);
                            var newFileToken = provider.Watch(newFilePath);

                            await Task.Delay(WaitTimeForTokenToFire);

                            Assert.False(oldDirectoryToken.HasChanged);
                            Assert.False(oldSubDirectoryToken.HasChanged);
                            Assert.False(oldFileToken.HasChanged);
                            Assert.False(newDirectoryToken.HasChanged);
                            Assert.False(newSubDirectoryToken.HasChanged);
                            Assert.False(newFileToken.HasChanged);

                            fileSystemWatcher.CallOnRenamed(new RenamedEventArgs(WatcherChangeTypes.Renamed, root.RootPath, newDirectoryName, oldDirectoryName));
                            await Task.Delay(WaitTimeForTokenToFire);

                            Assert.True(oldDirectoryToken.HasChanged);
                            Assert.False(oldSubDirectoryToken.HasChanged);
                            Assert.False(oldFileToken.HasChanged);
                            Assert.True(newDirectoryToken.HasChanged);
                            Assert.True(newSubDirectoryToken.HasChanged);
                            Assert.True(newFileToken.HasChanged);
                        }
                    }
                }
            }
        }
        public async Task TokensFiredForOldAndNewNamesOnRename()
        {
            using (var root = new DisposableFileSystem())
            {
                using (var fileSystemWatcher = new MockFileSystemWatcher(root.RootPath))
                {
                    using (var physicalFilesWatcher = new PhysicalFilesWatcher(root.RootPath + Path.DirectorySeparatorChar, fileSystemWatcher))
                    {
                        using (var provider = new PhysicalFileProvider(root.RootPath, physicalFilesWatcher))
                        {
                            var oldFileName = Guid.NewGuid().ToString();
                            var oldToken = provider.Watch(oldFileName);

                            var newFileName = Guid.NewGuid().ToString();
                            var newToken = provider.Watch(newFileName);

                            fileSystemWatcher.CallOnRenamed(new RenamedEventArgs(WatcherChangeTypes.Renamed, root.RootPath, newFileName, oldFileName));
                            await Task.Delay(WaitTimeForTokenToFire);
                            
                            Assert.True(oldToken.HasChanged);
                            Assert.True(newToken.HasChanged);
                        }
                    }
                }
            }
        }