diff --git a/SabreTools.Test/Filtering/ReplacerTests.cs b/SabreTools.DatFiles.Test/ReplacerTests.cs similarity index 65% rename from SabreTools.Test/Filtering/ReplacerTests.cs rename to SabreTools.DatFiles.Test/ReplacerTests.cs index d4d356f4..2b1be95a 100644 --- a/SabreTools.Test/Filtering/ReplacerTests.cs +++ b/SabreTools.DatFiles.Test/ReplacerTests.cs @@ -1,15 +1,15 @@ using System.Collections.Generic; -using SabreTools.DatFiles; using SabreTools.DatItems; using SabreTools.DatItems.Formats; using Xunit; -namespace SabreTools.Test.Filtering +namespace SabreTools.DatFiles.Test { + // TODO: Add tests for 4 special items and one generic item public class ReplacerTests { [Fact] - public void ReplaceFieldsDatItemTest() + public void ReplaceFields_DatItem() { var datItem = CreateDatItem(); var repDatItem = CreateDatItem(); @@ -18,19 +18,29 @@ namespace SabreTools.Test.Filtering { ["item"] = [Models.Metadata.Rom.NameKey] }; + Replacer.ReplaceFields(datItem, repDatItem, fields); + Assert.Equal("bar", datItem.GetName()); } [Fact] - public void ReplaceFieldsMachineTest() + public void ReplaceFields_Machine() { var datItem = CreateDatItem(); + var machine = datItem.GetFieldValue(DatItem.MachineKey); + Assert.NotNull(machine); + var repDatItem = CreateDatItem(); - repDatItem.GetFieldValue(DatItem.MachineKey)!.SetFieldValue(Models.Metadata.Machine.NameKey, "foo"); + var repMachine = repDatItem.GetFieldValue(DatItem.MachineKey); + Assert.NotNull(repMachine); + + repMachine!.SetFieldValue(Models.Metadata.Machine.NameKey, "foo"); List fields = [Models.Metadata.Machine.NameKey]; - Replacer.ReplaceFields(datItem.GetFieldValue(DatItem.MachineKey)!, repDatItem.GetFieldValue(DatItem.MachineKey)!, fields, false); - Assert.Equal("foo", datItem.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey)); + + Replacer.ReplaceFields(machine, repMachine, fields, false); + + Assert.Equal("foo", machine.GetStringFieldValue(Models.Metadata.Machine.NameKey)); } /// diff --git a/SabreTools.DatFiles/Replacer.cs b/SabreTools.DatFiles/Replacer.cs index bb1d4266..399b4d4e 100644 --- a/SabreTools.DatFiles/Replacer.cs +++ b/SabreTools.DatFiles/Replacer.cs @@ -87,6 +87,7 @@ namespace SabreTools.DatFiles switch (datItem, repDatItem) { case (Disk disk, Disk repDisk): ReplaceFields(disk, repDisk, [.. fieldNames]); break; + case (DatItems.Formats.File file, DatItems.Formats.File repFile): ReplaceFields(file, repFile, [.. fieldNames]); break; case (Media media, Media repMedia): ReplaceFields(media, repMedia, [.. fieldNames]); break; case (Rom rom, Rom repRom): ReplaceFields(rom, repRom, [.. fieldNames]); break; } @@ -115,6 +116,39 @@ namespace SabreTools.DatFiles } } + /// + /// Replace fields with given values + /// + /// File to remove replace fields in + /// File to pull new information from + /// List of fields representing what should be updated + private static void ReplaceFields(DatItems.Formats.File file, DatItems.Formats.File newItem, List datItemFields) + { + if (datItemFields.Contains(Models.Metadata.Rom.CRCKey)) + { + if (string.IsNullOrEmpty(file.CRC) && !string.IsNullOrEmpty(newItem.CRC)) + file.CRC = newItem.CRC; + } + + if (datItemFields.Contains(Models.Metadata.Rom.MD5Key)) + { + if (string.IsNullOrEmpty(file.MD5) && !string.IsNullOrEmpty(newItem.MD5)) + file.MD5 = newItem.MD5; + } + + if (datItemFields.Contains(Models.Metadata.Rom.SHA1Key)) + { + if (string.IsNullOrEmpty(file.SHA1) && !string.IsNullOrEmpty(newItem.SHA1)) + file.SHA1 = newItem.SHA1; + } + + if (datItemFields.Contains(Models.Metadata.Rom.SHA256Key)) + { + if (string.IsNullOrEmpty(file.SHA256) && !string.IsNullOrEmpty(newItem.SHA256)) + file.SHA256 = newItem.SHA256; + } + } + /// /// Replace fields with given values ///