diff --git a/Filtration.ItemFilterPreview.Tests/Services/TestItemBlockItemMatcher.cs b/Filtration.ItemFilterPreview.Tests/Services/TestItemBlockItemMatcher.cs index 6653155..d9a3ac0 100644 --- a/Filtration.ItemFilterPreview.Tests/Services/TestItemBlockItemMatcher.cs +++ b/Filtration.ItemFilterPreview.Tests/Services/TestItemBlockItemMatcher.cs @@ -7,6 +7,7 @@ using System.Text; using System.Threading.Tasks; using Filtration.ItemFilterPreview.Model; using Filtration.ItemFilterPreview.Services; +using Filtration.ObjectModel; using Filtration.ObjectModel.BlockItemTypes; using Filtration.ObjectModel.Enums; using Moq; @@ -110,6 +111,314 @@ namespace Filtration.ItemFilterPreview.Tests.Services Assert.AreEqual(expectedResult, result); } + [TestCase(FilterPredicateOperator.Equal, 1, false)] + [TestCase(FilterPredicateOperator.Equal, 2, true)] + [TestCase(FilterPredicateOperator.Equal, 3, false)] + [TestCase(FilterPredicateOperator.GreaterThan, 1, true)] + [TestCase(FilterPredicateOperator.GreaterThan, 2, false)] + [TestCase(FilterPredicateOperator.GreaterThan, 3, false)] + [TestCase(FilterPredicateOperator.GreaterThanOrEqual, 1, true)] + [TestCase(FilterPredicateOperator.GreaterThanOrEqual, 2, true)] + [TestCase(FilterPredicateOperator.GreaterThanOrEqual, 3, false)] + [TestCase(FilterPredicateOperator.LessThan, 1, false)] + [TestCase(FilterPredicateOperator.LessThan, 2, false)] + [TestCase(FilterPredicateOperator.LessThan, 3, true)] + [TestCase(FilterPredicateOperator.LessThanOrEqual, 1, false)] + [TestCase(FilterPredicateOperator.LessThanOrEqual, 2, true)] + [TestCase(FilterPredicateOperator.LessThanOrEqual, 3, true)] + [TestCase(-1, 3, false)] + public void HeightBlockItemMatch_ReturnsCorrectResult(FilterPredicateOperator testInputFilterPredicateOperator, int testInputBlockItemHeight, bool expectedResult) + { + //Arrange + var testInputItem = Mock.Of(i => i.Height == 2); + var testInputBlockItem = new HeightBlockItem(testInputFilterPredicateOperator, testInputBlockItemHeight); + + //Act + var result = _testUtility.ItemBlockItemMatcher.HeightBlockItemMatch(testInputBlockItem, testInputItem); + + //Assert + Assert.AreEqual(expectedResult, result); + } + + [TestCase(FilterPredicateOperator.Equal, 49, false)] + [TestCase(FilterPredicateOperator.Equal, 50, true)] + [TestCase(FilterPredicateOperator.Equal, 51, false)] + [TestCase(FilterPredicateOperator.GreaterThan, 49, true)] + [TestCase(FilterPredicateOperator.GreaterThan, 50, false)] + [TestCase(FilterPredicateOperator.GreaterThan, 51, false)] + [TestCase(FilterPredicateOperator.GreaterThanOrEqual, 49, true)] + [TestCase(FilterPredicateOperator.GreaterThanOrEqual, 50, true)] + [TestCase(FilterPredicateOperator.GreaterThanOrEqual, 51, false)] + [TestCase(FilterPredicateOperator.LessThan, 49, false)] + [TestCase(FilterPredicateOperator.LessThan, 50, false)] + [TestCase(FilterPredicateOperator.LessThan, 51, true)] + [TestCase(FilterPredicateOperator.LessThanOrEqual, 49, false)] + [TestCase(FilterPredicateOperator.LessThanOrEqual, 50, true)] + [TestCase(FilterPredicateOperator.LessThanOrEqual, 51, true)] + [TestCase(-1, 51, false)] + public void ItemLevelBlockItemMatch_ReturnsCorrectResult(FilterPredicateOperator testInputFilterPredicateOperator, int testInputBlockItemItemLevel, bool expectedResult) + { + //Arrange + var testInputItem = Mock.Of(i => i.ItemLevel == 50); + var testInputBlockItem = new ItemLevelBlockItem(testInputFilterPredicateOperator, testInputBlockItemItemLevel); + + //Act + var result = _testUtility.ItemBlockItemMatcher.ItemLevelBlockItemMatch(testInputBlockItem, testInputItem); + + //Assert + Assert.AreEqual(expectedResult, result); + } + + [TestCase(FilterPredicateOperator.Equal, 2, false)] + [TestCase(FilterPredicateOperator.Equal, 3, true)] + [TestCase(FilterPredicateOperator.Equal, 4, false)] + [TestCase(FilterPredicateOperator.GreaterThan, 2, true)] + [TestCase(FilterPredicateOperator.GreaterThan, 3, false)] + [TestCase(FilterPredicateOperator.GreaterThan, 4, false)] + [TestCase(FilterPredicateOperator.GreaterThanOrEqual, 2, true)] + [TestCase(FilterPredicateOperator.GreaterThanOrEqual, 3, true)] + [TestCase(FilterPredicateOperator.GreaterThanOrEqual, 4, false)] + [TestCase(FilterPredicateOperator.LessThan, 2, false)] + [TestCase(FilterPredicateOperator.LessThan, 3, false)] + [TestCase(FilterPredicateOperator.LessThan, 4, true)] + [TestCase(FilterPredicateOperator.LessThanOrEqual, 2, false)] + [TestCase(FilterPredicateOperator.LessThanOrEqual, 3, true)] + [TestCase(FilterPredicateOperator.LessThanOrEqual, 4, true)] + [TestCase(-1, 3, false)] + public void LinkedSocketsBlockItemMatch_ReturnsCorrectResult(FilterPredicateOperator testInputFilterPredicateOperator, int testInputBlockItemLinkedSockets, bool expectedResult) + { + //Arrange + var testInputItem = Mock.Of(i => i.LinkedSockets == 3); + var testInputBlockItem = new LinkedSocketsBlockItem(testInputFilterPredicateOperator, testInputBlockItemLinkedSockets); + + //Act + var result = _testUtility.ItemBlockItemMatcher.LinkedSocketsBlockItemMatch(testInputBlockItem, testInputItem); + + //Assert + Assert.AreEqual(expectedResult, result); + } + + [TestCase(FilterPredicateOperator.Equal, 11, false)] + [TestCase(FilterPredicateOperator.Equal, 12, true)] + [TestCase(FilterPredicateOperator.Equal, 13, false)] + [TestCase(FilterPredicateOperator.GreaterThan, 11, true)] + [TestCase(FilterPredicateOperator.GreaterThan, 12, false)] + [TestCase(FilterPredicateOperator.GreaterThan, 13, false)] + [TestCase(FilterPredicateOperator.GreaterThanOrEqual, 11, true)] + [TestCase(FilterPredicateOperator.GreaterThanOrEqual, 12, true)] + [TestCase(FilterPredicateOperator.GreaterThanOrEqual, 13, false)] + [TestCase(FilterPredicateOperator.LessThan, 11, false)] + [TestCase(FilterPredicateOperator.LessThan, 12, false)] + [TestCase(FilterPredicateOperator.LessThan, 13, true)] + [TestCase(FilterPredicateOperator.LessThanOrEqual, 11, false)] + [TestCase(FilterPredicateOperator.LessThanOrEqual, 12, true)] + [TestCase(FilterPredicateOperator.LessThanOrEqual, 13, true)] + [TestCase(-1, 13, false)] + public void QualityBlockItemMatch_ReturnsCorrectResult(FilterPredicateOperator testInputFilterPredicateOperator, int testInputBlockItemQuality, bool expectedResult) + { + //Arrange + var testInputItem = Mock.Of(i => i.Quality == 12); + var testInputBlockItem = new QualityBlockItem(testInputFilterPredicateOperator, testInputBlockItemQuality); + + //Act + var result = _testUtility.ItemBlockItemMatcher.QualityBlockItemMatch(testInputBlockItem, testInputItem); + + //Assert + Assert.AreEqual(expectedResult, result); + } + + [TestCase(FilterPredicateOperator.Equal, ItemRarity.Normal, false)] + [TestCase(FilterPredicateOperator.Equal, ItemRarity.Magic , true)] + [TestCase(FilterPredicateOperator.Equal, ItemRarity.Rare, false)] + [TestCase(FilterPredicateOperator.GreaterThan, ItemRarity.Normal, true)] + [TestCase(FilterPredicateOperator.GreaterThan, ItemRarity.Magic, false)] + [TestCase(FilterPredicateOperator.GreaterThan, ItemRarity.Rare, false)] + [TestCase(FilterPredicateOperator.GreaterThanOrEqual, ItemRarity.Normal, true)] + [TestCase(FilterPredicateOperator.GreaterThanOrEqual, ItemRarity.Magic, true)] + [TestCase(FilterPredicateOperator.GreaterThanOrEqual, ItemRarity.Rare, false)] + [TestCase(FilterPredicateOperator.LessThan, ItemRarity.Normal, false)] + [TestCase(FilterPredicateOperator.LessThan, ItemRarity.Magic, false)] + [TestCase(FilterPredicateOperator.LessThan, ItemRarity.Rare, true)] + [TestCase(FilterPredicateOperator.LessThanOrEqual, ItemRarity.Normal, false)] + [TestCase(FilterPredicateOperator.LessThanOrEqual, ItemRarity.Magic, true)] + [TestCase(FilterPredicateOperator.LessThanOrEqual, ItemRarity.Rare, true)] + [TestCase(-1, 13, false)] + public void RarityBlockItemMatch_ReturnsCorrectResult(FilterPredicateOperator testInputFilterPredicateOperator, int testInputBlockItemRarity, bool expectedResult) + { + //Arrange + var testInputItem = Mock.Of(i => i.ItemRarity == ItemRarity.Magic); + var testInputBlockItem = new RarityBlockItem(testInputFilterPredicateOperator, testInputBlockItemRarity); + + //Act + var result = _testUtility.ItemBlockItemMatcher.RarityBlockItemMatch(testInputBlockItem, testInputItem); + + //Assert + Assert.AreEqual(expectedResult, result); + } + + [TestCase(FilterPredicateOperator.Equal, 2, false)] + [TestCase(FilterPredicateOperator.Equal, 3, true)] + [TestCase(FilterPredicateOperator.Equal, 4, false)] + [TestCase(FilterPredicateOperator.GreaterThan, 2, true)] + [TestCase(FilterPredicateOperator.GreaterThan, 3, false)] + [TestCase(FilterPredicateOperator.GreaterThan, 4, false)] + [TestCase(FilterPredicateOperator.GreaterThanOrEqual, 2, true)] + [TestCase(FilterPredicateOperator.GreaterThanOrEqual, 3, true)] + [TestCase(FilterPredicateOperator.GreaterThanOrEqual, 4, false)] + [TestCase(FilterPredicateOperator.LessThan, 2, false)] + [TestCase(FilterPredicateOperator.LessThan, 3, false)] + [TestCase(FilterPredicateOperator.LessThan, 4, true)] + [TestCase(FilterPredicateOperator.LessThanOrEqual, 2, false)] + [TestCase(FilterPredicateOperator.LessThanOrEqual, 3, true)] + [TestCase(FilterPredicateOperator.LessThanOrEqual, 4, true)] + [TestCase(-1, 3, false)] + public void SocketsBlockItemMatch_ReturnsCorrectResult(FilterPredicateOperator testInputFilterPredicateOperator, int testInputBlockItemSockets, bool expectedResult) + { + //Arrange + var testInputItem = Mock.Of(i => i.Sockets == 3); + var testInputBlockItem = new SocketsBlockItem(testInputFilterPredicateOperator, testInputBlockItemSockets); + + //Act + var result = _testUtility.ItemBlockItemMatcher.SocketsBlockItemMatch(testInputBlockItem, testInputItem); + + //Assert + Assert.AreEqual(expectedResult, result); + } + + [TestCase(FilterPredicateOperator.Equal, 1, false)] + [TestCase(FilterPredicateOperator.Equal, 2, true)] + [TestCase(FilterPredicateOperator.Equal, 3, false)] + [TestCase(FilterPredicateOperator.GreaterThan, 1, true)] + [TestCase(FilterPredicateOperator.GreaterThan, 2, false)] + [TestCase(FilterPredicateOperator.GreaterThan, 3, false)] + [TestCase(FilterPredicateOperator.GreaterThanOrEqual, 1, true)] + [TestCase(FilterPredicateOperator.GreaterThanOrEqual, 2, true)] + [TestCase(FilterPredicateOperator.GreaterThanOrEqual, 3, false)] + [TestCase(FilterPredicateOperator.LessThan, 1, false)] + [TestCase(FilterPredicateOperator.LessThan, 2, false)] + [TestCase(FilterPredicateOperator.LessThan, 3, true)] + [TestCase(FilterPredicateOperator.LessThanOrEqual, 1, false)] + [TestCase(FilterPredicateOperator.LessThanOrEqual, 2, true)] + [TestCase(FilterPredicateOperator.LessThanOrEqual, 3, true)] + [TestCase(-1, 3, false)] + public void WidthBlockItemMatch_ReturnsCorrectResult(FilterPredicateOperator testInputFilterPredicateOperator, int testInputBlockItemWidth, bool expectedResult) + { + //Arrange + var testInputItem = Mock.Of(i => i.Width == 2); + var testInputBlockItem = new WidthBlockItem(testInputFilterPredicateOperator, testInputBlockItemWidth); + + //Act + var result = _testUtility.ItemBlockItemMatcher.WidthBlockItemMatch(testInputBlockItem, testInputItem); + + //Assert + Assert.AreEqual(expectedResult, result); + } + + [Test] + public void SocketGroupBlockItemMatch_SingleItemSocketGroup_SingleBlockItemSocketGroup_Match_ReturnsCorrectResult() + { + //Arrange + var testInputBlockItem = new SocketGroupBlockItem(); + testInputBlockItem.Items.Add("RGB"); + + var testInputItem = Mock.Of(i => i.LinkedSocketGroups == new List + { + new SocketGroup(new List + { + new Socket(SocketColor.Red), + new Socket(SocketColor.Green), + new Socket(SocketColor.Blue), + }, true) + }); + + //Act + var result = _testUtility.ItemBlockItemMatcher.SocketGroupBlockItemMatch(testInputBlockItem, testInputItem); + + //Assert + Assert.IsTrue(result); + } + + [Test] + public void SocketGroupBlockItemMatch_SingleItemSocketGroup_SingleBlockItemSocketGroup_NoMatch_ReturnsCorrectResult() + { + //Arrange + var testInputBlockItem = new SocketGroupBlockItem(); + testInputBlockItem.Items.Add("RGB"); + + var testInputItem = Mock.Of(i => i.LinkedSocketGroups == new List + { + new SocketGroup(new List + { + new Socket(SocketColor.Red), + new Socket(SocketColor.Green) + }, true) + }); + + //Act + var result = _testUtility.ItemBlockItemMatcher.SocketGroupBlockItemMatch(testInputBlockItem, testInputItem); + + //Assert + Assert.IsFalse(result); + } + + [Test] + public void SocketGroupBlockItemMatch_MultipleItemSocketGroup_SingleBlockItemSocketGroup_NoMatch_ReturnsCorrectResult() + { + //Arrange + var testInputBlockItem = new SocketGroupBlockItem(); + testInputBlockItem.Items.Add("RGB"); + testInputBlockItem.Items.Add("RGWW"); + testInputBlockItem.Items.Add("RRGG"); + testInputBlockItem.Items.Add("WWWW"); + + var testInputItem = Mock.Of(i => i.LinkedSocketGroups == new List + { + new SocketGroup(new List + { + new Socket(SocketColor.Red), + new Socket(SocketColor.Green), + new Socket(SocketColor.White), + new Socket(SocketColor.Green) + + }, true) + }); + + //Act + var result = _testUtility.ItemBlockItemMatcher.SocketGroupBlockItemMatch(testInputBlockItem, testInputItem); + + //Assert + Assert.IsFalse(result); + } + + [Test] + public void SocketGroupBlockItemMatch_MultipleItemSocketGroup_SingleBlockItemSocketGroup_Match_ReturnsCorrectResult() + { + //Arrange + var testInputBlockItem = new SocketGroupBlockItem(); + testInputBlockItem.Items.Add("RGB"); + testInputBlockItem.Items.Add("RGWW"); + testInputBlockItem.Items.Add("RGWG"); + testInputBlockItem.Items.Add("WWWW"); + + var testInputItem = Mock.Of(i => i.LinkedSocketGroups == new List + { + new SocketGroup(new List + { + new Socket(SocketColor.Red), + new Socket(SocketColor.Green), + new Socket(SocketColor.White), + new Socket(SocketColor.Green) + + }, true) + }); + + //Act + var result = _testUtility.ItemBlockItemMatcher.SocketGroupBlockItemMatch(testInputBlockItem, testInputItem); + + //Assert + Assert.IsTrue(result); + } + private class ItemBlockItemMatcherTestUtility { diff --git a/Filtration.ItemFilterPreview/Filtration.ItemFilterPreview.csproj b/Filtration.ItemFilterPreview/Filtration.ItemFilterPreview.csproj index 86d0fa1..f062c70 100644 --- a/Filtration.ItemFilterPreview/Filtration.ItemFilterPreview.csproj +++ b/Filtration.ItemFilterPreview/Filtration.ItemFilterPreview.csproj @@ -58,8 +58,6 @@ - - diff --git a/Filtration.ItemFilterPreview/Model/Item.cs b/Filtration.ItemFilterPreview/Model/Item.cs index fec52bd..9006fe1 100644 --- a/Filtration.ItemFilterPreview/Model/Item.cs +++ b/Filtration.ItemFilterPreview/Model/Item.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Filtration.ObjectModel; using Filtration.ObjectModel.Enums; namespace Filtration.ItemFilterPreview.Model @@ -18,6 +19,7 @@ namespace Filtration.ItemFilterPreview.Model ItemRarity ItemRarity { get; set; } int Sockets { get; } int LinkedSockets { get; } + IEnumerable LinkedSocketGroups { get; } } public class Item : IItem @@ -29,6 +31,11 @@ namespace Filtration.ItemFilterPreview.Model } + public IEnumerable LinkedSocketGroups + { + get { return SocketGroups.Where(s => s.Linked); } + } + public List SocketGroups { get { return _socketGroups; } diff --git a/Filtration.ItemFilterPreview/Model/Socket.cs b/Filtration.ItemFilterPreview/Model/Socket.cs deleted file mode 100644 index f581fbd..0000000 --- a/Filtration.ItemFilterPreview/Model/Socket.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Windows.Media; - -namespace Filtration.ItemFilterPreview.Model -{ - public class Socket - { - public Socket(Color color) - { - Color = color; - } - - public Color Color { get; } - } -} \ No newline at end of file diff --git a/Filtration.ItemFilterPreview/Services/ItemBlockItemMatcher.cs b/Filtration.ItemFilterPreview/Services/ItemBlockItemMatcher.cs index 9af5f6b..af1d8e7 100644 --- a/Filtration.ItemFilterPreview/Services/ItemBlockItemMatcher.cs +++ b/Filtration.ItemFilterPreview/Services/ItemBlockItemMatcher.cs @@ -1,9 +1,13 @@ using System; +using System.Collections.Generic; using System.Linq; +using System.Windows; using Filtration.ItemFilterPreview.Model; +using Filtration.ObjectModel; using Filtration.ObjectModel.BlockItemBaseTypes; using Filtration.ObjectModel.BlockItemTypes; using Filtration.ObjectModel.Enums; +using Filtration.ObjectModel.Extensions; namespace Filtration.ItemFilterPreview.Services { @@ -31,35 +35,78 @@ namespace Filtration.ItemFilterPreview.Services return NumericFilterPredicateBlockItemMatch(dropLevelBlockItem, item.DropLevel); } - private bool NumericFilterPredicateBlockItemMatch(T numericFilterPredicateBlockItem, int matchValue) where T : NumericFilterPredicateBlockItem + public bool HeightBlockItemMatch(HeightBlockItem heightBlockItem, IItem item) { - switch (numericFilterPredicateBlockItem.FilterPredicate.PredicateOperator) + return NumericFilterPredicateBlockItemMatch(heightBlockItem, item.Height); + } + + public bool ItemLevelBlockItemMatch(ItemLevelBlockItem itemLevelBlockItem, IItem item) + { + return NumericFilterPredicateBlockItemMatch(itemLevelBlockItem, item.ItemLevel); + } + + public bool LinkedSocketsBlockItemMatch(LinkedSocketsBlockItem linkedSocketsBlockItem, IItem item) + { + return NumericFilterPredicateBlockItemMatch(linkedSocketsBlockItem, item.LinkedSockets); + } + + public bool QualityBlockItemMatch(QualityBlockItem qualityBlockItem, IItem item) + { + return NumericFilterPredicateBlockItemMatch(qualityBlockItem, item.Quality); + } + + public bool RarityBlockItemMatch(RarityBlockItem qualityBlockItem, IItem item) + { + return NumericFilterPredicateBlockItemMatch(qualityBlockItem, (int)item.ItemRarity); + } + + public bool SocketsBlockItemMatch(SocketsBlockItem socketsBlockItem, IItem item) + { + return NumericFilterPredicateBlockItemMatch(socketsBlockItem, item.Sockets); + } + + public bool WidthBlockItemMatch(WidthBlockItem widthBlockItem, IItem item) + { + return NumericFilterPredicateBlockItemMatch(widthBlockItem, item.Width); + } + + public bool SocketGroupBlockItemMatch(SocketGroupBlockItem socketGroupBlockItem, IItem item) + { + + foreach (var blockItemSocketGroup in socketGroupBlockItem.SocketGroups) // for each group of sockets in the block item { - case FilterPredicateOperator.Equal: + foreach (var itemLinkedSocketGroup in item.LinkedSocketGroups) // for each linked socket group in the item { - return matchValue == numericFilterPredicateBlockItem.FilterPredicate.PredicateOperand; + if (SocketGroupHasRequiredSocketColors(itemLinkedSocketGroup, blockItemSocketGroup)) + { + return true; + } } - case FilterPredicateOperator.GreaterThan: - { - return matchValue > numericFilterPredicateBlockItem.FilterPredicate.PredicateOperand; - } - case FilterPredicateOperator.GreaterThanOrEqual: - { - return matchValue >= numericFilterPredicateBlockItem.FilterPredicate.PredicateOperand; - } - case FilterPredicateOperator.LessThan: - { - return matchValue < numericFilterPredicateBlockItem.FilterPredicate.PredicateOperand; - } - case FilterPredicateOperator.LessThanOrEqual: - { - return matchValue <= numericFilterPredicateBlockItem.FilterPredicate.PredicateOperand; - } - default: + } + return false; + } + + private bool SocketGroupHasRequiredSocketColors(SocketGroup itemLinkedSocketGroup, SocketGroup blockItemSocketGroup) + { + + var blockSocketGroupColorCounts = blockItemSocketGroup.GroupBy(i => i.Color, (key, values) => new { SocketColor = key, Count = values.Count() }).ToList(); + var itemSocketGroupColorCounts = itemLinkedSocketGroup.GroupBy(i => i.Color, (key, values) => new {SocketColor = key, Count = values.Count()}).ToList(); + + foreach (var blockItemSocketColorCount in blockSocketGroupColorCounts) + { + var match = itemSocketGroupColorCounts.FirstOrDefault(i => i.SocketColor == blockItemSocketColorCount.SocketColor && i.Count >= blockItemSocketColorCount.Count); + if (match == null) { return false; } } + + return true; + } + + private bool NumericFilterPredicateBlockItemMatch(T numericFilterPredicateBlockItem, int matchValue) where T : NumericFilterPredicateBlockItem + { + return numericFilterPredicateBlockItem.FilterPredicate.CompareUsing(matchValue); } } } diff --git a/Filtration.ObjectModel/BlockItemTypes/SocketGroupBlockItem.cs b/Filtration.ObjectModel/BlockItemTypes/SocketGroupBlockItem.cs index df58486..932d264 100644 --- a/Filtration.ObjectModel/BlockItemTypes/SocketGroupBlockItem.cs +++ b/Filtration.ObjectModel/BlockItemTypes/SocketGroupBlockItem.cs @@ -1,11 +1,19 @@ -using System.Linq; +using System; +using System.Collections.Generic; +using System.Linq; using System.Windows.Media; using Filtration.ObjectModel.BlockItemBaseTypes; +using Filtration.ObjectModel.Enums; namespace Filtration.ObjectModel.BlockItemTypes { public class SocketGroupBlockItem : StringListBlockItem { + public SocketGroupBlockItem() + { + + } + public override string PrefixText => "SocketGroup"; public override int MaximumAllowed => 1; public override string DisplayHeading => "Socket Group"; @@ -17,8 +25,47 @@ namespace Filtration.ObjectModel.BlockItemTypes return "Socket Group " + summaryItemText.TrimStart(' '); } } + + public IEnumerable SocketGroups + { + get + { + return + Items.Select(socketGroup => socketGroup.Select(socketChar => new Socket(StringToSocketColor(socketChar))).ToList()) + .Select(socketList => new SocketGroup(socketList, true)) + .ToList(); + } + } + public override Color SummaryBackgroundColor => Colors.GhostWhite; public override Color SummaryTextColor => Colors.Black; public override int SortOrder => 9; + + private SocketColor StringToSocketColor(char socketColorString) + { + switch (socketColorString) + { + case 'R': + { + return SocketColor.Red; + } + case 'G': + { + return SocketColor.Green; + } + case 'B': + { + return SocketColor.Blue; + } + case 'W': + { + return SocketColor.White; + } + default: + { + throw new InvalidOperationException("Invalid socket color"); + } + } + } } } diff --git a/Filtration.ObjectModel/Filtration.ObjectModel.csproj b/Filtration.ObjectModel/Filtration.ObjectModel.csproj index 9aadf57..453d2fe 100644 --- a/Filtration.ObjectModel/Filtration.ObjectModel.csproj +++ b/Filtration.ObjectModel/Filtration.ObjectModel.csproj @@ -82,6 +82,8 @@ + + diff --git a/Filtration.ObjectModel/NumericFilterPredicate.cs b/Filtration.ObjectModel/NumericFilterPredicate.cs index 1efd969..8f50ff4 100644 --- a/Filtration.ObjectModel/NumericFilterPredicate.cs +++ b/Filtration.ObjectModel/NumericFilterPredicate.cs @@ -1,4 +1,5 @@ -using System.ComponentModel; +using System; +using System.ComponentModel; using System.Runtime.CompilerServices; using Filtration.ObjectModel.Annotations; using Filtration.ObjectModel.Enums; @@ -42,6 +43,37 @@ namespace Filtration.ObjectModel } } + public bool CompareUsing(int target) + { + switch (PredicateOperator) + { + case FilterPredicateOperator.Equal: + { + return target == PredicateOperand; + } + case FilterPredicateOperator.GreaterThan: + { + return target > PredicateOperand; + } + case FilterPredicateOperator.GreaterThanOrEqual: + { + return target >= PredicateOperand; + } + case FilterPredicateOperator.LessThan: + { + return target < PredicateOperand; + } + case FilterPredicateOperator.LessThanOrEqual: + { + return target <= PredicateOperand; + } + default: + { + return false; + } + } + } + public override string ToString() { return PredicateOperator.GetAttributeDescription() + " " + PredicateOperand; diff --git a/Filtration.ObjectModel/Socket.cs b/Filtration.ObjectModel/Socket.cs new file mode 100644 index 0000000..7fa01c4 --- /dev/null +++ b/Filtration.ObjectModel/Socket.cs @@ -0,0 +1,14 @@ +using Filtration.ObjectModel.Enums; + +namespace Filtration.ObjectModel +{ + public class Socket + { + public Socket(SocketColor color) + { + Color = color; + } + + public SocketColor Color { get; } + } +} \ No newline at end of file diff --git a/Filtration.ItemFilterPreview/Model/SocketGroup.cs b/Filtration.ObjectModel/SocketGroup.cs similarity index 93% rename from Filtration.ItemFilterPreview/Model/SocketGroup.cs rename to Filtration.ObjectModel/SocketGroup.cs index 2792c74..89e72ba 100644 --- a/Filtration.ItemFilterPreview/Model/SocketGroup.cs +++ b/Filtration.ObjectModel/SocketGroup.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace Filtration.ItemFilterPreview.Model +namespace Filtration.ObjectModel { public class SocketGroup : List {