diff --git a/SabreTools.DatFiles/Formats/ArchiveDotOrg.cs b/SabreTools.DatFiles/Formats/ArchiveDotOrg.cs index 6462f035..509d8019 100644 --- a/SabreTools.DatFiles/Formats/ArchiveDotOrg.cs +++ b/SabreTools.DatFiles/Formats/ArchiveDotOrg.cs @@ -19,6 +19,7 @@ namespace SabreTools.DatFiles.Formats /// Parent DatFile to copy from public ArchiveDotOrg(DatFile? datFile) : base(datFile) { + Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.ArchiveDotOrg); } } } diff --git a/SabreTools.DatFiles/Formats/AttractMode.cs b/SabreTools.DatFiles/Formats/AttractMode.cs index 39a8a134..b4c43f30 100644 --- a/SabreTools.DatFiles/Formats/AttractMode.cs +++ b/SabreTools.DatFiles/Formats/AttractMode.cs @@ -20,6 +20,7 @@ namespace SabreTools.DatFiles.Formats /// Parent DatFile to copy from public AttractMode(DatFile? datFile) : base(datFile) { + Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.AttractMode); } /// diff --git a/SabreTools.DatFiles/Formats/ClrMamePro.cs b/SabreTools.DatFiles/Formats/ClrMamePro.cs index 004ee237..54c88782 100644 --- a/SabreTools.DatFiles/Formats/ClrMamePro.cs +++ b/SabreTools.DatFiles/Formats/ClrMamePro.cs @@ -39,6 +39,7 @@ namespace SabreTools.DatFiles.Formats /// Parent DatFile to copy from public ClrMamePro(DatFile? datFile) : base(datFile) { + Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.ClrMamePro); } /// diff --git a/SabreTools.DatFiles/Formats/DosCenter.cs b/SabreTools.DatFiles/Formats/DosCenter.cs index 57e47a2a..454e8df6 100644 --- a/SabreTools.DatFiles/Formats/DosCenter.cs +++ b/SabreTools.DatFiles/Formats/DosCenter.cs @@ -21,6 +21,7 @@ namespace SabreTools.DatFiles.Formats /// Parent DatFile to copy from public DosCenter(DatFile? datFile) : base(datFile) { + Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.DOSCenter); } /// diff --git a/SabreTools.DatFiles/Formats/EverdriveSmdb.cs b/SabreTools.DatFiles/Formats/EverdriveSmdb.cs index 6e8ec37d..7bc952ac 100644 --- a/SabreTools.DatFiles/Formats/EverdriveSmdb.cs +++ b/SabreTools.DatFiles/Formats/EverdriveSmdb.cs @@ -21,6 +21,7 @@ namespace SabreTools.DatFiles.Formats /// Parent DatFile to copy from public EverdriveSMDB(DatFile? datFile) : base(datFile) { + Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.EverdriveSMDB); } /// diff --git a/SabreTools.DatFiles/Formats/Hashfile.cs b/SabreTools.DatFiles/Formats/Hashfile.cs index 33010261..75a2900f 100644 --- a/SabreTools.DatFiles/Formats/Hashfile.cs +++ b/SabreTools.DatFiles/Formats/Hashfile.cs @@ -90,6 +90,7 @@ namespace SabreTools.DatFiles.Formats public SfvFile(DatFile? datFile) : base(datFile) { _hash = HashType.CRC32; + Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpSFV); } /// @@ -131,6 +132,7 @@ namespace SabreTools.DatFiles.Formats public Md2File(DatFile? datFile) : base(datFile) { _hash = HashType.MD2; + Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpMD2); } /// @@ -172,6 +174,7 @@ namespace SabreTools.DatFiles.Formats public Md4File(DatFile? datFile) : base(datFile) { _hash = HashType.MD4; + Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpMD4); } /// @@ -215,6 +218,7 @@ namespace SabreTools.DatFiles.Formats public Md5File(DatFile? datFile) : base(datFile) { _hash = HashType.MD5; + Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpMD5); } /// @@ -268,6 +272,7 @@ namespace SabreTools.DatFiles.Formats public Sha1File(DatFile? datFile) : base(datFile) { _hash = HashType.SHA1; + Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpSHA1); } /// @@ -320,6 +325,7 @@ namespace SabreTools.DatFiles.Formats public Sha256File(DatFile? datFile) : base(datFile) { _hash = HashType.SHA256; + Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpSHA256); } /// @@ -366,6 +372,7 @@ namespace SabreTools.DatFiles.Formats public Sha384File(DatFile? datFile) : base(datFile) { _hash = HashType.SHA384; + Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpSHA384); } /// @@ -407,6 +414,7 @@ namespace SabreTools.DatFiles.Formats public Sha512File(DatFile? datFile) : base(datFile) { _hash = HashType.SHA512; + Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpSHA512); } /// @@ -449,6 +457,7 @@ namespace SabreTools.DatFiles.Formats public SpamSumFile(DatFile? datFile) : base(datFile) { _hash = HashType.SpamSum; + Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RedumpSpamSum); } /// diff --git a/SabreTools.DatFiles/Formats/Listrom.cs b/SabreTools.DatFiles/Formats/Listrom.cs index 4971cd5e..9aa66566 100644 --- a/SabreTools.DatFiles/Formats/Listrom.cs +++ b/SabreTools.DatFiles/Formats/Listrom.cs @@ -22,6 +22,7 @@ namespace SabreTools.DatFiles.Formats /// Parent DatFile to copy from public Listrom(DatFile? datFile) : base(datFile) { + Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.Listrom); } /// diff --git a/SabreTools.DatFiles/Formats/Listxml.cs b/SabreTools.DatFiles/Formats/Listxml.cs index 16082356..ea574e8a 100644 --- a/SabreTools.DatFiles/Formats/Listxml.cs +++ b/SabreTools.DatFiles/Formats/Listxml.cs @@ -216,6 +216,7 @@ namespace SabreTools.DatFiles.Formats /// Parent DatFile to copy from public Listxml(DatFile? datFile) : base(datFile) { + Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.Listxml); } /// diff --git a/SabreTools.DatFiles/Formats/Logiqx.cs b/SabreTools.DatFiles/Formats/Logiqx.cs index 2d3d96e4..e6d5653b 100644 --- a/SabreTools.DatFiles/Formats/Logiqx.cs +++ b/SabreTools.DatFiles/Formats/Logiqx.cs @@ -253,6 +253,10 @@ namespace SabreTools.DatFiles.Formats public Logiqx(DatFile? datFile, bool useGame) : base(datFile) { _useGame = useGame; + if (useGame) + Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.LogiqxDeprecated); + else + Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.Logiqx); } /// diff --git a/SabreTools.DatFiles/Formats/Missfile.cs b/SabreTools.DatFiles/Formats/Missfile.cs index b665e590..ac606c1a 100644 --- a/SabreTools.DatFiles/Formats/Missfile.cs +++ b/SabreTools.DatFiles/Formats/Missfile.cs @@ -21,6 +21,7 @@ namespace SabreTools.DatFiles.Formats /// Parent DatFile to copy from public Missfile(DatFile? datFile) : base(datFile) { + Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.MissFile); } /// diff --git a/SabreTools.DatFiles/Formats/OfflineList.cs b/SabreTools.DatFiles/Formats/OfflineList.cs index b6f9a5fc..8d453fc1 100644 --- a/SabreTools.DatFiles/Formats/OfflineList.cs +++ b/SabreTools.DatFiles/Formats/OfflineList.cs @@ -21,6 +21,7 @@ namespace SabreTools.DatFiles.Formats /// Parent DatFile to copy from public OfflineList(DatFile? datFile) : base(datFile) { + Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.OfflineList); } /// diff --git a/SabreTools.DatFiles/Formats/OpenMSX.cs b/SabreTools.DatFiles/Formats/OpenMSX.cs index 3e88cb8f..15671827 100644 --- a/SabreTools.DatFiles/Formats/OpenMSX.cs +++ b/SabreTools.DatFiles/Formats/OpenMSX.cs @@ -60,6 +60,7 @@ The softwaredb.xml file contains information about rom mapper types /// Parent DatFile to copy from public OpenMSX(DatFile? datFile) : base(datFile) { + Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.OpenMSX); } /// diff --git a/SabreTools.DatFiles/Formats/RomCenter.cs b/SabreTools.DatFiles/Formats/RomCenter.cs index 5f556caf..00fb80fa 100644 --- a/SabreTools.DatFiles/Formats/RomCenter.cs +++ b/SabreTools.DatFiles/Formats/RomCenter.cs @@ -21,6 +21,7 @@ namespace SabreTools.DatFiles.Formats /// Parent DatFile to copy from public RomCenter(DatFile? datFile) : base(datFile) { + Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.RomCenter); } /// diff --git a/SabreTools.DatFiles/Formats/SabreJSON.cs b/SabreTools.DatFiles/Formats/SabreJSON.cs index 344a79e9..a06a6d17 100644 --- a/SabreTools.DatFiles/Formats/SabreJSON.cs +++ b/SabreTools.DatFiles/Formats/SabreJSON.cs @@ -28,6 +28,7 @@ namespace SabreTools.DatFiles.Formats /// Parent DatFile to copy from public SabreJSON(DatFile? datFile) : base(datFile) { + Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.SabreJSON); } /// diff --git a/SabreTools.DatFiles/Formats/SabreXML.cs b/SabreTools.DatFiles/Formats/SabreXML.cs index d7606cb3..4e8503c0 100644 --- a/SabreTools.DatFiles/Formats/SabreXML.cs +++ b/SabreTools.DatFiles/Formats/SabreXML.cs @@ -25,6 +25,7 @@ namespace SabreTools.DatFiles.Formats /// Parent DatFile to copy from public SabreXML(DatFile? datFile) : base(datFile) { + Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.SabreXML); } /// diff --git a/SabreTools.DatFiles/Formats/SeparatedValue.cs b/SabreTools.DatFiles/Formats/SeparatedValue.cs index 2af34e61..aa2c58c9 100644 --- a/SabreTools.DatFiles/Formats/SeparatedValue.cs +++ b/SabreTools.DatFiles/Formats/SeparatedValue.cs @@ -141,6 +141,7 @@ namespace SabreTools.DatFiles.Formats public CommaSeparatedValue(DatFile? datFile) : base(datFile) { _delim = ','; + Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.CSV); } } @@ -156,6 +157,7 @@ namespace SabreTools.DatFiles.Formats public SemicolonSeparatedValue(DatFile? datFile) : base(datFile) { _delim = ';'; + Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.SSV); } } @@ -171,6 +173,7 @@ namespace SabreTools.DatFiles.Formats public TabSeparatedValue(DatFile? datFile) : base(datFile) { _delim = '\t'; + Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.TSV); } } } diff --git a/SabreTools.DatFiles/Formats/SoftwareList.cs b/SabreTools.DatFiles/Formats/SoftwareList.cs index e18c12b5..1c56c8f5 100644 --- a/SabreTools.DatFiles/Formats/SoftwareList.cs +++ b/SabreTools.DatFiles/Formats/SoftwareList.cs @@ -96,6 +96,7 @@ namespace SabreTools.DatFiles.Formats /// Parent DatFile to copy from public SoftwareList(DatFile? datFile) : base(datFile) { + Header.SetFieldValue(DatHeader.DatFormatKey, DatFormat.SoftwareList); } /// diff --git a/SabreTools.DatTools/Parser.cs b/SabreTools.DatTools/Parser.cs index 68f70377..d566a156 100644 --- a/SabreTools.DatTools/Parser.cs +++ b/SabreTools.DatTools/Parser.cs @@ -155,13 +155,23 @@ namespace SabreTools.DatTools /// /// Name of the file to be parsed /// True if the error that is thrown should be thrown back to the caller, false otherwise + /// + /// Code must remove the existing format in order to ensure the format is derived + /// from the input file instead. This should be addressed later by either always + /// deriving the format, or by setting a flag for this to be done automatically. + // public static DatFile ParseStatistics(string? filename, bool throwOnError = false) { // Null filenames are invalid if (filename == null) - return CreateDatFile(); + { + DatFile empty = CreateDatFile(); + empty.Header.RemoveField(DatHeader.DatFormatKey); + return empty; + } DatFile datFile = CreateDatFile(); + datFile.Header.RemoveField(DatHeader.DatFormatKey); ParseInto(datFile, filename, statsOnly: true, throwOnError: throwOnError); return datFile; } diff --git a/SabreTools.Test/ParserTests.cs b/SabreTools.Test/ParserTests.cs index baa6ccd5..740ca120 100644 --- a/SabreTools.Test/ParserTests.cs +++ b/SabreTools.Test/ParserTests.cs @@ -8,6 +8,142 @@ namespace SabreTools.Test { public class ParserTests { + [Fact] + public void CreateDatFile_Default_Logiqx() + { + var datFile = Parser.CreateDatFile(); + Assert.Equal(DatFormat.Logiqx, datFile.Header.GetFieldValue(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(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(DatHeader.FileNameKey, "filename"); + + var datFile = Parser.CreateDatFile(datFormat, baseDat); + Assert.Equal(expected, datFile.Header.GetFieldValue(DatHeader.DatFormatKey)); + Assert.Equal("filename", datFile.Header.GetFieldValue(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(); + datHeader.SetFieldValue(DatHeader.DatFormatKey, datFormat); + datHeader.SetFieldValue(DatHeader.FileNameKey, "filename"); + + DatModifiers datModifiers = new DatModifiers(); + datModifiers.Quotes = true; + + var datFile = Parser.CreateDatFile(datHeader, datModifiers); + Assert.Equal(expected, datFile.Header.GetFieldValue(DatHeader.DatFormatKey)); + Assert.Equal("filename", datFile.Header.GetFieldValue(DatHeader.FileNameKey)); + Assert.True(datFile.Modifiers.Quotes); + Assert.Equal(0, datFile.Items.DatStatistics.TotalCount); + Assert.Equal(0, datFile.ItemsDB.DatStatistics.TotalCount); + } + [Theory] [InlineData(null, (DatFormat)0x00, 0)] [InlineData("test-logiqx.xml", DatFormat.Logiqx, 6)] @@ -43,7 +179,7 @@ namespace SabreTools.Test // For all filenames, add the local path for test data if (filename != null) filename = Path.Combine(Environment.CurrentDirectory, "TestData", filename); - + var datFile = Parser.ParseStatistics(filename, throwOnError: true); Assert.Equal(datFormat, datFile.Header.GetFieldValue(DatHeader.DatFormatKey)); Assert.Equal(totalCount, datFile.Items.DatStatistics.TotalCount);