diff --git a/SabreTools.DatFiles.Test/DatFileTests.Filtering.cs b/SabreTools.DatFiles.Test/DatFileTests.Filtering.cs index a579a127..feb24011 100644 --- a/SabreTools.DatFiles.Test/DatFileTests.Filtering.cs +++ b/SabreTools.DatFiles.Test/DatFileTests.Filtering.cs @@ -62,7 +62,81 @@ namespace SabreTools.DatFiles.Test #region SetOneRomPerGame - // TODO: Implement SetOneRomPerGame tests + [Fact] + public void SetOneRomPerGame_Items() + { + Source source = new Source(0, source: null); + + Machine machine = new Machine(); + machine.SetFieldValue(Models.Metadata.Machine.NameKey, "machine"); + + DatItem rom = new Rom(); + rom.SetName("rom.bin"); + rom.SetFieldValue(DatItem.MachineKey, machine); + rom.SetFieldValue(DatItem.SourceKey, source); + + DatItem disk = new Disk(); + disk.SetName("disk"); + disk.SetFieldValue(DatItem.MachineKey, machine); + disk.SetFieldValue(DatItem.SourceKey, source); + + DatFile datFile = new Logiqx(datFile: null, deprecated: false); + datFile.AddItem(rom, statsOnly: false); + datFile.AddItem(disk, statsOnly: false); + + datFile.BucketBy(ItemKey.Machine, DedupeType.None); + datFile.SetOneRomPerGame(); + + var actualDatItems = datFile.GetItemsForBucket("machine"); + Assert.Equal(2, actualDatItems.Count); + + DatItem actualRom = Assert.Single(actualDatItems.FindAll(i => i is Rom)); + Machine? actualRomMachine = actualRom.GetFieldValue(DatItem.MachineKey); + Assert.NotNull(actualRomMachine); + Assert.Equal("machine/rom", actualRomMachine.GetStringFieldValue(Models.Metadata.Machine.NameKey)); + + DatItem actualDisk = Assert.Single(actualDatItems.FindAll(i => i is Disk)); + Machine? actualDiskMachine = actualDisk.GetFieldValue(DatItem.MachineKey); + Assert.NotNull(actualDiskMachine); + Assert.Equal("machine/disk", actualDiskMachine.GetStringFieldValue(Models.Metadata.Machine.NameKey)); + } + + [Fact] + public void SetOneRomPerGame_ItemsDB() + { + Source source = new Source(0, source: null); + + Machine machine = new Machine(); + machine.SetFieldValue(Models.Metadata.Machine.NameKey, "machine"); + + DatItem rom = new Rom(); + rom.SetName("rom.bin"); + + DatItem disk = new Disk(); + disk.SetName("disk"); + + DatFile datFile = new Logiqx(datFile: null, deprecated: false); + long sourceIndex = datFile.AddSourceDB(source); + long machineIndex = datFile.AddMachineDB(machine); + _ = datFile.AddItemDB(rom, machineIndex, sourceIndex, statsOnly: false); + _ = datFile.AddItemDB(disk, machineIndex, sourceIndex, statsOnly: false); + + datFile.BucketBy(ItemKey.Machine, DedupeType.None); + datFile.SetOneRomPerGame(); + + var actualDatItems = datFile.GetItemsForBucketDB("machine"); + Assert.Equal(2, actualDatItems.Count); + + var actualRom = Assert.Single(actualDatItems, i => i.Value is Rom); + var actualRomMachine = datFile.ItemsDB.GetMachineForItem(actualRom.Key); + Assert.NotNull(actualRomMachine.Value); + Assert.Equal("machine/rom", actualRomMachine.Value.GetStringFieldValue(Models.Metadata.Machine.NameKey)); + + var actualDisk = Assert.Single(actualDatItems, i => i.Value is Disk); + var actualDiskMachine = datFile.ItemsDB.GetMachineForItem(actualDisk.Key); + Assert.NotNull(actualDiskMachine.Value); + Assert.Equal("machine/disk", actualDiskMachine.Value.GetStringFieldValue(Models.Metadata.Machine.NameKey)); + } #endregion diff --git a/SabreTools.DatFiles/DatFile.Filtering.cs b/SabreTools.DatFiles/DatFile.Filtering.cs index d3ba71e5..9174c185 100644 --- a/SabreTools.DatFiles/DatFile.Filtering.cs +++ b/SabreTools.DatFiles/DatFile.Filtering.cs @@ -433,8 +433,8 @@ namespace SabreTools.DatFiles private static void SetOneRomPerGameImpl(DatItem datItem) { // If the item name is null - string? machineName = datItem.GetName(); - if (machineName == null) + string? itemName = datItem.GetName(); + if (itemName == null) return; // Get the current machine @@ -448,19 +448,23 @@ namespace SabreTools.DatFiles // Reassign the item to the new machine datItem.SetFieldValue(DatItem.MachineKey, machine); - // Remove extensions from Rom items - if (datItem is Rom) + // Remove extensions from File and Rom items + if (datItem is DatItems.Formats.File || datItem is Rom) { - string[] splitname = machineName.Split('.'); - machineName = machine.GetStringFieldValue(Models.Metadata.Machine.NameKey) + string[] splitname = itemName.Split('.'); + itemName = machine.GetStringFieldValue(Models.Metadata.Machine.NameKey) + $"/{string.Join(".", splitname, 0, splitname.Length > 1 ? splitname.Length - 1 : 1)}"; } + else + { + itemName = machine.GetStringFieldValue(Models.Metadata.Machine.NameKey) + $"/{itemName}"; + } // Strip off "Default" prefix only for ORPG - if (machineName.StartsWith("Default")) - machineName = machineName.Substring("Default".Length + 1); + if (itemName.StartsWith("Default")) + itemName = itemName.Substring("Default".Length + 1); - machine.SetFieldValue(Models.Metadata.Machine.NameKey, machineName); + machine.SetFieldValue(Models.Metadata.Machine.NameKey, itemName); datItem.SetName(Path.GetFileName(datItem.GetName())); } @@ -506,8 +510,8 @@ namespace SabreTools.DatFiles private void SetOneRomPerGameImplDB(KeyValuePair datItem) { // If the item name is null - string? machineName = datItem.Value.GetName(); - if (datItem.Key < 0 || machineName == null) + string? itemName = datItem.Value.GetName(); + if (datItem.Key < 0 || itemName == null) return; // Get the current machine @@ -522,21 +526,25 @@ namespace SabreTools.DatFiles return; // Reassign the item to the new machine - ItemsDB._itemToMachineMapping[machine.Key] = newMachineIndex; + ItemsDB._itemToMachineMapping[datItem.Key] = newMachineIndex; - // Remove extensions from Rom items - if (datItem.Value is Rom) + // Remove extensions from File and Rom items + if (datItem.Value is DatItems.Formats.File || datItem.Value is Rom) { - string[] splitname = machineName.Split('.'); - machineName = machine.Value.GetStringFieldValue(Models.Metadata.Machine.NameKey) + string[] splitname = itemName.Split('.'); + itemName = machine.Value.GetStringFieldValue(Models.Metadata.Machine.NameKey) + $"/{string.Join(".", splitname, 0, splitname.Length > 1 ? splitname.Length - 1 : 1)}"; } + else + { + itemName = machine.Value.GetStringFieldValue(Models.Metadata.Machine.NameKey) + $"/{itemName}"; + } // Strip off "Default" prefix only for ORPG - if (machineName.StartsWith("Default")) - machineName = machineName.Substring("Default".Length + 1); + if (itemName.StartsWith("Default")) + itemName = itemName.Substring("Default".Length + 1); - machine.Value.SetFieldValue(Models.Metadata.Machine.NameKey, machineName); + machine.Value.SetFieldValue(Models.Metadata.Machine.NameKey, itemName); datItem.Value.SetName(Path.GetFileName(datItem.Value.GetName())); }