Skip to content

Commit

Permalink
Test file filter and file sort (#12)
Browse files Browse the repository at this point in the history
  • Loading branch information
CharlesHolmes authored Mar 23, 2024
1 parent 6e779c6 commit e4e50ef
Show file tree
Hide file tree
Showing 4 changed files with 224 additions and 29 deletions.
51 changes: 22 additions & 29 deletions GoProVideoRenamer.UnitTests/File/FileFilterTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ public class FileFilterTests
public void FileFilter_ShouldReturnGoProAvcVideos()
{
var testFiles = new[] {
GetMockedIVideoFile("GH010001.mp4"),
GetMockedIVideoFile("GH010002.mp4"),
GetMockedIVideoFile("GH010003.mp4")
IVideoFileMocks.GetMockedIVideoFile("GH010001.mp4"),
IVideoFileMocks.GetMockedIVideoFile("GH010002.mp4"),
IVideoFileMocks.GetMockedIVideoFile("GH010003.mp4")
};
var fileFilter = new FileFilter();

Expand All @@ -33,9 +33,9 @@ public void FileFilter_ShouldReturnGoProAvcVideos()
public void FileFilter_ShouldReturnGoProHevcVideos()
{
var testFiles = new[] {
GetMockedIVideoFile("GX010001.mp4"),
GetMockedIVideoFile("GX010002.mp4"),
GetMockedIVideoFile("GX010003.mp4")
IVideoFileMocks.GetMockedIVideoFile("GX010001.mp4"),
IVideoFileMocks.GetMockedIVideoFile("GX010002.mp4"),
IVideoFileMocks.GetMockedIVideoFile("GX010003.mp4")
};
var fileFilter = new FileFilter();

Expand All @@ -48,9 +48,9 @@ public void FileFilter_ShouldReturnGoProHevcVideos()
public void FileFilter_ShouldIdentifySingleVideos()
{
var testFiles = new[] {
GetMockedIVideoFile("GH010001.mp4"),
GetMockedIVideoFile("GH010002.mp4"),
GetMockedIVideoFile("GH010003.mp4")
IVideoFileMocks.GetMockedIVideoFile("GH010001.mp4"),
IVideoFileMocks.GetMockedIVideoFile("GH010002.mp4"),
IVideoFileMocks.GetMockedIVideoFile("GH010003.mp4")
};
var fileFilter = new FileFilter();

Expand All @@ -63,9 +63,9 @@ public void FileFilter_ShouldIdentifySingleVideos()
public void FileFilter_ShouldIdentifyChapteredVideos()
{
var testFiles = new[] {
GetMockedIVideoFile("GH010001.mp4"),
GetMockedIVideoFile("GH020001.mp4"),
GetMockedIVideoFile("GH030001.mp4")
IVideoFileMocks.GetMockedIVideoFile("GH010001.mp4"),
IVideoFileMocks.GetMockedIVideoFile("GH020001.mp4"),
IVideoFileMocks.GetMockedIVideoFile("GH030001.mp4")
};
var fileFilter = new FileFilter();

Expand All @@ -78,9 +78,9 @@ public void FileFilter_ShouldIdentifyChapteredVideos()
public void FileFilter_ShouldNotIdentifyLoopedVideos()
{
var testFiles = new[] {
GetMockedIVideoFile("GHAA0001.mp4"),
GetMockedIVideoFile("GHAA0002.mp4"),
GetMockedIVideoFile("GHAA0003.mp4")
IVideoFileMocks.GetMockedIVideoFile("GHAA0001.mp4"),
IVideoFileMocks.GetMockedIVideoFile("GHAA0002.mp4"),
IVideoFileMocks.GetMockedIVideoFile("GHAA0003.mp4")
};
var fileFilter = new FileFilter();

Expand All @@ -93,15 +93,15 @@ public void FileFilter_ShouldNotIdentifyLoopedVideos()
public void FileFilter_ShouldNotReturnOtherFiles()
{
var goproFiles = new[] {
GetMockedIVideoFile("GH010001.mp4"),
GetMockedIVideoFile("GH020001.mp4"),
GetMockedIVideoFile("GH030001.mp4")
IVideoFileMocks.GetMockedIVideoFile("GH010001.mp4"),
IVideoFileMocks.GetMockedIVideoFile("GH020001.mp4"),
IVideoFileMocks.GetMockedIVideoFile("GH030001.mp4")
};
var notGoproFiles = new[] {
GetMockedIVideoFile("test.txt"),
GetMockedIVideoFile("other_video.mp4"),
GetMockedIVideoFile("never gonna give you up.mp3"),
GetMockedIVideoFile("system32")
IVideoFileMocks.GetMockedIVideoFile("test.txt"),
IVideoFileMocks.GetMockedIVideoFile("other_video.mp4"),
IVideoFileMocks.GetMockedIVideoFile("never gonna give you up.mp3"),
IVideoFileMocks.GetMockedIVideoFile("system32")
};
var allFiles = goproFiles.Union(notGoproFiles);
var fileFilter = new FileFilter();
Expand All @@ -111,12 +111,5 @@ public void FileFilter_ShouldNotReturnOtherFiles()
matchingVideos.Should().Contain(goproFiles);
matchingVideos.Should().NotContain(notGoproFiles);
}

private IVideoFile GetMockedIVideoFile(string fileName)
{
var result = new Mock<IVideoFile>();
result.Setup(m => m.Name).Returns(fileName);
return result.Object;
}
}
}
144 changes: 144 additions & 0 deletions GoProVideoRenamer.UnitTests/File/FileSortTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
using FluentAssertions;
using GoProVideoRenamer.File;
using GoProVideoRenamer.File.VideoFile.Interfaces;
using GoProVideoRenamer.File.VideoFile.Numbered;
using GoProVideoRenamer.File.VideoFile.Numbered.Interfaces;
using Moq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GoProVideoRenamer.UnitTests.File
{
[TestClass]
public class FileSortTests
{
[TestMethod]
public void FileSort_ShouldOrderGoproFiles()
{
var file1 = IVideoFileMocks.GetIVideoFileWithMockedIFileInfo("GX010001.mp4");
var numbered1 = new NumberedVideoFile(1, file1);
var file2 = IVideoFileMocks.GetIVideoFileWithMockedIFileInfo("GX010002.mp4");
var numbered2 = new NumberedVideoFile(2, file2);
var file3 = IVideoFileMocks.GetIVideoFileWithMockedIFileInfo("GX010003.mp4");
var numbered3 = new NumberedVideoFile(3, file3);
var file4 = IVideoFileMocks.GetIVideoFileWithMockedIFileInfo("GX010004.mp4");
var numbered4 = new NumberedVideoFile(4, file4);

var files = new[]
{
file1,
file4,
file2,
file3
};

var numberedFactory = new Mock<INumberedVideoFileFactory>();
numberedFactory.Setup(m => m.Create(1, file1)).Returns(numbered1);
numberedFactory.Setup(m => m.Create(2, file2)).Returns(numbered2);
numberedFactory.Setup(m => m.Create(3, file3)).Returns(numbered3);
numberedFactory.Setup(m => m.Create(4, file4)).Returns(numbered4);
var fileSort = new FileSort(numberedFactory.Object);

var result = fileSort.GetOrderedFiles(files, null);

result.Should().Equal([numbered1, numbered2, numbered3, numbered4]);
}

[TestMethod]
public void FileSort_ShouldOrderChapteredFiles()
{
var file1 = IVideoFileMocks.GetIVideoFileWithMockedIFileInfo("GX010001.mp4");
var numbered1 = new NumberedVideoFile(1, file1);
var file2 = IVideoFileMocks.GetIVideoFileWithMockedIFileInfo("GX020001.mp4");
var numbered2 = new NumberedVideoFile(2, file2);
var file3 = IVideoFileMocks.GetIVideoFileWithMockedIFileInfo("GX030001.mp4");
var numbered3 = new NumberedVideoFile(3, file3);
var file4 = IVideoFileMocks.GetIVideoFileWithMockedIFileInfo("GX040001.mp4");
var numbered4 = new NumberedVideoFile(4, file4);

var files = new[]
{
file1,
file4,
file2,
file3
};

var numberedFactory = new Mock<INumberedVideoFileFactory>();
numberedFactory.Setup(m => m.Create(1, file1)).Returns(numbered1);
numberedFactory.Setup(m => m.Create(2, file2)).Returns(numbered2);
numberedFactory.Setup(m => m.Create(3, file3)).Returns(numbered3);
numberedFactory.Setup(m => m.Create(4, file4)).Returns(numbered4);
var fileSort = new FileSort(numberedFactory.Object);

var result = fileSort.GetOrderedFiles(files, null);

result.Should().Equal([numbered1, numbered2, numbered3, numbered4]);
}

[TestMethod]
public void FileSort_ShouldOrderIndividualAndChapteredFiles()
{
var file1 = IVideoFileMocks.GetIVideoFileWithMockedIFileInfo("GX010001.mp4");
var numbered1 = new NumberedVideoFile(1, file1);
var file2 = IVideoFileMocks.GetIVideoFileWithMockedIFileInfo("GX010002.mp4");
var numbered2 = new NumberedVideoFile(2, file2);
var file3 = IVideoFileMocks.GetIVideoFileWithMockedIFileInfo("GX020002.mp4");
var numbered3 = new NumberedVideoFile(3, file3);
var file4 = IVideoFileMocks.GetIVideoFileWithMockedIFileInfo("GX030002.mp4");
var numbered4 = new NumberedVideoFile(4, file4);
var file5 = IVideoFileMocks.GetIVideoFileWithMockedIFileInfo("GX040002.mp4");
var numbered5 = new NumberedVideoFile(5, file5);
var file6 = IVideoFileMocks.GetIVideoFileWithMockedIFileInfo("GX010003.mp4");
var numbered6 = new NumberedVideoFile(6, file6);

var files = new[]
{
file1,
file4,
file5,
file2,
file6,
file3
};

var numberedFactory = new Mock<INumberedVideoFileFactory>();
numberedFactory.Setup(m => m.Create(1, file1)).Returns(numbered1);
numberedFactory.Setup(m => m.Create(2, file2)).Returns(numbered2);
numberedFactory.Setup(m => m.Create(3, file3)).Returns(numbered3);
numberedFactory.Setup(m => m.Create(4, file4)).Returns(numbered4);
numberedFactory.Setup(m => m.Create(5, file5)).Returns(numbered5);
numberedFactory.Setup(m => m.Create(6, file6)).Returns(numbered6);
var fileSort = new FileSort(numberedFactory.Object);

var result = fileSort.GetOrderedFiles(files, null);

result.Should().Equal([numbered1, numbered2, numbered3, numbered4, numbered5, numbered6]);
}

[TestMethod]
public void FileSort_ShouldThrowIfFilesAreDuplicate()
{
var file1 = IVideoFileMocks.GetIVideoFileWithMockedIFileInfo("GX010001.mp4");
var numbered1 = new NumberedVideoFile(1, file1);
var file2 = IVideoFileMocks.GetIVideoFileWithMockedIFileInfo("GX010001.mp4");
var numbered2 = new NumberedVideoFile(2, file2);

var files = new[]
{
file1,
file2
};

var numberedFactory = new Mock<INumberedVideoFileFactory>();
numberedFactory.Setup(m => m.Create(1, file1)).Returns(numbered1);
numberedFactory.Setup(m => m.Create(2, file2)).Returns(numbered2);
var fileSort = new FileSort(numberedFactory.Object);

Assert.ThrowsException<ArgumentException>(() => fileSort.GetOrderedFiles(files, null));
}
}
}
29 changes: 29 additions & 0 deletions GoProVideoRenamer.UnitTests/File/IVideoFileMocks.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using GoProVideoRenamer.File.VideoFile;
using GoProVideoRenamer.File.VideoFile.Interfaces;
using Moq;
using System;
using System.Collections.Generic;
using System.IO.Abstractions;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GoProVideoRenamer.UnitTests.File
{
internal class IVideoFileMocks
{
public static IVideoFile GetMockedIVideoFile(string fileName)
{
var result = new Mock<IVideoFile>();
result.Setup(m => m.Name).Returns(fileName);
return result.Object;
}

public static IVideoFile GetIVideoFileWithMockedIFileInfo(string fileName)
{
var fileInfo = new Mock<IFileInfo>();
fileInfo.Setup(m => m.Name).Returns(fileName);
return new VideoFile(fileInfo.Object);
}
}
}
29 changes: 29 additions & 0 deletions GoProVideoRenamer/File/FileSort.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public FileSort(INumberedVideoFileFactory numberedVideoFileFactory)
// https://community.gopro.com/s/article/GoPro-Camera-File-Naming-Convention?language=en_US
public List<INumberedVideoFile> GetOrderedFiles(IEnumerable<IVideoFile> files, int? startingNumber)
{
VerifyNoDuplicates(files);
var filesByNumber = new SortedList<int, List<IVideoFile>>();
foreach (IVideoFile file in files)
{
Expand All @@ -39,5 +40,33 @@ public List<INumberedVideoFile> GetOrderedFiles(IEnumerable<IVideoFile> files, i
.Select((file, i) => _numberedVideoFileFactory.Create(i + firstNumber, file))
.ToList();
}

private struct FileIdentifier
{
public int SerialNumber;
public int ChapterNumber;

public FileIdentifier(IVideoFile file)
{
SerialNumber = file.FileNumber;
ChapterNumber = file.ChapterNumber;
}
}

private void VerifyNoDuplicates(IEnumerable<IVideoFile> files)
{
var filesById = new HashSet<FileIdentifier>();
foreach (FileIdentifier id in files.Select(f => new FileIdentifier(f)))
{
if (filesById.Contains(id))
{
throw new ArgumentException("Duplicate files detected in input; cannot proceed");
}
else
{
filesById.Add(id);
}
}
}
}
}

0 comments on commit e4e50ef

Please sign in to comment.