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); }
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); }