diff --git a/SabreTools.FileTypes.Test/FileTypeToolTests.cs b/SabreTools.FileTypes.Test/FileTypeToolTests.cs
new file mode 100644
index 00000000..9a4eb332
--- /dev/null
+++ b/SabreTools.FileTypes.Test/FileTypeToolTests.cs
@@ -0,0 +1,128 @@
+using System;
+using System.IO;
+using SabreTools.Hashing;
+using SabreTools.IO.Extensions;
+using Xunit;
+
+namespace SabreTools.FileTypes.Test
+{
+ public class FileTypeToolTests
+ {
+ private static readonly HashType[] _defaultHashes = [HashType.CRC32, HashType.MD5, HashType.SHA1];
+
+ private const long _expectedSize = 125;
+ private const string _expectedCrc = "ba02a660";
+ private const string _expectedMd5 = "b722871eaa950016296184d026c5dec9";
+ private const string _expectedSha1 = "eea1ee2d801d830c4bdad4df3c8da6f9f52d1a9f";
+
+ #region GetInfo
+
+ [Fact]
+ public void GetInfo_File_EmptyPath()
+ {
+ string input = string.Empty;
+ BaseFile actual = FileTypeTool.GetInfo(input, _defaultHashes);
+
+ Assert.Null(actual.Filename);
+ Assert.Null(actual.Size);
+ Assert.Null(actual.CRC);
+ Assert.Null(actual.MD5);
+ Assert.Null(actual.SHA1);
+ }
+
+ [Fact]
+ public void GetInfo_File_NotExists()
+ {
+ string input = "INVALID";
+ BaseFile actual = FileTypeTool.GetInfo(input, _defaultHashes);
+
+ Assert.Null(actual.Filename);
+ Assert.Null(actual.Size);
+ Assert.Null(actual.CRC);
+ Assert.Null(actual.MD5);
+ Assert.Null(actual.SHA1);
+ }
+
+ [Fact]
+ public void GetInfo_File_NoHeader()
+ {
+ string input = Path.Combine(Environment.CurrentDirectory, "TestData", "file-to-hash.bin");
+ BaseFile actual = FileTypeTool.GetInfo(input, _defaultHashes);
+
+ Assert.Equal("file-to-hash.bin", actual.Filename);
+ Assert.Equal(_expectedSize, actual.Size);
+ Assert.Equal(_expectedCrc, actual.CRC.ToHexString());
+ Assert.Equal(_expectedMd5, actual.MD5.ToHexString());
+ Assert.Equal(_expectedSha1, actual.SHA1.ToHexString());
+ }
+
+ [Fact]
+ public void GetInfo_File_NullHeader()
+ {
+ string input = Path.Combine(Environment.CurrentDirectory, "TestData", "file-to-hash.bin");
+ string? header = null;
+ BaseFile actual = FileTypeTool.GetInfo(input, _defaultHashes, header);
+
+ Assert.Equal("file-to-hash.bin", actual.Filename);
+ Assert.Equal(_expectedSize, actual.Size);
+ Assert.Equal(_expectedCrc, actual.CRC.ToHexString());
+ Assert.Equal(_expectedMd5, actual.MD5.ToHexString());
+ Assert.Equal(_expectedSha1, actual.SHA1.ToHexString());
+ }
+
+ [Fact]
+ public void GetInfo_File_EmptyHeader()
+ {
+ string input = Path.Combine(Environment.CurrentDirectory, "TestData", "file-to-hash.bin");
+ string? header = string.Empty;
+ BaseFile actual = FileTypeTool.GetInfo(input, _defaultHashes, header);
+
+ Assert.Equal("file-to-hash.bin", actual.Filename);
+ Assert.Equal(_expectedSize, actual.Size);
+ Assert.Equal(_expectedCrc, actual.CRC.ToHexString());
+ Assert.Equal(_expectedMd5, actual.MD5.ToHexString());
+ Assert.Equal(_expectedSha1, actual.SHA1.ToHexString());
+ }
+
+ [Fact]
+ public void GetInfo_File_NonMatchingHeader()
+ {
+ string input = Path.Combine(Environment.CurrentDirectory, "TestData", "file-to-hash.bin");
+ string? header = "nes";
+ BaseFile actual = FileTypeTool.GetInfo(input, _defaultHashes, header);
+
+ Assert.Equal("file-to-hash.bin", actual.Filename);
+ Assert.Equal(_expectedSize, actual.Size);
+ Assert.Equal(_expectedCrc, actual.CRC.ToHexString());
+ Assert.Equal(_expectedMd5, actual.MD5.ToHexString());
+ Assert.Equal(_expectedSha1, actual.SHA1.ToHexString());
+ }
+
+ [Fact]
+ public void GetInfo_Stream_Null()
+ {
+ Stream? input = null;
+ BaseFile actual = FileTypeTool.GetInfo(input, _defaultHashes);
+
+ Assert.Null(actual.Size);
+ Assert.Null(actual.CRC);
+ Assert.Null(actual.MD5);
+ Assert.Null(actual.SHA1);
+ }
+
+ [Fact]
+ public void GetInfo_Stream_Valid()
+ {
+ string path = Path.Combine(Environment.CurrentDirectory, "TestData", "file-to-hash.bin");
+ Stream? input = File.OpenRead(path);
+ BaseFile actual = FileTypeTool.GetInfo(input, _defaultHashes);
+
+ Assert.Equal(_expectedSize, actual.Size);
+ Assert.Equal(_expectedCrc, actual.CRC.ToHexString());
+ Assert.Equal(_expectedMd5, actual.MD5.ToHexString());
+ Assert.Equal(_expectedSha1, actual.SHA1.ToHexString());
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/SabreTools.FileTypes.Test/SabreTools.FileTypes.Test.csproj b/SabreTools.FileTypes.Test/SabreTools.FileTypes.Test.csproj
index 26cab7a2..a32c3749 100644
--- a/SabreTools.FileTypes.Test/SabreTools.FileTypes.Test.csproj
+++ b/SabreTools.FileTypes.Test/SabreTools.FileTypes.Test.csproj
@@ -7,6 +7,16 @@
enable
+
+
+
+
+
+
+ Always
+
+
+
diff --git a/SabreTools.FileTypes.Test/TestData/file-to-hash.bin b/SabreTools.FileTypes.Test/TestData/file-to-hash.bin
new file mode 100644
index 00000000..7724139e
--- /dev/null
+++ b/SabreTools.FileTypes.Test/TestData/file-to-hash.bin
@@ -0,0 +1 @@
+This is just a file that has a known set of hashes to make sure that everything with hashing is still working as anticipated.
\ No newline at end of file
diff --git a/SabreTools.FileTypes/FileTypeTool.cs b/SabreTools.FileTypes/FileTypeTool.cs
index 6bc0fc2e..e58666ff 100644
--- a/SabreTools.FileTypes/FileTypeTool.cs
+++ b/SabreTools.FileTypes/FileTypeTool.cs
@@ -43,8 +43,10 @@ namespace SabreTools.FileTypes
/// Populated BaseFile object if success, empty on error
public static BaseFile GetInfo(string input, HashType[] hashes, string? header)
{
- // Add safeguard if file doesn't exist
- if (!File.Exists(input))
+ // Add safeguard if file is invalid
+ if (string.IsNullOrEmpty(input))
+ return new BaseFile();
+ else if (!File.Exists(input))
return new BaseFile();
try