public IDuplicateReader CreateReader()
        {
            IFileInfo        dupFileInfo   = _fileSystem.FileInfo.FromFileName(_config.DuplicateFilePath);
            IDuplicateReader correctReader = _readers.SingleOrDefault(r => r.CanHandle(dupFileInfo));

            return(correctReader ?? throw new ArgumentException($"Could not find a compatible reader for \"{dupFileInfo.FullName}\"."));
        }
        public void CreateReaderThrowsIfNoReadersCanHandleFile()
        {
            // Arrange
            IFileSystem      fs = Substitute.For <IFileSystem>();
            IFileInfoFactory fileInfoFactory = Substitute.For <IFileInfoFactory>();

            fileInfoFactory.FromFileName(Arg.Any <string>())
            .ReturnsForAnyArgs(Substitute.For <FileInfoBase>());
            fs.FileInfo.ReturnsForAnyArgs(fileInfoFactory);

            IDuplicateReader incorrectReader1 = Substitute.For <IDuplicateReader>();

            incorrectReader1.CanHandle(Arg.Any <FileInfoBase>()).Returns(false);
            IDuplicateReader incorrectReader2 = Substitute.For <IDuplicateReader>();

            incorrectReader2.CanHandle(Arg.Any <FileInfoBase>()).Returns(false);

            DuplicateReaderFactory uut = new DuplicateReaderFactory(
                config: Substitute.For <IDuplicateHandlerConfiguration>(),
                fileSystem: fs,
                readers: new[] { incorrectReader1, incorrectReader2 });

            // Act & Assert
            Assert.Throws <ArgumentException>(() => uut.CreateReader());
        }
        public void CreateReaderChoosesCorrectReader()
        {
            // Arrange
            IFileSystem      fs = Substitute.For <IFileSystem>();
            IFileInfoFactory fileInfoFactory = Substitute.For <IFileInfoFactory>();

            fileInfoFactory.FromFileName(Arg.Any <string>())
            .ReturnsForAnyArgs(Substitute.For <FileInfoBase>());
            fs.FileInfo.ReturnsForAnyArgs(fileInfoFactory);

            IDuplicateReader correctReader = Substitute.For <IDuplicateReader>();

            correctReader.CanHandle(Arg.Any <FileInfoBase>()).Returns(true);
            IDuplicateReader incorrectReader1 = Substitute.For <IDuplicateReader>();

            incorrectReader1.CanHandle(Arg.Any <FileInfoBase>()).Returns(false);
            IDuplicateReader incorrectReader2 = Substitute.For <IDuplicateReader>();

            incorrectReader2.CanHandle(Arg.Any <FileInfoBase>()).Returns(false);

            DuplicateReaderFactory uut = new DuplicateReaderFactory(
                config: Substitute.For <IDuplicateHandlerConfiguration>(),
                fileSystem: fs,
                readers: new[] { incorrectReader1, correctReader, incorrectReader2 });

            // Act
            IDuplicateReader selectedReader = uut.CreateReader();

            // Assert
            Assert.Same(correctReader, selectedReader);
        }
Esempio n. 4
0
        public void ProcessDuplicates()
        {
            IDuplicateReader dupReader = _readerFactory.CreateReader();

            foreach (DuplicateGroup group in dupReader)
            {
                GroupFile[] checkedFiles = group.Files.Where(f => f.Checked == true).ToArray();

                // If there are no checked files, we're done
                if (!checkedFiles.Any())
                {
                    continue;
                }

                GroupFile[] goodFiles = group.Files
                                        .Where(f => IsGoodPath(f))
                                        .ToArray();

                IEnumerable <GroupFile> stagedFiles = group.Files.Except(goodFiles);
                IEnumerable <GroupFile> keepFiles   = group.Files.Except(checkedFiles);

                // Delete the checked files
                foreach (GroupFile checkedFile in checkedFiles)
                {
                    _fileModifier.Delete(checkedFile);
                }

                // Isolate the files we intend to move
                GroupFile[] filesToMove = stagedFiles.Intersect(keepFiles).ToArray();

                // If there's nothing to move, we're done
                if (!filesToMove.Any())
                {
                    continue;
                }

                // Figure out where the files are moving to
                IEnumerable <string> goodDirectories = goodFiles
                                                       .Select(f => _fileSystem.Path.GetDirectoryName(f.FullName))
                                                       .Distinct();

                // If there isn't exacty one destination, we don't know where the files go
                if (goodDirectories.Count() != 1)
                {
                    continue;
                }

                string destinationDir = goodDirectories.Single();

                // Move each file
                foreach (GroupFile keeper in filesToMove)
                {
                    // Build the destination directory
                    string destPath = _fileSystem.Path.Combine(destinationDir, _fileSystem.Path.GetFileName(keeper.FullName));
                    _fileModifier.Move(keeper, destPath);
                }
            }
        }
        private IDuplicateReaderFactory ArrangeReaderFactoryForGroups(params DuplicateGroup[] groups)
        {
            IDuplicateReader reader = Substitute.For <IDuplicateReader>();

            reader.GetEnumerator().Returns(new List <DuplicateGroup>(groups).GetEnumerator());

            IDuplicateReaderFactory readerFactory = Substitute.For <IDuplicateReaderFactory>();

            readerFactory.CreateReader().Returns(reader);

            return(readerFactory);
        }