diff --git a/SabreTools.DatFiles.Test/DatFileTests.Splitting.cs b/SabreTools.DatFiles.Test/DatFileTests.Splitting.cs index 6014d284..0886f482 100644 --- a/SabreTools.DatFiles.Test/DatFileTests.Splitting.cs +++ b/SabreTools.DatFiles.Test/DatFileTests.Splitting.cs @@ -332,7 +332,117 @@ namespace SabreTools.DatFiles.Test #region AddItemsFromDevices - // TODO: Implement AddItemsFromDevices tests + [Theory] + [InlineData(false, false, 4)] + [InlineData(false, true, 4)] + [InlineData(true, false, 3)] + [InlineData(true, true, 3)] + public void AddItemsFromDevices_Items(bool deviceOnly, bool useSlotOptions, int expected) + { + Source source = new Source(0, source: null); + + Machine deviceMachine = new Machine(); + deviceMachine.SetFieldValue(Models.Metadata.Machine.NameKey, "device"); + deviceMachine.SetFieldValue(Models.Metadata.Machine.IsDeviceKey, true); + + Machine slotOptionMachine = new Machine(); + slotOptionMachine.SetFieldValue(Models.Metadata.Machine.NameKey, "slotoption"); + + Machine itemMachine = new Machine(); + itemMachine.SetFieldValue(Models.Metadata.Machine.NameKey, "machine"); + + DatItem deviceItem = new Sample(); + deviceItem.SetName("device_item"); + deviceItem.SetFieldValue(DatItem.MachineKey, deviceMachine); + deviceItem.SetFieldValue(DatItem.SourceKey, source); + + DatItem slotOptionItem = new Sample(); + slotOptionItem.SetName("slot_option_item"); + slotOptionItem.SetFieldValue(DatItem.MachineKey, slotOptionMachine); + slotOptionItem.SetFieldValue(DatItem.SourceKey, source); + + DatItem datItem = new Rom(); + datItem.SetName("rom"); + datItem.SetFieldValue(Models.Metadata.Rom.SizeKey, 12345); + datItem.SetFieldValue(Models.Metadata.Rom.CRCKey, "deadbeef"); + datItem.SetFieldValue(DatItem.MachineKey, itemMachine); + datItem.SetFieldValue(DatItem.SourceKey, source); + + DatItem deviceRef = new DeviceRef(); + deviceRef.SetName("device"); + deviceRef.SetFieldValue(DatItem.MachineKey, itemMachine); + deviceRef.SetFieldValue(DatItem.SourceKey, source); + + DatItem slotOption = new SlotOption(); + slotOption.SetName("slotoption"); + slotOption.SetFieldValue(DatItem.MachineKey, itemMachine); + slotOption.SetFieldValue(DatItem.SourceKey, source); + + DatFile datFile = new Logiqx(datFile: null, deprecated: false); + datFile.AddItem(deviceItem, statsOnly: false); + datFile.AddItem(slotOptionItem, statsOnly: false); + datFile.AddItem(datItem, statsOnly: false); + datFile.AddItem(deviceRef, statsOnly: false); + datFile.AddItem(slotOption, statsOnly: false); + + datFile.BucketBy(ItemKey.Machine, DedupeType.None); + datFile.AddItemsFromDevices(deviceOnly, useSlotOptions); + + Assert.Equal(expected, datFile.GetItemsForBucket("machine").Count); + } + + [Theory] + [InlineData(false, false, 4)] + [InlineData(false, true, 4)] + [InlineData(true, false, 3)] + [InlineData(true, true, 3)] + public void AddItemsFromDevices_ItemsDB(bool deviceOnly, bool useSlotOptions, int expected) + { + Source source = new Source(0, source: null); + + Machine deviceMachine = new Machine(); + deviceMachine.SetFieldValue(Models.Metadata.Machine.NameKey, "device"); + deviceMachine.SetFieldValue(Models.Metadata.Machine.IsDeviceKey, true); + + Machine slotOptionMachine = new Machine(); + slotOptionMachine.SetFieldValue(Models.Metadata.Machine.NameKey, "slotoption"); + + Machine itemMachine = new Machine(); + itemMachine.SetFieldValue(Models.Metadata.Machine.NameKey, "machine"); + + DatItem deviceItem = new Sample(); + deviceItem.SetName("device_item"); + + DatItem slotOptionItem = new Sample(); + slotOptionItem.SetName("slot_option_item"); + + DatItem datItem = new Rom(); + datItem.SetName("rom"); + datItem.SetFieldValue(Models.Metadata.Rom.SizeKey, 12345); + datItem.SetFieldValue(Models.Metadata.Rom.CRCKey, "deadbeef"); + + DatItem deviceRef = new DeviceRef(); + deviceRef.SetName("device"); + + DatItem slotOption = new SlotOption(); + slotOption.SetName("slotoption"); + + DatFile datFile = new Logiqx(datFile: null, deprecated: false); + long deviceMachineIndex = datFile.AddMachineDB(deviceMachine); + long slotOptionMachineIndex = datFile.AddMachineDB(slotOptionMachine); + long itemMachineIndex = datFile.AddMachineDB(itemMachine); + long sourceIndex = datFile.AddSourceDB(source); + _ = datFile.AddItemDB(deviceItem, deviceMachineIndex, sourceIndex, statsOnly: false); + _ = datFile.AddItemDB(slotOptionItem, slotOptionMachineIndex, sourceIndex, statsOnly: false); + _ = datFile.AddItemDB(datItem, itemMachineIndex, sourceIndex, statsOnly: false); + _ = datFile.AddItemDB(deviceRef, itemMachineIndex, sourceIndex, statsOnly: false); + _ = datFile.AddItemDB(slotOption, itemMachineIndex, sourceIndex, statsOnly: false); + + datFile.BucketBy(ItemKey.Machine, DedupeType.None); + datFile.AddItemsFromDevices(deviceOnly, useSlotOptions); + + Assert.Equal(expected, datFile.GetItemsForBucketDB("machine").Count); + } #endregion diff --git a/SabreTools.DatFiles/DatFile.Splitting.cs b/SabreTools.DatFiles/DatFile.Splitting.cs index 18a2eead..dc07cbd9 100644 --- a/SabreTools.DatFiles/DatFile.Splitting.cs +++ b/SabreTools.DatFiles/DatFile.Splitting.cs @@ -615,7 +615,7 @@ namespace SabreTools.DatFiles /// /// Use device_ref and optionally slotoption tags to add items to the children /// - /// True if only child device sets are touched, false for non-device sets (default) + /// True if only child device sets are touched, false for non-device sets /// True if slotoptions tags are used as well, false otherwise /// True if any items were processed, false otherwise ///