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);
}
}