Files
SabreTools/SabreTools.DatTools.Test/ParserTests.cs

250 lines
14 KiB
C#
Raw Normal View History

2020-12-20 14:20:03 -08:00
using System;
using System.IO;
using SabreTools.DatFiles;
2025-04-14 12:32:26 -04:00
using SabreTools.Reports;
2020-12-20 14:20:03 -08:00
using Xunit;
2025-04-14 12:33:15 -04:00
namespace SabreTools.DatTools.Test
2020-12-20 14:20:03 -08:00
{
public class ParserTests
{
2025-04-14 12:10:09 -04:00
[Fact]
public void CreateDatFile_Default_Logiqx()
{
var datFile = Parser.CreateDatFile();
Assert.Equal(DatFormat.Logiqx, datFile.Header.GetFieldValue<DatFormat>(DatHeader.DatFormatKey));
Assert.Equal(0, datFile.Items.DatStatistics.TotalCount);
Assert.Equal(0, datFile.ItemsDB.DatStatistics.TotalCount);
}
[Theory]
[InlineData((DatFormat)0x00, DatFormat.Logiqx)]
[InlineData(DatFormat.Logiqx, DatFormat.Logiqx)]
[InlineData(DatFormat.LogiqxDeprecated, DatFormat.LogiqxDeprecated)]
[InlineData(DatFormat.SoftwareList, DatFormat.SoftwareList)]
[InlineData(DatFormat.Listxml, DatFormat.Listxml)]
[InlineData(DatFormat.OfflineList, DatFormat.OfflineList)]
[InlineData(DatFormat.SabreXML, DatFormat.SabreXML)]
[InlineData(DatFormat.OpenMSX, DatFormat.OpenMSX)]
[InlineData(DatFormat.ArchiveDotOrg, DatFormat.ArchiveDotOrg)]
[InlineData(DatFormat.ClrMamePro, DatFormat.ClrMamePro)]
[InlineData(DatFormat.RomCenter, DatFormat.RomCenter)]
[InlineData(DatFormat.DOSCenter, DatFormat.DOSCenter)]
[InlineData(DatFormat.AttractMode, DatFormat.AttractMode)]
[InlineData(DatFormat.MissFile, DatFormat.MissFile)]
[InlineData(DatFormat.CSV, DatFormat.CSV)]
[InlineData(DatFormat.SSV, DatFormat.SSV)]
[InlineData(DatFormat.TSV, DatFormat.TSV)]
[InlineData(DatFormat.Listrom, DatFormat.Listrom)]
[InlineData(DatFormat.EverdriveSMDB, DatFormat.EverdriveSMDB)]
[InlineData(DatFormat.SabreJSON, DatFormat.SabreJSON)]
[InlineData(DatFormat.RedumpSFV, DatFormat.RedumpSFV)]
[InlineData(DatFormat.RedumpMD2, DatFormat.RedumpMD2)]
[InlineData(DatFormat.RedumpMD4, DatFormat.RedumpMD4)]
[InlineData(DatFormat.RedumpMD5, DatFormat.RedumpMD5)]
[InlineData(DatFormat.RedumpSHA1, DatFormat.RedumpSHA1)]
[InlineData(DatFormat.RedumpSHA256, DatFormat.RedumpSHA256)]
[InlineData(DatFormat.RedumpSHA384, DatFormat.RedumpSHA384)]
[InlineData(DatFormat.RedumpSHA512, DatFormat.RedumpSHA512)]
[InlineData(DatFormat.RedumpSpamSum, DatFormat.RedumpSpamSum)]
public void CreateDatFile_Format_NoBaseDat(DatFormat datFormat, DatFormat expected)
{
var datFile = Parser.CreateDatFile(datFormat, baseDat: null);
Assert.Equal(expected, datFile.Header.GetFieldValue<DatFormat>(DatHeader.DatFormatKey));
Assert.Equal(0, datFile.Items.DatStatistics.TotalCount);
Assert.Equal(0, datFile.ItemsDB.DatStatistics.TotalCount);
}
[Theory]
[InlineData((DatFormat)0x00, DatFormat.Logiqx)]
[InlineData(DatFormat.Logiqx, DatFormat.Logiqx)]
[InlineData(DatFormat.LogiqxDeprecated, DatFormat.LogiqxDeprecated)]
[InlineData(DatFormat.SoftwareList, DatFormat.SoftwareList)]
[InlineData(DatFormat.Listxml, DatFormat.Listxml)]
[InlineData(DatFormat.OfflineList, DatFormat.OfflineList)]
[InlineData(DatFormat.SabreXML, DatFormat.SabreXML)]
[InlineData(DatFormat.OpenMSX, DatFormat.OpenMSX)]
[InlineData(DatFormat.ArchiveDotOrg, DatFormat.ArchiveDotOrg)]
[InlineData(DatFormat.ClrMamePro, DatFormat.ClrMamePro)]
[InlineData(DatFormat.RomCenter, DatFormat.RomCenter)]
[InlineData(DatFormat.DOSCenter, DatFormat.DOSCenter)]
[InlineData(DatFormat.AttractMode, DatFormat.AttractMode)]
[InlineData(DatFormat.MissFile, DatFormat.MissFile)]
[InlineData(DatFormat.CSV, DatFormat.CSV)]
[InlineData(DatFormat.SSV, DatFormat.SSV)]
[InlineData(DatFormat.TSV, DatFormat.TSV)]
[InlineData(DatFormat.Listrom, DatFormat.Listrom)]
[InlineData(DatFormat.EverdriveSMDB, DatFormat.EverdriveSMDB)]
[InlineData(DatFormat.SabreJSON, DatFormat.SabreJSON)]
[InlineData(DatFormat.RedumpSFV, DatFormat.RedumpSFV)]
[InlineData(DatFormat.RedumpMD2, DatFormat.RedumpMD2)]
[InlineData(DatFormat.RedumpMD4, DatFormat.RedumpMD4)]
[InlineData(DatFormat.RedumpMD5, DatFormat.RedumpMD5)]
[InlineData(DatFormat.RedumpSHA1, DatFormat.RedumpSHA1)]
[InlineData(DatFormat.RedumpSHA256, DatFormat.RedumpSHA256)]
[InlineData(DatFormat.RedumpSHA384, DatFormat.RedumpSHA384)]
[InlineData(DatFormat.RedumpSHA512, DatFormat.RedumpSHA512)]
[InlineData(DatFormat.RedumpSpamSum, DatFormat.RedumpSpamSum)]
public void CreateDatFile_Format_BaseDat(DatFormat datFormat, DatFormat expected)
{
var baseDat = Parser.CreateDatFile();
baseDat.Header.SetFieldValue<string?>(DatHeader.FileNameKey, "filename");
var datFile = Parser.CreateDatFile(datFormat, baseDat);
Assert.Equal(expected, datFile.Header.GetFieldValue<DatFormat>(DatHeader.DatFormatKey));
Assert.Equal("filename", datFile.Header.GetFieldValue<string?>(DatHeader.FileNameKey));
Assert.Equal(0, datFile.Items.DatStatistics.TotalCount);
Assert.Equal(0, datFile.ItemsDB.DatStatistics.TotalCount);
}
[Theory]
[InlineData((DatFormat)0x00, (DatFormat)0x00)] // I think this is a bug
[InlineData(DatFormat.Logiqx, DatFormat.Logiqx)]
[InlineData(DatFormat.LogiqxDeprecated, DatFormat.LogiqxDeprecated)]
[InlineData(DatFormat.SoftwareList, DatFormat.SoftwareList)]
[InlineData(DatFormat.Listxml, DatFormat.Listxml)]
[InlineData(DatFormat.OfflineList, DatFormat.OfflineList)]
[InlineData(DatFormat.SabreXML, DatFormat.SabreXML)]
[InlineData(DatFormat.OpenMSX, DatFormat.OpenMSX)]
[InlineData(DatFormat.ArchiveDotOrg, DatFormat.ArchiveDotOrg)]
[InlineData(DatFormat.ClrMamePro, DatFormat.ClrMamePro)]
[InlineData(DatFormat.RomCenter, DatFormat.RomCenter)]
[InlineData(DatFormat.DOSCenter, DatFormat.DOSCenter)]
[InlineData(DatFormat.AttractMode, DatFormat.AttractMode)]
[InlineData(DatFormat.MissFile, DatFormat.MissFile)]
[InlineData(DatFormat.CSV, DatFormat.CSV)]
[InlineData(DatFormat.SSV, DatFormat.SSV)]
[InlineData(DatFormat.TSV, DatFormat.TSV)]
[InlineData(DatFormat.Listrom, DatFormat.Listrom)]
[InlineData(DatFormat.EverdriveSMDB, DatFormat.EverdriveSMDB)]
[InlineData(DatFormat.SabreJSON, DatFormat.SabreJSON)]
[InlineData(DatFormat.RedumpSFV, DatFormat.RedumpSFV)]
[InlineData(DatFormat.RedumpMD2, DatFormat.RedumpMD2)]
[InlineData(DatFormat.RedumpMD4, DatFormat.RedumpMD4)]
[InlineData(DatFormat.RedumpMD5, DatFormat.RedumpMD5)]
[InlineData(DatFormat.RedumpSHA1, DatFormat.RedumpSHA1)]
[InlineData(DatFormat.RedumpSHA256, DatFormat.RedumpSHA256)]
[InlineData(DatFormat.RedumpSHA384, DatFormat.RedumpSHA384)]
[InlineData(DatFormat.RedumpSHA512, DatFormat.RedumpSHA512)]
[InlineData(DatFormat.RedumpSpamSum, DatFormat.RedumpSpamSum)]
public void CreateDatFile_Format_FromHeader(DatFormat datFormat, DatFormat expected)
{
DatHeader datHeader = new DatHeader();
2025-04-14 12:33:15 -04:00
datHeader.SetFieldValue(DatHeader.DatFormatKey, datFormat);
2025-04-14 12:10:09 -04:00
datHeader.SetFieldValue<string?>(DatHeader.FileNameKey, "filename");
DatModifiers datModifiers = new DatModifiers();
datModifiers.Quotes = true;
var datFile = Parser.CreateDatFile(datHeader, datModifiers);
Assert.Equal(expected, datFile.Header.GetFieldValue<DatFormat>(DatHeader.DatFormatKey));
Assert.Equal("filename", datFile.Header.GetFieldValue<string?>(DatHeader.FileNameKey));
Assert.True(datFile.Modifiers.Quotes);
Assert.Equal(0, datFile.Items.DatStatistics.TotalCount);
Assert.Equal(0, datFile.ItemsDB.DatStatistics.TotalCount);
}
2025-04-14 12:32:26 -04:00
[Theory]
[InlineData(null, (DatFormat)0x00, 0)]
[InlineData("test-logiqx.xml", DatFormat.Logiqx, 6)]
//[InlineData(null, DatFormat.LogiqxDeprecated, 0)] // Not parsed separately
[InlineData("test-softwarelist.xml", DatFormat.SoftwareList, 6)]
[InlineData("test-listxml.xml", DatFormat.Listxml, 19)]
[InlineData("test-offlinelist.xml", DatFormat.OfflineList, 1)]
//[InlineData(null, DatFormat.SabreXML, 0)] // TODO: Create good-enough test file for this
[InlineData("test-openmsx.xml", DatFormat.OpenMSX, 3)]
[InlineData("test-archivedotorg.xml", DatFormat.ArchiveDotOrg, 1)]
[InlineData("test-cmp.dat", DatFormat.ClrMamePro, 6)]
[InlineData("test-romcenter.dat", DatFormat.RomCenter, 1)]
[InlineData("test-doscenter.dat", DatFormat.DOSCenter, 1)]
[InlineData("test-attractmode.txt", DatFormat.AttractMode, 1)]
//[InlineData(null, DatFormat.MissFile, 0)] // Parsing is not supported
//[InlineData(null, DatFormat.CSV, 0)] // TODO: Create good-enough test file for this
//[InlineData(null, DatFormat.SSV, 0)] // TODO: Create good-enough test file for this
//[InlineData(null, DatFormat.TSV, 0)] // TODO: Create good-enough test file for this
[InlineData("test-listrom.txt", DatFormat.Listrom, 6)]
[InlineData("test-smdb.txt", DatFormat.EverdriveSMDB, 1)]
//[InlineData(null, DatFormat.SabreJSON, 0)] // TODO: Create good-enough test file for this
[InlineData("test-sfv.sfv", DatFormat.RedumpSFV, 1)]
[InlineData("test-md2.md2", DatFormat.RedumpMD2, 1)]
[InlineData("test-md4.md4", DatFormat.RedumpMD4, 1)]
[InlineData("test-md5.md5", DatFormat.RedumpMD5, 1)]
[InlineData("test-sha1.sha1", DatFormat.RedumpSHA1, 1)]
[InlineData("test-sha256.sha256", DatFormat.RedumpSHA256, 1)]
[InlineData("test-sha384.sha384", DatFormat.RedumpSHA384, 1)]
[InlineData("test-sha512.sha512", DatFormat.RedumpSHA512, 1)]
[InlineData("test-spamsum.spamsum", DatFormat.RedumpSpamSum, 1)]
public void ParseIntoTest(string? filename, DatFormat datFormat, int totalCount)
{
// For all filenames, add the local path for test data
if (filename != null)
filename = Path.Combine(Environment.CurrentDirectory, "TestData", filename);
else
filename = string.Empty;
var datFile = Parser.CreateDatFile();
datFile.Header.RemoveField(DatHeader.DatFormatKey);
Parser.ParseInto(datFile, filename, throwOnError: true);
Assert.Equal(datFormat, datFile.Header.GetFieldValue<DatFormat>(DatHeader.DatFormatKey));
Assert.Equal(totalCount, datFile.Items.DatStatistics.TotalCount);
2025-05-02 00:28:22 -04:00
//Assert.Equal(totalCount, datFile.ItemsDB.DatStatistics.TotalCount);
2025-04-14 12:32:26 -04:00
}
2024-04-24 16:27:26 -04:00
[Theory]
2020-12-20 15:09:36 -08:00
[InlineData(null, (DatFormat)0x00, 0)]
2020-12-20 21:18:02 -08:00
[InlineData("test-logiqx.xml", DatFormat.Logiqx, 6)]
2020-12-20 15:09:36 -08:00
//[InlineData(null, DatFormat.LogiqxDeprecated, 0)] // Not parsed separately
2024-03-19 15:54:41 -04:00
[InlineData("test-softwarelist.xml", DatFormat.SoftwareList, 6)]
[InlineData("test-listxml.xml", DatFormat.Listxml, 19)]
2020-12-20 22:22:55 -08:00
[InlineData("test-offlinelist.xml", DatFormat.OfflineList, 1)]
2020-12-20 22:26:55 -08:00
//[InlineData(null, DatFormat.SabreXML, 0)] // TODO: Create good-enough test file for this
2020-12-20 15:09:36 -08:00
[InlineData("test-openmsx.xml", DatFormat.OpenMSX, 3)]
[InlineData("test-archivedotorg.xml", DatFormat.ArchiveDotOrg, 1)]
2020-12-20 15:09:36 -08:00
[InlineData("test-cmp.dat", DatFormat.ClrMamePro, 6)]
2020-12-20 22:01:05 -08:00
[InlineData("test-romcenter.dat", DatFormat.RomCenter, 1)]
2020-12-20 21:18:02 -08:00
[InlineData("test-doscenter.dat", DatFormat.DOSCenter, 1)]
2020-12-20 15:09:36 -08:00
[InlineData("test-attractmode.txt", DatFormat.AttractMode, 1)]
//[InlineData(null, DatFormat.MissFile, 0)] // Parsing is not supported
2020-12-20 22:26:55 -08:00
//[InlineData(null, DatFormat.CSV, 0)] // TODO: Create good-enough test file for this
//[InlineData(null, DatFormat.SSV, 0)] // TODO: Create good-enough test file for this
//[InlineData(null, DatFormat.TSV, 0)] // TODO: Create good-enough test file for this
2020-12-20 15:09:36 -08:00
[InlineData("test-listrom.txt", DatFormat.Listrom, 6)]
[InlineData("test-smdb.txt", DatFormat.EverdriveSMDB, 1)]
2020-12-20 22:26:55 -08:00
//[InlineData(null, DatFormat.SabreJSON, 0)] // TODO: Create good-enough test file for this
2020-12-20 15:09:36 -08:00
[InlineData("test-sfv.sfv", DatFormat.RedumpSFV, 1)]
[InlineData("test-md2.md2", DatFormat.RedumpMD2, 1)]
[InlineData("test-md4.md4", DatFormat.RedumpMD4, 1)]
2020-12-20 15:09:36 -08:00
[InlineData("test-md5.md5", DatFormat.RedumpMD5, 1)]
[InlineData("test-sha1.sha1", DatFormat.RedumpSHA1, 1)]
[InlineData("test-sha256.sha256", DatFormat.RedumpSHA256, 1)]
[InlineData("test-sha384.sha384", DatFormat.RedumpSHA384, 1)]
[InlineData("test-sha512.sha512", DatFormat.RedumpSHA512, 1)]
[InlineData("test-spamsum.spamsum", DatFormat.RedumpSpamSum, 1)]
public void ParseStatisticsTest(string? filename, DatFormat datFormat, int totalCount)
2020-12-20 14:20:03 -08:00
{
// For all filenames, add the local path for test data
if (filename != null)
filename = Path.Combine(Environment.CurrentDirectory, "TestData", filename);
2025-04-14 12:10:09 -04:00
var datFile = Parser.ParseStatistics(filename, throwOnError: true);
2024-03-10 21:54:07 -04:00
Assert.Equal(datFormat, datFile.Header.GetFieldValue<DatFormat>(DatHeader.DatFormatKey));
Assert.Equal(totalCount, datFile.Items.DatStatistics.TotalCount);
2025-05-02 00:28:22 -04:00
//Assert.Equal(totalCount, datFile.ItemsDB.DatStatistics.TotalCount);
2020-12-20 14:20:03 -08:00
}
2025-04-14 12:32:26 -04:00
[Theory]
2025-04-14 21:16:45 -04:00
[InlineData(StatReportFormat.None, typeof(Reports.Formats.Textfile))]
2025-04-14 12:32:26 -04:00
[InlineData(StatReportFormat.Textfile, typeof(Reports.Formats.Textfile))]
[InlineData(StatReportFormat.CSV, typeof(Reports.Formats.CommaSeparatedValue))]
[InlineData(StatReportFormat.HTML, typeof(Reports.Formats.Html))]
[InlineData(StatReportFormat.SSV, typeof(Reports.Formats.SemicolonSeparatedValue))]
[InlineData(StatReportFormat.TSV, typeof(Reports.Formats.TabSeparatedValue))]
2025-04-14 21:16:45 -04:00
[InlineData((StatReportFormat)0xFF, typeof(Reports.Formats.Textfile))]
2025-04-14 12:32:26 -04:00
public void CreateReportTest(StatReportFormat reportFormat, Type expected)
{
var report = Parser.CreateReport(reportFormat, []);
Assert.Equal(expected, report.GetType());
}
2020-12-20 14:20:03 -08:00
}
}