diff --git a/SabreTools.DatFiles.Test/DatFileTests.Filtering.cs b/SabreTools.DatFiles.Test/DatFileTests.Filtering.cs index 3572e314..54ee7ba3 100644 --- a/SabreTools.DatFiles.Test/DatFileTests.Filtering.cs +++ b/SabreTools.DatFiles.Test/DatFileTests.Filtering.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using SabreTools.Core.Filter; using SabreTools.DatFiles.Formats; using SabreTools.DatItems; using SabreTools.DatItems.Formats; @@ -10,7 +11,63 @@ namespace SabreTools.DatFiles.Test { #region ExecuteFilters - // TODO: Add ExecuteFilters tests + [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.SetFieldValue(Models.Metadata.Machine.NameKey, "machine"); + + DatItem datItem = new Rom(); + datItem.SetName("rom.bin"); + datItem.SetFieldValue(Models.Metadata.Rom.CRCKey, "deadbeef"); + datItem.SetFieldValue(DatItem.MachineKey, machine); + datItem.SetFieldValue(DatItem.SourceKey, source); + + DatFile datFile = new Logiqx(datFile: null, deprecated: false); + datFile.AddItem(datItem, statsOnly: false); + + datFile.BucketBy(ItemKey.Machine, DedupeType.None); + datFile.ExecuteFilters(filterRunner); + + var actualDatItems = datFile.GetItemsForBucket("machine"); + DatItem actualRom = Assert.Single(actualDatItems); + Assert.Equal(true, actualRom.GetBoolFieldValue(DatItem.RemoveKey)); + } + + [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.SetFieldValue(Models.Metadata.Machine.NameKey, "machine"); + + DatItem datItem = new Rom(); + datItem.SetName("rom.bin"); + datItem.SetFieldValue(Models.Metadata.Rom.CRCKey, "deadbeef"); + datItem.SetFieldValue(DatItem.MachineKey, machine); + datItem.SetFieldValue(DatItem.SourceKey, source); + + DatFile datFile = new Logiqx(datFile: null, deprecated: false); + long sourceIndex = datFile.AddSourceDB(source); + long machineIndex = datFile.AddMachineDB(machine); + _ = datFile.AddItemDB(datItem, machineIndex, sourceIndex, statsOnly: false); + + datFile.BucketBy(ItemKey.Machine, DedupeType.None); + datFile.ExecuteFilters(filterRunner); + + var actualDatItems = datFile.GetItemsForBucketDB("machine"); + DatItem actualRom = Assert.Single(actualDatItems).Value; + Assert.Equal(true, actualRom.GetBoolFieldValue(DatItem.RemoveKey)); + } #endregion diff --git a/SabreTools.DatFiles/DatFile.Filtering.cs b/SabreTools.DatFiles/DatFile.Filtering.cs index 04f799c9..928b9b13 100644 --- a/SabreTools.DatFiles/DatFile.Filtering.cs +++ b/SabreTools.DatFiles/DatFile.Filtering.cs @@ -188,6 +188,7 @@ namespace SabreTools.DatFiles /// Execute all filters in a filter runner on the items in the dictionary /// /// Preconfigured filter runner to use + /// Applies to private void ExecuteFiltersImpl(FilterRunner filterRunner) { List keys = [.. Items.Keys]; @@ -211,6 +212,7 @@ namespace SabreTools.DatFiles /// Execute all filters in a filter runner on the items in the dictionary /// /// Preconfigured filter runner to use + /// Applies to private void ExecuteFiltersImplDB(FilterRunner filterRunner) { List keys = [.. ItemsDB.SortedKeys]; @@ -235,6 +237,7 @@ namespace SabreTools.DatFiles /// /// Preconfigured filter runner to use /// Name of the bucket to filter on + /// Applies to private void ExecuteFilterOnBucket(FilterRunner filterRunner, string bucketName) { List? items = GetItemsForBucket(bucketName); @@ -244,7 +247,7 @@ namespace SabreTools.DatFiles // Filter all items in the current key foreach (var item in items) { - if (item.PassesFilter(filterRunner)) + if (!item.PassesFilter(filterRunner)) item.SetFieldValue(DatItem.RemoveKey, true); } } @@ -254,6 +257,7 @@ namespace SabreTools.DatFiles /// /// Preconfigured filter runner to use /// Name of the bucket to filter on + /// Applies to private void ExecuteFilterOnBucketDB(FilterRunner filterRunner, string bucketName) { var items = GetItemsForBucketDB(bucketName); @@ -264,7 +268,7 @@ namespace SabreTools.DatFiles List newItems = []; foreach (var item in items) { - if (item.Value.PassesFilterDB(filterRunner)) + if (!item.Value.PassesFilterDB(filterRunner)) item.Value.SetFieldValue(DatItem.RemoveKey, true); } }