using System.Collections.Generic; using SabreTools.Metadata.DatFiles.Formats; using SabreTools.Metadata.DatItems; using SabreTools.Metadata.DatItems.Formats; using SabreTools.Metadata.Filter; using Xunit; namespace SabreTools.Metadata.DatFiles.Test { public partial class DatFileTests { #region ExecuteFilters [Fact] public void ExecuteFilters_Items() { FilterObject filterObject = new FilterObject("rom.crc", "deadbeef", Operation.NotEquals); FilterRunner filterRunner = new FilterRunner([filterObject]); Source source = new Source(0, source: null); Machine machine = new Machine(); machine.Name = "machine"; DatItem datItem = new Rom(); datItem.SetName("rom.bin"); datItem.Write(Data.Models.Metadata.Rom.CRCKey, "deadbeef"); datItem.Machine = machine; datItem.Source = source; DatFile datFile = new Logiqx(datFile: null, useGame: false); datFile.AddItem(datItem, statsOnly: false); datFile.BucketBy(ItemKey.Machine); datFile.ExecuteFilters(filterRunner); var actualDatItems = datFile.GetItemsForBucket("machine"); DatItem actualRom = Assert.Single(actualDatItems); Assert.True(actualRom.RemoveFlag); } [Fact] public void ExecuteFilters_ItemsDB() { FilterObject filterObject = new FilterObject("rom.crc", "deadbeef", Operation.NotEquals); FilterRunner filterRunner = new FilterRunner([filterObject]); Source source = new Source(0, source: null); Machine machine = new Machine(); machine.Name = "machine"; DatItem datItem = new Rom(); datItem.SetName("rom.bin"); datItem.Write(Data.Models.Metadata.Rom.CRCKey, "deadbeef"); datItem.Machine = machine; datItem.Source = source; DatFile datFile = new Logiqx(datFile: null, useGame: false); long sourceIndex = datFile.AddSourceDB(source); long machineIndex = datFile.AddMachineDB(machine); _ = datFile.AddItemDB(datItem, machineIndex, sourceIndex, statsOnly: false); datFile.BucketBy(ItemKey.Machine); datFile.ExecuteFilters(filterRunner); var actualDatItems = datFile.GetItemsForBucketDB("machine"); DatItem actualRom = Assert.Single(actualDatItems).Value; Assert.True(actualRom.RemoveFlag); } #endregion #region MachineDescriptionToName [Fact] public void MachineDescriptionToName_Items() { Source source = new Source(0, source: null); Machine machine = new Machine(); machine.Name = "machine"; machine.Description = "description"; DatItem datItem = new Rom(); datItem.Machine = machine; datItem.Source = source; DatFile datFile = new Logiqx(datFile: null, useGame: false); datFile.AddItem(datItem, statsOnly: false); datFile.MachineDescriptionToName(); // The name of the bucket is not expected to change DatItem actual = Assert.Single(datFile.GetItemsForBucket("machine")); Machine? actualMachine = actual.Machine; Assert.NotNull(actualMachine); Assert.Equal("description", actualMachine.Name); Assert.Equal("description", actualMachine.Description); } [Fact] public void MachineDescriptionToName_ItemsDB() { Machine machine = new Machine(); machine.Name = "machine"; machine.Description = "description"; DatFile datFile = new Logiqx(datFile: null, useGame: false); _ = datFile.AddMachineDB(machine); datFile.MachineDescriptionToName(); Machine actualMachine = Assert.Single(datFile.GetMachinesDB()).Value; Assert.Equal("description", actualMachine.Name); Assert.Equal("description", actualMachine.Description); } #endregion #region SetOneRomPerGame [Fact] public void SetOneRomPerGame_Items() { Source source = new Source(0, source: null); Machine machine = new Machine(); machine.Name = "machine"; DatItem rom = new Rom(); rom.SetName("rom.bin"); rom.Machine = machine; rom.Source = source; DatItem disk = new Disk(); disk.SetName("disk"); disk.Machine = machine; disk.Source = source; DatFile datFile = new Logiqx(datFile: null, useGame: false); datFile.AddItem(rom, statsOnly: false); datFile.AddItem(disk, statsOnly: false); datFile.BucketBy(ItemKey.Machine); 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.Machine; Assert.NotNull(actualRomMachine); Assert.Equal("machine/rom", actualRomMachine.Name); DatItem actualDisk = Assert.Single(actualDatItems.FindAll(i => i is Disk)); Machine? actualDiskMachine = actualDisk.Machine; Assert.NotNull(actualDiskMachine); Assert.Equal("machine/disk", actualDiskMachine.Name); } [Fact] public void SetOneRomPerGame_ItemsDB() { Source source = new Source(0, source: null); Machine machine = new Machine(); machine.Name = "machine"; DatItem rom = new Rom(); rom.SetName("rom.bin"); DatItem disk = new Disk(); disk.SetName("disk"); DatFile datFile = new Logiqx(datFile: null, useGame: 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); 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.GetMachineForItemDB(actualRom.Key); Assert.NotNull(actualRomMachine.Value); Assert.Equal("machine/rom", actualRomMachine.Value.Name); var actualDisk = Assert.Single(actualDatItems, i => i.Value is Disk); var actualDiskMachine = datFile.GetMachineForItemDB(actualDisk.Key); Assert.NotNull(actualDiskMachine.Value); Assert.Equal("machine/disk", actualDiskMachine.Value.Name); } #endregion #region SetOneGamePerRegion [Fact] public void SetOneGamePerRegion_Items() { Machine nowhereMachine = new Machine(); nowhereMachine.Name = "machine (Nowhere)"; Machine worldMachine = new Machine(); worldMachine.Name = "machine (World)"; worldMachine.Write(Data.Models.Metadata.Machine.CloneOfKey, "machine (Nowhere)"); DatItem nowhereRom = new Rom(); nowhereRom.SetName("rom.bin"); nowhereRom.Machine = nowhereMachine; DatItem worldRom = new Rom(); worldRom.SetName("rom.nib"); worldRom.Machine = worldMachine; DatFile datFile = new Logiqx(datFile: null, useGame: false); datFile.AddItem(nowhereRom, statsOnly: false); datFile.AddItem(worldRom, statsOnly: false); List regions = ["World", "Nowhere"]; datFile.SetOneGamePerRegion(regions); Assert.Empty(datFile.GetItemsForBucket("machine (nowhere)")); var actualDatItems = datFile.GetItemsForBucket("machine (world)"); DatItem actualWorldRom = Assert.Single(actualDatItems); Machine? actualWorldMachine = actualWorldRom.Machine; Assert.NotNull(actualWorldMachine); Assert.Equal("machine (World)", actualWorldMachine.Name); } [Fact] public void SetOneGamePerRegion_ItemsDB() { Machine nowhereMachine = new Machine(); nowhereMachine.Name = "machine (Nowhere)"; Machine worldMachine = new Machine(); worldMachine.Name = "machine (World)"; worldMachine.Write(Data.Models.Metadata.Machine.CloneOfKey, "machine (Nowhere)"); DatFile datFile = new Logiqx(datFile: null, useGame: false); _ = datFile.AddMachineDB(nowhereMachine); _ = datFile.AddMachineDB(worldMachine); List regions = ["World", "Nowhere"]; datFile.SetOneGamePerRegion(regions); var actualWorldMachine = Assert.Single(datFile.GetMachinesDB()); Assert.NotNull(actualWorldMachine.Value); Assert.Equal("machine (World)", actualWorldMachine.Value.Name); } #endregion #region StripSceneDatesFromItems [Fact] public void StripSceneDatesFromItems_Items() { Source source = new Source(0, source: null); Machine machine = new Machine(); machine.Name = "10.10.10-machine-name"; DatItem datItem = new Rom(); datItem.Machine = machine; datItem.Source = source; DatFile datFile = new Logiqx(datFile: null, useGame: false); datFile.AddItem(datItem, statsOnly: false); datFile.StripSceneDatesFromItems(); // The name of the bucket is not expected to change DatItem actual = Assert.Single(datFile.GetItemsForBucket("10.10.10-machine-name")); Machine? actualMachine = actual.Machine; Assert.NotNull(actualMachine); Assert.Equal("machine-name", actualMachine.Name); } [Fact] public void StripSceneDatesFromItems_ItemsDB() { Machine machine = new Machine(); machine.Name = "10.10.10-machine-name"; DatFile datFile = new Logiqx(datFile: null, useGame: false); _ = datFile.AddMachineDB(machine); datFile.StripSceneDatesFromItems(); Machine actualMachine = Assert.Single(datFile.GetMachinesDB()).Value; Assert.Equal("machine-name", actualMachine.Name); } #endregion } }