More work on item filter processing

This commit is contained in:
Ben Wallis 2015-12-28 17:30:34 +00:00
parent 89e98fc8c6
commit 1bdc8bf6fd
21 changed files with 420 additions and 216 deletions

View File

@ -42,6 +42,14 @@
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="FluentAssertions, Version=4.1.1.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL">
<HintPath>..\packages\FluentAssertions.4.1.1\lib\net45\FluentAssertions.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="FluentAssertions.Core, Version=4.1.1.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL">
<HintPath>..\packages\FluentAssertions.4.1.1\lib\net45\FluentAssertions.Core.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Moq, Version=4.2.1510.2205, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL"> <Reference Include="Moq, Version=4.2.1510.2205, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL">
<HintPath>..\packages\Moq.4.2.1510.2205\lib\net40\Moq.dll</HintPath> <HintPath>..\packages\Moq.4.2.1510.2205\lib\net40\Moq.dll</HintPath>
<Private>True</Private> <Private>True</Private>
@ -51,6 +59,8 @@
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Xml" />
<Reference Include="System.Xml.Linq" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies"> <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">

View File

@ -26,11 +26,104 @@ namespace Filtration.ItemFilterPreview.Tests.Services
_testUtility = new ItemBlockItemMatcherTestUtility(); _testUtility = new ItemBlockItemMatcherTestUtility();
} }
[Test]
public void ItemBlockMatch_EmptyShowBlock_ReturnsTrue()
{
//Arrange
var testInputItem = Mock.Of<IItem>();
var testInputBlock = new ItemFilterBlock();
//Act
var result = _testUtility.BlockItemMatcher.ItemBlockMatch(testInputBlock, testInputItem);
//Assert
Assert.IsTrue(result);
}
[Test]
public void ItemBlockMatch_SingleBlockItem_Matches_ReturnsTrue()
{
//Arrange
var testBaseType = "Test Base Type";
var testInputItem = Mock.Of<IItem>(i => i.BaseType == testBaseType);
var testInputBlock = new ItemFilterBlock();
var baseTypeBlockItem = new BaseTypeBlockItem();
baseTypeBlockItem.Items.Add(testBaseType);
testInputBlock.BlockItems.Add(baseTypeBlockItem);
//Act
var result = _testUtility.BlockItemMatcher.ItemBlockMatch(testInputBlock, testInputItem);
//Assert
Assert.IsTrue(result);
}
[Test]
public void ItemBlockMatch_SingleBlockItem_DoesNotMatche_ReturnsFalse()
{
//Arrange
var testInputItem = Mock.Of<IItem>(i => i.BaseType == "Base Type 1");
var testInputBlock = new ItemFilterBlock();
var baseTypeBlockItem = new BaseTypeBlockItem();
baseTypeBlockItem.Items.Add("Base Type 2");
testInputBlock.BlockItems.Add(baseTypeBlockItem);
//Act
var result = _testUtility.BlockItemMatcher.ItemBlockMatch(testInputBlock, testInputItem);
//Assert
Assert.IsFalse(result);
}
[Test]
public void ItemBlockMatch_MultipleBlockItems_Matches_ReturnsTrue()
{
//Arrange
var testInputItem = Mock.Of<IItem>(i => i.BaseType == "Base Type 1" && i.Height == 4 && i.Width == 2);
var testInputBlock = new ItemFilterBlock();
var baseTypeBlockItem = new BaseTypeBlockItem();
baseTypeBlockItem.Items.Add("Base Type 1");
var heightBlockItem = new HeightBlockItem(FilterPredicateOperator.Equal, 4);
var widthBlockItem = new WidthBlockItem(FilterPredicateOperator.Equal, 2);
testInputBlock.BlockItems.Add(baseTypeBlockItem);
testInputBlock.BlockItems.Add(heightBlockItem);
testInputBlock.BlockItems.Add(widthBlockItem);
//Act
var result = _testUtility.BlockItemMatcher.ItemBlockMatch(testInputBlock, testInputItem);
//Assert
Assert.IsTrue(result);
}
[Test]
public void ItemBlockMatch_MultipleBlockItems_DoesNotMatch_ReturnsFalse()
{
//Arrange
var testInputItem = Mock.Of<IItem>(i => i.BaseType == "Base Type 1" && i.Height == 4 && i.Width == 2);
var testInputBlock = new ItemFilterBlock();
var baseTypeBlockItem = new BaseTypeBlockItem();
baseTypeBlockItem.Items.Add("Base Type d");
var heightBlockItem = new HeightBlockItem(FilterPredicateOperator.Equal, 3);
var widthBlockItem = new WidthBlockItem(FilterPredicateOperator.Equal, 2);
testInputBlock.BlockItems.Add(baseTypeBlockItem);
testInputBlock.BlockItems.Add(heightBlockItem);
testInputBlock.BlockItems.Add(widthBlockItem);
//Act
var result = _testUtility.BlockItemMatcher.ItemBlockMatch(testInputBlock, testInputItem);
//Assert
Assert.IsFalse(result);
}
[TestCase("Test Base Type", true)] [TestCase("Test Base Type", true)]
[TestCase("Test Bas", true)] [TestCase("Test Bas", true)]
[TestCase("T", true)] [TestCase("T", true)]
[TestCase("Base Type", false)] [TestCase("Base Type", false)]
public void BaseTypeBlockItemMatch_SingleBlockItemValue_ReturnsTrue(string testInputBaseType, bool expectedResult) public void ItemBlockItemMatch_BaseTypeBlockItem_SingleBlockItemValue_ReturnsTrue(string testInputBaseType, bool expectedResult)
{ {
//Arrange //Arrange
var testInputItem = Mock.Of<IItem>(i => i.BaseType == "Test Base Type"); var testInputItem = Mock.Of<IItem>(i => i.BaseType == "Test Base Type");
@ -38,7 +131,7 @@ namespace Filtration.ItemFilterPreview.Tests.Services
testInputBaseTypeBlockItem.Items.Add(testInputBaseType); testInputBaseTypeBlockItem.Items.Add(testInputBaseType);
//Act //Act
var result = _testUtility.ItemBlockItemMatcher.BaseTypeBlockItemMatch(testInputBaseTypeBlockItem, testInputItem); var result = _testUtility.BlockItemMatcher.ItemBlockItemMatch(testInputBaseTypeBlockItem, testInputItem);
//Assert //Assert
Assert.AreEqual(expectedResult, result); Assert.AreEqual(expectedResult, result);
@ -48,7 +141,7 @@ namespace Filtration.ItemFilterPreview.Tests.Services
[TestCase("Test Bas", true)] [TestCase("Test Bas", true)]
[TestCase("T", true)] [TestCase("T", true)]
[TestCase("Base Type", false)] [TestCase("Base Type", false)]
public void BaseTypeBlockItemMatch_MultipleBlockItemValues_ReturnsCorrectResult(string testInputBaseType, bool expectedResult) public void ItemBlockItemMatch_BaseTypeBlockItem_MultipleBlockItemValues_ReturnsCorrectResult(string testInputBaseType, bool expectedResult)
{ {
//Arrange //Arrange
var testInputItem = Mock.Of<IItem>(i => i.BaseType == "Test Base Type"); var testInputItem = Mock.Of<IItem>(i => i.BaseType == "Test Base Type");
@ -58,7 +151,7 @@ namespace Filtration.ItemFilterPreview.Tests.Services
testInputBlockItem.Items.Add("Blah"); testInputBlockItem.Items.Add("Blah");
//Act //Act
var result = _testUtility.ItemBlockItemMatcher.BaseTypeBlockItemMatch(testInputBlockItem, testInputItem); var result = _testUtility.BlockItemMatcher.ItemBlockItemMatch(testInputBlockItem, testInputItem);
//Assert //Assert
Assert.AreEqual(expectedResult, result); Assert.AreEqual(expectedResult, result);
@ -68,7 +161,7 @@ namespace Filtration.ItemFilterPreview.Tests.Services
[TestCase("Test It", true)] [TestCase("Test It", true)]
[TestCase("T", true)] [TestCase("T", true)]
[TestCase("Item Class", false)] [TestCase("Item Class", false)]
public void ItemClassBlockItemMatch_SingleBlockItemValue_ReturnsCorrectResult(string testInputBlockItemItemClass, bool expectedResult) public void ItemBlockItemMatch_ClassBlockItem_SingleBlockItemValue_ReturnsCorrectResult(string testInputBlockItemItemClass, bool expectedResult)
{ {
//Arrange //Arrange
var testInputItem = Mock.Of<IItem>(i => i.ItemClass == "Test Item Class"); var testInputItem = Mock.Of<IItem>(i => i.ItemClass == "Test Item Class");
@ -76,7 +169,7 @@ namespace Filtration.ItemFilterPreview.Tests.Services
testInputBlockItem.Items.Add(testInputBlockItemItemClass); testInputBlockItem.Items.Add(testInputBlockItemItemClass);
//Act //Act
var result = _testUtility.ItemBlockItemMatcher.ClassBlockItemMatch(testInputBlockItem, testInputItem); var result = _testUtility.BlockItemMatcher.ItemBlockItemMatch(testInputBlockItem, testInputItem);
//Assert //Assert
Assert.AreEqual(expectedResult, result); Assert.AreEqual(expectedResult, result);
@ -98,14 +191,14 @@ namespace Filtration.ItemFilterPreview.Tests.Services
[TestCase(FilterPredicateOperator.LessThanOrEqual, 50, true)] [TestCase(FilterPredicateOperator.LessThanOrEqual, 50, true)]
[TestCase(FilterPredicateOperator.LessThanOrEqual, 51, true)] [TestCase(FilterPredicateOperator.LessThanOrEqual, 51, true)]
[TestCase(-1, 51, false)] [TestCase(-1, 51, false)]
public void DropLevelBlockItemMatch_ReturnsCorrectResult(FilterPredicateOperator testInputFilterPredicateOperator, int testInputBlockItemDropLevel, bool expectedResult) public void ItemBlockItemMatch_DropLevelBlockItem_ReturnsCorrectResult(FilterPredicateOperator testInputFilterPredicateOperator, int testInputBlockItemDropLevel, bool expectedResult)
{ {
//Arrange //Arrange
var testInputItem = Mock.Of<IItem>(i => i.DropLevel == 50); var testInputItem = Mock.Of<IItem>(i => i.DropLevel == 50);
var testInputBlockItem = new DropLevelBlockItem(testInputFilterPredicateOperator, testInputBlockItemDropLevel); var testInputBlockItem = new DropLevelBlockItem(testInputFilterPredicateOperator, testInputBlockItemDropLevel);
//Act //Act
var result = _testUtility.ItemBlockItemMatcher.DropLevelBlockItemMatch(testInputBlockItem, testInputItem); var result = _testUtility.BlockItemMatcher.ItemBlockItemMatch(testInputBlockItem, testInputItem);
//Assert //Assert
Assert.AreEqual(expectedResult, result); Assert.AreEqual(expectedResult, result);
@ -127,14 +220,14 @@ namespace Filtration.ItemFilterPreview.Tests.Services
[TestCase(FilterPredicateOperator.LessThanOrEqual, 2, true)] [TestCase(FilterPredicateOperator.LessThanOrEqual, 2, true)]
[TestCase(FilterPredicateOperator.LessThanOrEqual, 3, true)] [TestCase(FilterPredicateOperator.LessThanOrEqual, 3, true)]
[TestCase(-1, 3, false)] [TestCase(-1, 3, false)]
public void HeightBlockItemMatch_ReturnsCorrectResult(FilterPredicateOperator testInputFilterPredicateOperator, int testInputBlockItemHeight, bool expectedResult) public void ItemBlockItemMatch_HeightBlockItem_ReturnsCorrectResult(FilterPredicateOperator testInputFilterPredicateOperator, int testInputBlockItemHeight, bool expectedResult)
{ {
//Arrange //Arrange
var testInputItem = Mock.Of<IItem>(i => i.Height == 2); var testInputItem = Mock.Of<IItem>(i => i.Height == 2);
var testInputBlockItem = new HeightBlockItem(testInputFilterPredicateOperator, testInputBlockItemHeight); var testInputBlockItem = new HeightBlockItem(testInputFilterPredicateOperator, testInputBlockItemHeight);
//Act //Act
var result = _testUtility.ItemBlockItemMatcher.HeightBlockItemMatch(testInputBlockItem, testInputItem); var result = _testUtility.BlockItemMatcher.ItemBlockItemMatch(testInputBlockItem, testInputItem);
//Assert //Assert
Assert.AreEqual(expectedResult, result); Assert.AreEqual(expectedResult, result);
@ -156,14 +249,14 @@ namespace Filtration.ItemFilterPreview.Tests.Services
[TestCase(FilterPredicateOperator.LessThanOrEqual, 50, true)] [TestCase(FilterPredicateOperator.LessThanOrEqual, 50, true)]
[TestCase(FilterPredicateOperator.LessThanOrEqual, 51, true)] [TestCase(FilterPredicateOperator.LessThanOrEqual, 51, true)]
[TestCase(-1, 51, false)] [TestCase(-1, 51, false)]
public void ItemLevelBlockItemMatch_ReturnsCorrectResult(FilterPredicateOperator testInputFilterPredicateOperator, int testInputBlockItemItemLevel, bool expectedResult) public void ItemBlockItemMatch_ItemLevelBlockItem_ReturnsCorrectResult(FilterPredicateOperator testInputFilterPredicateOperator, int testInputBlockItemItemLevel, bool expectedResult)
{ {
//Arrange //Arrange
var testInputItem = Mock.Of<IItem>(i => i.ItemLevel == 50); var testInputItem = Mock.Of<IItem>(i => i.ItemLevel == 50);
var testInputBlockItem = new ItemLevelBlockItem(testInputFilterPredicateOperator, testInputBlockItemItemLevel); var testInputBlockItem = new ItemLevelBlockItem(testInputFilterPredicateOperator, testInputBlockItemItemLevel);
//Act //Act
var result = _testUtility.ItemBlockItemMatcher.ItemLevelBlockItemMatch(testInputBlockItem, testInputItem); var result = _testUtility.BlockItemMatcher.ItemBlockItemMatch(testInputBlockItem, testInputItem);
//Assert //Assert
Assert.AreEqual(expectedResult, result); Assert.AreEqual(expectedResult, result);
@ -185,14 +278,14 @@ namespace Filtration.ItemFilterPreview.Tests.Services
[TestCase(FilterPredicateOperator.LessThanOrEqual, 3, true)] [TestCase(FilterPredicateOperator.LessThanOrEqual, 3, true)]
[TestCase(FilterPredicateOperator.LessThanOrEqual, 4, true)] [TestCase(FilterPredicateOperator.LessThanOrEqual, 4, true)]
[TestCase(-1, 3, false)] [TestCase(-1, 3, false)]
public void LinkedSocketsBlockItemMatch_ReturnsCorrectResult(FilterPredicateOperator testInputFilterPredicateOperator, int testInputBlockItemLinkedSockets, bool expectedResult) public void ItemBlockItemMatch_LinkedSocketsBlockItem_ReturnsCorrectResult(FilterPredicateOperator testInputFilterPredicateOperator, int testInputBlockItemLinkedSockets, bool expectedResult)
{ {
//Arrange //Arrange
var testInputItem = Mock.Of<IItem>(i => i.LinkedSockets == 3); var testInputItem = Mock.Of<IItem>(i => i.LinkedSockets == 3);
var testInputBlockItem = new LinkedSocketsBlockItem(testInputFilterPredicateOperator, testInputBlockItemLinkedSockets); var testInputBlockItem = new LinkedSocketsBlockItem(testInputFilterPredicateOperator, testInputBlockItemLinkedSockets);
//Act //Act
var result = _testUtility.ItemBlockItemMatcher.LinkedSocketsBlockItemMatch(testInputBlockItem, testInputItem); var result = _testUtility.BlockItemMatcher.ItemBlockItemMatch(testInputBlockItem, testInputItem);
//Assert //Assert
Assert.AreEqual(expectedResult, result); Assert.AreEqual(expectedResult, result);
@ -214,14 +307,14 @@ namespace Filtration.ItemFilterPreview.Tests.Services
[TestCase(FilterPredicateOperator.LessThanOrEqual, 12, true)] [TestCase(FilterPredicateOperator.LessThanOrEqual, 12, true)]
[TestCase(FilterPredicateOperator.LessThanOrEqual, 13, true)] [TestCase(FilterPredicateOperator.LessThanOrEqual, 13, true)]
[TestCase(-1, 13, false)] [TestCase(-1, 13, false)]
public void QualityBlockItemMatch_ReturnsCorrectResult(FilterPredicateOperator testInputFilterPredicateOperator, int testInputBlockItemQuality, bool expectedResult) public void ItemBlockItemMatch_QualityBlockItem_ReturnsCorrectResult(FilterPredicateOperator testInputFilterPredicateOperator, int testInputBlockItemQuality, bool expectedResult)
{ {
//Arrange //Arrange
var testInputItem = Mock.Of<IItem>(i => i.Quality == 12); var testInputItem = Mock.Of<IItem>(i => i.Quality == 12);
var testInputBlockItem = new QualityBlockItem(testInputFilterPredicateOperator, testInputBlockItemQuality); var testInputBlockItem = new QualityBlockItem(testInputFilterPredicateOperator, testInputBlockItemQuality);
//Act //Act
var result = _testUtility.ItemBlockItemMatcher.QualityBlockItemMatch(testInputBlockItem, testInputItem); var result = _testUtility.BlockItemMatcher.ItemBlockItemMatch(testInputBlockItem, testInputItem);
//Assert //Assert
Assert.AreEqual(expectedResult, result); Assert.AreEqual(expectedResult, result);
@ -243,14 +336,14 @@ namespace Filtration.ItemFilterPreview.Tests.Services
[TestCase(FilterPredicateOperator.LessThanOrEqual, ItemRarity.Magic, true)] [TestCase(FilterPredicateOperator.LessThanOrEqual, ItemRarity.Magic, true)]
[TestCase(FilterPredicateOperator.LessThanOrEqual, ItemRarity.Rare, true)] [TestCase(FilterPredicateOperator.LessThanOrEqual, ItemRarity.Rare, true)]
[TestCase(-1, 13, false)] [TestCase(-1, 13, false)]
public void RarityBlockItemMatch_ReturnsCorrectResult(FilterPredicateOperator testInputFilterPredicateOperator, int testInputBlockItemRarity, bool expectedResult) public void ItemBlockItemMatch_RarityBlockItem_ReturnsCorrectResult(FilterPredicateOperator testInputFilterPredicateOperator, int testInputBlockItemRarity, bool expectedResult)
{ {
//Arrange //Arrange
var testInputItem = Mock.Of<IItem>(i => i.ItemRarity == ItemRarity.Magic); var testInputItem = Mock.Of<IItem>(i => i.ItemRarity == ItemRarity.Magic);
var testInputBlockItem = new RarityBlockItem(testInputFilterPredicateOperator, testInputBlockItemRarity); var testInputBlockItem = new RarityBlockItem(testInputFilterPredicateOperator, testInputBlockItemRarity);
//Act //Act
var result = _testUtility.ItemBlockItemMatcher.RarityBlockItemMatch(testInputBlockItem, testInputItem); var result = _testUtility.BlockItemMatcher.ItemBlockItemMatch(testInputBlockItem, testInputItem);
//Assert //Assert
Assert.AreEqual(expectedResult, result); Assert.AreEqual(expectedResult, result);
@ -272,14 +365,14 @@ namespace Filtration.ItemFilterPreview.Tests.Services
[TestCase(FilterPredicateOperator.LessThanOrEqual, 3, true)] [TestCase(FilterPredicateOperator.LessThanOrEqual, 3, true)]
[TestCase(FilterPredicateOperator.LessThanOrEqual, 4, true)] [TestCase(FilterPredicateOperator.LessThanOrEqual, 4, true)]
[TestCase(-1, 3, false)] [TestCase(-1, 3, false)]
public void SocketsBlockItemMatch_ReturnsCorrectResult(FilterPredicateOperator testInputFilterPredicateOperator, int testInputBlockItemSockets, bool expectedResult) public void ItemBlockItemMatch_SocketsBlockItem_ReturnsCorrectResult(FilterPredicateOperator testInputFilterPredicateOperator, int testInputBlockItemSockets, bool expectedResult)
{ {
//Arrange //Arrange
var testInputItem = Mock.Of<IItem>(i => i.Sockets == 3); var testInputItem = Mock.Of<IItem>(i => i.Sockets == 3);
var testInputBlockItem = new SocketsBlockItem(testInputFilterPredicateOperator, testInputBlockItemSockets); var testInputBlockItem = new SocketsBlockItem(testInputFilterPredicateOperator, testInputBlockItemSockets);
//Act //Act
var result = _testUtility.ItemBlockItemMatcher.SocketsBlockItemMatch(testInputBlockItem, testInputItem); var result = _testUtility.BlockItemMatcher.ItemBlockItemMatch(testInputBlockItem, testInputItem);
//Assert //Assert
Assert.AreEqual(expectedResult, result); Assert.AreEqual(expectedResult, result);
@ -301,21 +394,21 @@ namespace Filtration.ItemFilterPreview.Tests.Services
[TestCase(FilterPredicateOperator.LessThanOrEqual, 2, true)] [TestCase(FilterPredicateOperator.LessThanOrEqual, 2, true)]
[TestCase(FilterPredicateOperator.LessThanOrEqual, 3, true)] [TestCase(FilterPredicateOperator.LessThanOrEqual, 3, true)]
[TestCase(-1, 3, false)] [TestCase(-1, 3, false)]
public void WidthBlockItemMatch_ReturnsCorrectResult(FilterPredicateOperator testInputFilterPredicateOperator, int testInputBlockItemWidth, bool expectedResult) public void ItemBlockItemMatch_ReturnsCorrectResult(FilterPredicateOperator testInputFilterPredicateOperator, int testInputBlockItemWidth, bool expectedResult)
{ {
//Arrange //Arrange
var testInputItem = Mock.Of<IItem>(i => i.Width == 2); var testInputItem = Mock.Of<IItem>(i => i.Width == 2);
var testInputBlockItem = new WidthBlockItem(testInputFilterPredicateOperator, testInputBlockItemWidth); var testInputBlockItem = new WidthBlockItem(testInputFilterPredicateOperator, testInputBlockItemWidth);
//Act //Act
var result = _testUtility.ItemBlockItemMatcher.WidthBlockItemMatch(testInputBlockItem, testInputItem); var result = _testUtility.BlockItemMatcher.ItemBlockItemMatch(testInputBlockItem, testInputItem);
//Assert //Assert
Assert.AreEqual(expectedResult, result); Assert.AreEqual(expectedResult, result);
} }
[Test] [Test]
public void SocketGroupBlockItemMatch_SingleItemSocketGroup_SingleBlockItemSocketGroup_Match_ReturnsCorrectResult() public void ItemBlockItemMatch_SocketGroupBlockItem_SingleItemSocketGroup_SingleBlockItemSocketGroup_Match_ReturnsCorrectResult()
{ {
//Arrange //Arrange
var testInputBlockItem = new SocketGroupBlockItem(); var testInputBlockItem = new SocketGroupBlockItem();
@ -332,14 +425,14 @@ namespace Filtration.ItemFilterPreview.Tests.Services
}); });
//Act //Act
var result = _testUtility.ItemBlockItemMatcher.SocketGroupBlockItemMatch(testInputBlockItem, testInputItem); var result = _testUtility.BlockItemMatcher.ItemBlockItemMatch(testInputBlockItem, testInputItem);
//Assert //Assert
Assert.IsTrue(result); Assert.IsTrue(result);
} }
[Test] [Test]
public void SocketGroupBlockItemMatch_SingleItemSocketGroup_SingleBlockItemSocketGroup_NoMatch_ReturnsCorrectResult() public void ItemBlockItemMatch_SocketGroupBlockItem_SingleItemSocketGroup_SingleBlockItemSocketGroup_NoMatch_ReturnsCorrectResult()
{ {
//Arrange //Arrange
var testInputBlockItem = new SocketGroupBlockItem(); var testInputBlockItem = new SocketGroupBlockItem();
@ -355,14 +448,14 @@ namespace Filtration.ItemFilterPreview.Tests.Services
}); });
//Act //Act
var result = _testUtility.ItemBlockItemMatcher.SocketGroupBlockItemMatch(testInputBlockItem, testInputItem); var result = _testUtility.BlockItemMatcher.ItemBlockItemMatch(testInputBlockItem, testInputItem);
//Assert //Assert
Assert.IsFalse(result); Assert.IsFalse(result);
} }
[Test] [Test]
public void SocketGroupBlockItemMatch_MultipleItemSocketGroup_SingleBlockItemSocketGroup_NoMatch_ReturnsCorrectResult() public void ItemBlockItemMatch_SocketGroupBlockItem_MultipleItemSocketGroup_SingleBlockItemSocketGroup_NoMatch_ReturnsCorrectResult()
{ {
//Arrange //Arrange
var testInputBlockItem = new SocketGroupBlockItem(); var testInputBlockItem = new SocketGroupBlockItem();
@ -384,14 +477,14 @@ namespace Filtration.ItemFilterPreview.Tests.Services
}); });
//Act //Act
var result = _testUtility.ItemBlockItemMatcher.SocketGroupBlockItemMatch(testInputBlockItem, testInputItem); var result = _testUtility.BlockItemMatcher.ItemBlockItemMatch(testInputBlockItem, testInputItem);
//Assert //Assert
Assert.IsFalse(result); Assert.IsFalse(result);
} }
[Test] [Test]
public void SocketGroupBlockItemMatch_MultipleItemSocketGroup_SingleBlockItemSocketGroup_Match_ReturnsCorrectResult() public void ItemBlockItemMatch_SocketGroupBlockItem_MultipleItemSocketGroup_SingleBlockItemSocketGroup_Match_ReturnsCorrectResult()
{ {
//Arrange //Arrange
var testInputBlockItem = new SocketGroupBlockItem(); var testInputBlockItem = new SocketGroupBlockItem();
@ -413,13 +506,12 @@ namespace Filtration.ItemFilterPreview.Tests.Services
}); });
//Act //Act
var result = _testUtility.ItemBlockItemMatcher.SocketGroupBlockItemMatch(testInputBlockItem, testInputItem); var result = _testUtility.BlockItemMatcher.ItemBlockItemMatch(testInputBlockItem, testInputItem);
//Assert //Assert
Assert.IsTrue(result); Assert.IsTrue(result);
} }
private class ItemBlockItemMatcherTestUtility private class ItemBlockItemMatcherTestUtility
{ {
public ItemBlockItemMatcherTestUtility() public ItemBlockItemMatcherTestUtility()
@ -427,10 +519,10 @@ namespace Filtration.ItemFilterPreview.Tests.Services
// Mock setups // Mock setups
// Class under-test instantiation // Class under-test instantiation
ItemBlockItemMatcher = new ItemBlockItemMatcher(); BlockItemMatcher = new BlockItemMatcher();
} }
public ItemBlockItemMatcher ItemBlockItemMatcher { get; private set; } public BlockItemMatcher BlockItemMatcher { get; }
} }
} }
} }

View File

@ -1,10 +1,57 @@
using NUnit.Framework; using System.Collections.Generic;
using System.Collections.ObjectModel;
using Filtration.ItemFilterPreview.Model;
using Filtration.ItemFilterPreview.Services;
using Filtration.ObjectModel;
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.Enums;
using Moq;
using NUnit.Framework;
namespace Filtration.ItemFilterPreview.Tests.Services namespace Filtration.ItemFilterPreview.Tests.Services
{ {
[TestFixture] [TestFixture]
public class TestItemFilterProcessor public class TestItemFilterProcessor
{ {
private ItemFilterProcessorTestUtility _testUtility;
[SetUp]
public void ItemFilterProcessorTestSetUp()
{
_testUtility = new ItemFilterProcessorTestUtility();
}
[Test]
public void ProcessItemsAgainstItemFilterScript_Matches_ReturnsTrue()
{
//Arrange
var testInputItem = Mock.Of<IItem>(i => i.ItemClass == "Test Class");
var testInputBlockItem = new ActionBlockItem(BlockAction.Show);
var testInputBlock = Mock.Of<IItemFilterBlock>(b => b.Action == BlockAction.Show &&
b.BlockItems == new ObservableCollection<IItemFilterBlockItem> {testInputBlockItem});
var testInputScript = Mock.Of<IItemFilterScript>(s => s.ItemFilterBlocks == new ObservableCollection<IItemFilterBlock> {testInputBlock});
//Act
var result = _testUtility.ItemFilterProcessor.ProcessItemsAgainstItemFilterScript(testInputScript, new List<IItem> { testInputItem });
//Assert
Assert.AreEqual(testInputBlock, result[testInputItem]);
}
private class ItemFilterProcessorTestUtility
{
public ItemFilterProcessorTestUtility()
{
// Mock setups
MockBlockItemMatcher = new Mock<IBlockItemMatcher>();
// Class under-test instantiation
ItemFilterProcessor = new ItemFilterProcessor(MockBlockItemMatcher.Object);
}
public ItemFilterProcessor ItemFilterProcessor { get; private set; }
public Mock<IBlockItemMatcher> MockBlockItemMatcher { get; }
}
} }
} }

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="FluentAssertions" version="4.1.1" targetFramework="net461" />
<package id="Moq" version="4.2.1510.2205" targetFramework="net46" /> <package id="Moq" version="4.2.1510.2205" targetFramework="net46" />
<package id="NUnit" version="3.0.1" targetFramework="net46" /> <package id="NUnit" version="3.0.1" targetFramework="net46" />
</packages> </packages>

View File

@ -58,7 +58,7 @@
</ApplicationDefinition> </ApplicationDefinition>
<Compile Include="Model\Item.cs" /> <Compile Include="Model\Item.cs" />
<Compile Include="Model\ItemCollection.cs" /> <Compile Include="Model\ItemCollection.cs" />
<Compile Include="Services\ItemBlockItemMatcher.cs" /> <Compile Include="Services\BlockItemMatcher.cs" />
<Compile Include="Services\ItemFilterProcessor.cs" /> <Compile Include="Services\ItemFilterProcessor.cs" />
<Compile Include="UserControls\ItemSocketsControl.xaml.cs"> <Compile Include="UserControls\ItemSocketsControl.xaml.cs">
<DependentUpon>ItemSocketsControl.xaml</DependentUpon> <DependentUpon>ItemSocketsControl.xaml</DependentUpon>

View File

@ -8,7 +8,6 @@ namespace Filtration.ItemFilterPreview.Model
{ {
public interface IItem public interface IItem
{ {
List<SocketGroup> SocketGroups { get; set; }
string ItemClass { get; set; } string ItemClass { get; set; }
string BaseType { get; set; } string BaseType { get; set; }
int DropLevel { get; set; } int DropLevel { get; set; }
@ -20,16 +19,23 @@ namespace Filtration.ItemFilterPreview.Model
int Sockets { get; } int Sockets { get; }
int LinkedSockets { get; } int LinkedSockets { get; }
IEnumerable<SocketGroup> LinkedSocketGroups { get; } IEnumerable<SocketGroup> LinkedSocketGroups { get; }
List<SocketGroup> SocketGroups { get; set; }
} }
public class Item : IItem public class Item : IItem
{ {
private List<SocketGroup> _socketGroups; private List<SocketGroup> _socketGroups;
public Item(List<SocketGroup> socketGroups) public string ItemClass { get; set; }
{ public string BaseType { get; set; }
public int DropLevel { get; set; }
} public int ItemLevel { get; set; }
public int Height { get; set; }
public int Width { get; set; }
public int Quality { get; set; }
public ItemRarity ItemRarity { get; set; }
public int Sockets { get; private set; }
public int LinkedSockets { get; private set; }
public IEnumerable<SocketGroup> LinkedSocketGroups public IEnumerable<SocketGroup> LinkedSocketGroups
{ {
@ -66,16 +72,5 @@ namespace Filtration.ItemFilterPreview.Model
LinkedSockets = value.Where(s => s.Linked).Max(s => s.Count); LinkedSockets = value.Where(s => s.Linked).Max(s => s.Count);
} }
} }
public string ItemClass { get; set; }
public string BaseType { get; set; }
public int DropLevel { get; set; }
public int ItemLevel { get; set; }
public int Height { get; set; }
public int Width { get; set; }
public int Quality { get; set; }
public ItemRarity ItemRarity { get; set; }
public int Sockets { get; private set; }
public int LinkedSockets { get; private set; }
} }
} }

View File

@ -0,0 +1,154 @@
using System.Linq;
using Filtration.ItemFilterPreview.Model;
using Filtration.ObjectModel;
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.BlockItemTypes;
namespace Filtration.ItemFilterPreview.Services
{
internal interface IBlockItemMatcher
{
bool ItemBlockMatch(IItemFilterBlock block, IItem item);
bool ItemBlockItemMatch(IItemFilterBlockItem blockItem, IItem item);
}
internal class BlockItemMatcher : IBlockItemMatcher
{
public bool ItemBlockMatch(IItemFilterBlock block, IItem item)
{
return block.BlockItems
.Where(blockItem => !(blockItem is IAudioVisualBlockItem) && !(blockItem is ActionBlockItem))
.All(blockItem => ItemBlockItemMatch(blockItem, item));
}
public bool ItemBlockItemMatch(IItemFilterBlockItem blockItem, IItem item)
{
var blockItemType = blockItem.GetType();
if (blockItemType == typeof (BaseTypeBlockItem))
return BaseTypeBlockItemMatch((BaseTypeBlockItem)blockItem, item);
if (blockItemType == typeof (ClassBlockItem))
return ClassBlockItemMatch((ClassBlockItem) blockItem, item);
if (blockItemType == typeof(DropLevelBlockItem))
return DropLevelBlockItemMatch((DropLevelBlockItem)blockItem, item);
if (blockItemType == typeof(HeightBlockItem))
return HeightBlockItemMatch((HeightBlockItem)blockItem, item);
if (blockItemType == typeof(ItemLevelBlockItem))
return ItemLevelBlockItemMatch((ItemLevelBlockItem)blockItem, item);
if (blockItemType == typeof(LinkedSocketsBlockItem))
return LinkedSocketsBlockItemMatch((LinkedSocketsBlockItem)blockItem, item);
if (blockItemType == typeof(QualityBlockItem))
return QualityBlockItemMatch((QualityBlockItem)blockItem, item);
if (blockItemType == typeof(RarityBlockItem))
return RarityBlockItemMatch((RarityBlockItem)blockItem, item);
if (blockItemType == typeof(SocketsBlockItem))
return SocketsBlockItemMatch((SocketsBlockItem)blockItem, item);
if (blockItemType == typeof(WidthBlockItem))
return WidthBlockItemMatch((WidthBlockItem)blockItem, item);
if (blockItemType == typeof(SocketGroupBlockItem))
return SocketGroupBlockItemMatch((SocketGroupBlockItem)blockItem, item);
return false;
}
private static bool BaseTypeBlockItemMatch(BaseTypeBlockItem baseTypeBlockItem, IItem item)
{
return baseTypeBlockItem.Items.Any(b => item.BaseType.StartsWith(b));
}
private static bool ClassBlockItemMatch(ClassBlockItem classBlockItem, IItem item)
{
return classBlockItem.Items.Any(c => item.ItemClass.StartsWith(c));
}
private static bool DropLevelBlockItemMatch(DropLevelBlockItem dropLevelBlockItem, IItem item)
{
return NumericFilterPredicateBlockItemMatch(dropLevelBlockItem, item.DropLevel);
}
private static bool HeightBlockItemMatch(HeightBlockItem heightBlockItem, IItem item)
{
return NumericFilterPredicateBlockItemMatch(heightBlockItem, item.Height);
}
private static bool ItemLevelBlockItemMatch(ItemLevelBlockItem itemLevelBlockItem, IItem item)
{
return NumericFilterPredicateBlockItemMatch(itemLevelBlockItem, item.ItemLevel);
}
private static bool LinkedSocketsBlockItemMatch(LinkedSocketsBlockItem linkedSocketsBlockItem, IItem item)
{
return NumericFilterPredicateBlockItemMatch(linkedSocketsBlockItem, item.LinkedSockets);
}
private static bool QualityBlockItemMatch(QualityBlockItem qualityBlockItem, IItem item)
{
return NumericFilterPredicateBlockItemMatch(qualityBlockItem, item.Quality);
}
private static bool RarityBlockItemMatch(RarityBlockItem qualityBlockItem, IItem item)
{
return NumericFilterPredicateBlockItemMatch(qualityBlockItem, (int)item.ItemRarity);
}
private static bool SocketsBlockItemMatch(SocketsBlockItem socketsBlockItem, IItem item)
{
return NumericFilterPredicateBlockItemMatch(socketsBlockItem, item.Sockets);
}
private static bool WidthBlockItemMatch(WidthBlockItem widthBlockItem, IItem item)
{
return NumericFilterPredicateBlockItemMatch(widthBlockItem, item.Width);
}
private static bool SocketGroupBlockItemMatch(SocketGroupBlockItem socketGroupBlockItem, IItem item)
{
foreach (var blockItemSocketGroup in socketGroupBlockItem.SocketGroups) // for each group of sockets in the block item
{
foreach (var itemLinkedSocketGroup in item.LinkedSocketGroups) // for each linked socket group in the item
{
if (SocketGroupHasRequiredSocketColors(itemLinkedSocketGroup, blockItemSocketGroup))
{
return true;
}
}
}
return false;
}
private static 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 static bool NumericFilterPredicateBlockItemMatch<T>(T numericFilterPredicateBlockItem, int matchValue) where T : NumericFilterPredicateBlockItem
{
return numericFilterPredicateBlockItem.FilterPredicate.CompareUsing(matchValue);
}
}
}

View File

@ -1,112 +0,0 @@
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
{
internal interface IItemBlockItemMatcher
{
bool BaseTypeBlockItemMatch(BaseTypeBlockItem baseTypeBlockItem, IItem item);
bool ClassBlockItemMatch(ClassBlockItem classBlockItem, IItem item);
bool DropLevelBlockItemMatch(DropLevelBlockItem dropLevelBlockItem, IItem item);
}
internal class ItemBlockItemMatcher : IItemBlockItemMatcher
{
public bool BaseTypeBlockItemMatch(BaseTypeBlockItem baseTypeBlockItem, IItem item)
{
return baseTypeBlockItem.Items.Any(b => item.BaseType.StartsWith(b));
}
public bool ClassBlockItemMatch(ClassBlockItem classBlockItem, IItem item)
{
return classBlockItem.Items.Any(c => item.ItemClass.StartsWith(c));
}
public bool DropLevelBlockItemMatch(DropLevelBlockItem dropLevelBlockItem, IItem item)
{
return NumericFilterPredicateBlockItemMatch(dropLevelBlockItem, item.DropLevel);
}
public bool HeightBlockItemMatch(HeightBlockItem heightBlockItem, IItem item)
{
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
{
foreach (var itemLinkedSocketGroup in item.LinkedSocketGroups) // for each linked socket group in the item
{
if (SocketGroupHasRequiredSocketColors(itemLinkedSocketGroup, blockItemSocketGroup))
{
return true;
}
}
}
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>(T numericFilterPredicateBlockItem, int matchValue) where T : NumericFilterPredicateBlockItem
{
return numericFilterPredicateBlockItem.FilterPredicate.CompareUsing(matchValue);
}
}
}

View File

@ -1,34 +1,38 @@
using System.Linq; using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using Filtration.ItemFilterPreview.Model; using Filtration.ItemFilterPreview.Model;
using Filtration.ObjectModel; using Filtration.ObjectModel;
using Filtration.ObjectModel.BlockItemBaseTypes; using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.BlockItemTypes;
using Filtration.ObjectModel.Enums;
namespace Filtration.ItemFilterPreview.Services namespace Filtration.ItemFilterPreview.Services
{ {
public class ItemFilterProcessor internal class ItemFilterProcessor
{ {
private IItemFilterScript _itemFilterScript; private readonly IBlockItemMatcher _blockItemMatcher;
public ItemFilterProcessor() internal ItemFilterProcessor(IBlockItemMatcher blockItemMatcher)
{ {
_blockItemMatcher = blockItemMatcher;
} }
public void LoadItemFilterScript(IItemFilterScript itemFilterScript) public IReadOnlyDictionary<IItem, IItemFilterBlock> ProcessItemsAgainstItemFilterScript(IItemFilterScript itemFilterScript, IEnumerable<IItem> items)
{ {
_itemFilterScript = itemFilterScript; var matchedItemBlockPairs = new Dictionary<IItem, IItemFilterBlock>();
}
public void ItemIsVisible(IItem item) var sw = Stopwatch.StartNew();
{ foreach (var item in items)
foreach (var block in _itemFilterScript.ItemFilterBlocks)
{ {
sw.Restart();
}
}
var matchedBlock = itemFilterScript.ItemFilterBlocks.FirstOrDefault(block => _blockItemMatcher.ItemBlockMatch(block, item));
matchedItemBlockPairs.Add(item, matchedBlock);
Debug.WriteLine("Processed Item in {0}ms", sw.ElapsedMilliseconds);
}
sw.Stop();
return matchedItemBlockPairs;
}
} }
} }

View File

@ -6,7 +6,20 @@ using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel namespace Filtration.ObjectModel
{ {
public class ItemFilterBlock public interface IItemFilterBlock
{
bool Enabled { get; set; }
string Description { get; set; }
ItemFilterBlockGroup BlockGroup { get; set; }
BlockAction Action { get; set; }
ObservableCollection<IItemFilterBlockItem> BlockItems { get; }
int BlockCount(Type type);
bool AddBlockItemAllowed(Type type);
bool HasBlockItemOfType<T>();
bool HasBlockGroupInParentHierarchy(ItemFilterBlockGroup targetBlockGroup, ItemFilterBlockGroup startingBlockGroup);
}
public class ItemFilterBlock : IItemFilterBlock
{ {
private ItemFilterBlockGroup _blockGroup; private ItemFilterBlockGroup _blockGroup;

View File

@ -9,7 +9,7 @@ namespace Filtration.ObjectModel
{ {
public interface IItemFilterScript public interface IItemFilterScript
{ {
ObservableCollection<ItemFilterBlock> ItemFilterBlocks { get; } ObservableCollection<IItemFilterBlock> ItemFilterBlocks { get; }
ObservableCollection<ItemFilterBlockGroup> ItemFilterBlockGroups { get; } ObservableCollection<ItemFilterBlockGroup> ItemFilterBlockGroups { get; }
ThemeComponentCollection ThemeComponents { get; set; } ThemeComponentCollection ThemeComponents { get; set; }
string FilePath { get; set; } string FilePath { get; set; }
@ -23,7 +23,7 @@ namespace Filtration.ObjectModel
{ {
public ItemFilterScript() public ItemFilterScript()
{ {
ItemFilterBlocks = new ObservableCollection<ItemFilterBlock>(); ItemFilterBlocks = new ObservableCollection<IItemFilterBlock>();
ItemFilterBlockGroups = new ObservableCollection<ItemFilterBlockGroup> ItemFilterBlockGroups = new ObservableCollection<ItemFilterBlockGroup>
{ {
new ItemFilterBlockGroup("Root", null) new ItemFilterBlockGroup("Root", null)
@ -31,7 +31,7 @@ namespace Filtration.ObjectModel
ThemeComponents = new ThemeComponentCollection { IsMasterCollection = true}; ThemeComponents = new ThemeComponentCollection { IsMasterCollection = true};
} }
public ObservableCollection<ItemFilterBlock> ItemFilterBlocks { get; } public ObservableCollection<IItemFilterBlock> ItemFilterBlocks { get; }
public ObservableCollection<ItemFilterBlockGroup> ItemFilterBlockGroups { get; } public ObservableCollection<ItemFilterBlockGroup> ItemFilterBlockGroups { get; }
public ThemeComponentCollection ThemeComponents { get; set; } public ThemeComponentCollection ThemeComponents { get; set; }
@ -76,7 +76,7 @@ namespace Filtration.ObjectModel
} }
} }
private bool BlockIsColorReplacementCandidate(ReplaceColorsParameterSet replaceColorsParameterSet, ItemFilterBlock block) private bool BlockIsColorReplacementCandidate(ReplaceColorsParameterSet replaceColorsParameterSet, IItemFilterBlock block)
{ {
var textColorItem = block.HasBlockItemOfType<TextColorBlockItem>() var textColorItem = block.HasBlockItemOfType<TextColorBlockItem>()
? block.BlockItems.OfType<TextColorBlockItem>().First() ? block.BlockItems.OfType<TextColorBlockItem>().First()

View File

@ -64,7 +64,7 @@ namespace Filtration.Tests.Translators
Assert.AreEqual(expectedDescription, script.Description); Assert.AreEqual(expectedDescription, script.Description);
} }
[Ignore("Integration Test")] [Ignore("Integration Test / need to fix file reading for NUnit 3.x")]
[Test] [Test]
public void TranslateStringToItemFilterScript_ThioleItemFilterTest() public void TranslateStringToItemFilterScript_ThioleItemFilterTest()
{ {

View File

@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<configuration> <configuration>
<runtime> <runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly> <dependentAssembly>
<assemblyIdentity name="Xceed.Wpf.AvalonDock" publicKeyToken="3e4669d2f30244f4" culture="neutral"/> <assemblyIdentity name="Xceed.Wpf.AvalonDock" publicKeyToken="3e4669d2f30244f4" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.5.0.0" newVersion="2.5.0.0"/> <bindingRedirect oldVersion="0.0.0.0-2.5.0.0" newVersion="2.5.0.0" />
</dependentAssembly> </dependentAssembly>
</assemblyBinding> </assemblyBinding>
</runtime> </runtime>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/></startup></configuration> <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" /></startup></configuration>

View File

@ -58,7 +58,7 @@
<HintPath>..\packages\CommonServiceLocator.1.3\lib\portable-net4+sl5+netcore45+wpa81+wp8\Microsoft.Practices.ServiceLocation.dll</HintPath> <HintPath>..\packages\CommonServiceLocator.1.3\lib\portable-net4+sl5+netcore45+wpa81+wp8\Microsoft.Practices.ServiceLocation.dll</HintPath>
</Reference> </Reference>
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL"> <Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
<HintPath>..\packages\NLog.4.2.2\lib\net45\NLog.dll</HintPath> <HintPath>..\packages\NLog.4.2.3\lib\net45\NLog.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="PresentationCore" /> <Reference Include="PresentationCore" />

View File

@ -6,5 +6,5 @@
<package id="CommonServiceLocator" version="1.3" targetFramework="net451" /> <package id="CommonServiceLocator" version="1.3" targetFramework="net451" />
<package id="Extended.Wpf.Toolkit" version="2.5" targetFramework="net451" /> <package id="Extended.Wpf.Toolkit" version="2.5" targetFramework="net451" />
<package id="MvvmLightLibs" version="5.2.0.0" targetFramework="net451" /> <package id="MvvmLightLibs" version="5.2.0.0" targetFramework="net451" />
<package id="NLog" version="4.2.2" targetFramework="net451" /> <package id="NLog" version="4.2.3" targetFramework="net461" />
</packages> </packages>

View File

@ -1,17 +1,17 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<configuration> <configuration>
<configSections> <configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="Filtration.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false"/> <section name="Filtration.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup> </sectionGroup>
</configSections> </configSections>
<startup> <startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup> </startup>
<userSettings> <userSettings>
<Filtration.Properties.Settings> <Filtration.Properties.Settings>
<setting name="DefaultFilterDirectory" serializeAs="String"> <setting name="DefaultFilterDirectory" serializeAs="String">
<value/> <value />
</setting> </setting>
<setting name="ExtraLineBetweenBlocks" serializeAs="String"> <setting name="ExtraLineBetweenBlocks" serializeAs="String">
<value>True</value> <value>True</value>
@ -30,8 +30,8 @@
<runtime> <runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly> <dependentAssembly>
<assemblyIdentity name="Xceed.Wpf.AvalonDock" publicKeyToken="3e4669d2f30244f4" culture="neutral"/> <assemblyIdentity name="Xceed.Wpf.AvalonDock" publicKeyToken="3e4669d2f30244f4" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.5.0.0" newVersion="2.5.0.0"/> <bindingRedirect oldVersion="0.0.0.0-2.5.0.0" newVersion="2.5.0.0" />
</dependentAssembly> </dependentAssembly>
</assemblyBinding> </assemblyBinding>
</runtime> </runtime>

View File

@ -73,7 +73,7 @@
<HintPath>..\packages\MahApps.Metro.1.1.2.0\lib\net45\MahApps.Metro.dll</HintPath> <HintPath>..\packages\MahApps.Metro.1.1.2.0\lib\net45\MahApps.Metro.dll</HintPath>
</Reference> </Reference>
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL"> <Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
<HintPath>..\packages\NLog.4.2.2\lib\net45\NLog.dll</HintPath> <HintPath>..\packages\NLog.4.2.3\lib\net45\NLog.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />

View File

@ -17,9 +17,9 @@ namespace Filtration.Translators
{ {
internal interface IItemFilterBlockTranslator internal interface IItemFilterBlockTranslator
{ {
ItemFilterBlock TranslateStringToItemFilterBlock(string inputString, IItemFilterBlock TranslateStringToItemFilterBlock(string inputString,
ThemeComponentCollection masterComponentCollection); ThemeComponentCollection masterComponentCollection);
string TranslateItemFilterBlockToString(ItemFilterBlock block); string TranslateItemFilterBlockToString(IItemFilterBlock block);
void ReplaceColorBlockItemsFromString(ObservableCollection<IItemFilterBlockItem> blockItems, string inputString); void ReplaceColorBlockItemsFromString(ObservableCollection<IItemFilterBlockItem> blockItems, string inputString);
} }
@ -38,7 +38,7 @@ namespace Filtration.Translators
// This method converts a string into a ItemFilterBlock. This is used for pasting ItemFilterBlocks // This method converts a string into a ItemFilterBlock. This is used for pasting ItemFilterBlocks
// and reading ItemFilterScripts from a file. // and reading ItemFilterScripts from a file.
public ItemFilterBlock TranslateStringToItemFilterBlock(string inputString, ThemeComponentCollection masterComponentCollection) public IItemFilterBlock TranslateStringToItemFilterBlock(string inputString, ThemeComponentCollection masterComponentCollection)
{ {
_masterComponentCollection = masterComponentCollection; _masterComponentCollection = masterComponentCollection;
var block = new ItemFilterBlock(); var block = new ItemFilterBlock();
@ -234,7 +234,7 @@ namespace Filtration.Translators
return block; return block;
} }
private static void RemoveExistingBlockItemsOfType<T>(ItemFilterBlock block) private static void RemoveExistingBlockItemsOfType<T>(IItemFilterBlock block)
{ {
var existingBlockItemCount = block.BlockItems.Count(b => b.GetType() == typeof(T)); var existingBlockItemCount = block.BlockItems.Count(b => b.GetType() == typeof(T));
if (existingBlockItemCount > 0) if (existingBlockItemCount > 0)
@ -244,7 +244,7 @@ namespace Filtration.Translators
} }
} }
private static void AddNumericFilterPredicateItemToBlockItems<T>(ItemFilterBlock block, string inputString) where T : NumericFilterPredicateBlockItem private static void AddNumericFilterPredicateItemToBlockItems<T>(IItemFilterBlock block, string inputString) where T : NumericFilterPredicateBlockItem
{ {
var blockItem = Activator.CreateInstance<T>(); var blockItem = Activator.CreateInstance<T>();
@ -262,7 +262,7 @@ namespace Filtration.Translators
predicate.PredicateOperand = Convert.ToInt16(result.Groups[2].Value); predicate.PredicateOperand = Convert.ToInt16(result.Groups[2].Value);
} }
private static void AddStringListItemToBlockItems<T>(ItemFilterBlock block, string inputString) where T : StringListBlockItem private static void AddStringListItemToBlockItems<T>(IItemFilterBlock block, string inputString) where T : StringListBlockItem
{ {
var blockItem = Activator.CreateInstance<T>(); var blockItem = Activator.CreateInstance<T>();
PopulateListFromString(blockItem.Items, inputString.Substring(inputString.IndexOf(" ", StringComparison.Ordinal) + 1).Trim()); PopulateListFromString(blockItem.Items, inputString.Substring(inputString.IndexOf(" ", StringComparison.Ordinal) + 1).Trim());
@ -280,7 +280,7 @@ namespace Filtration.Translators
} }
} }
private void AddColorItemToBlockItems<T>(ItemFilterBlock block, string inputString) where T : ColorBlockItem private void AddColorItemToBlockItems<T>(IItemFilterBlock block, string inputString) where T : ColorBlockItem
{ {
block.BlockItems.Add(GetColorBlockItemFromString<T>(inputString)); block.BlockItems.Add(GetColorBlockItemFromString<T>(inputString));
} }
@ -365,7 +365,7 @@ namespace Filtration.Translators
} }
} }
private void AddBlockGroupToBlock(ItemFilterBlock block, string inputString) private void AddBlockGroupToBlock(IItemFilterBlock block, string inputString)
{ {
var blockGroupStart = inputString.IndexOf("#", StringComparison.Ordinal); var blockGroupStart = inputString.IndexOf("#", StringComparison.Ordinal);
if (blockGroupStart <= 0) return; if (blockGroupStart <= 0) return;
@ -407,7 +407,7 @@ namespace Filtration.Translators
// This method converts an ItemFilterBlock object into a string. This is used for copying a ItemFilterBlock // This method converts an ItemFilterBlock object into a string. This is used for copying a ItemFilterBlock
// to the clipboard, and when saving a ItemFilterScript. // to the clipboard, and when saving a ItemFilterScript.
public string TranslateItemFilterBlockToString(ItemFilterBlock block) public string TranslateItemFilterBlockToString(IItemFilterBlock block)
{ {
if (block.GetType() == typeof (ItemFilterSection)) if (block.GetType() == typeof (ItemFilterSection))
{ {

View File

@ -17,10 +17,10 @@ namespace Filtration.ViewModels
{ {
internal interface IItemFilterBlockViewModel internal interface IItemFilterBlockViewModel
{ {
void Initialise(ItemFilterBlock itemFilterBlock, ItemFilterScriptViewModel parentScriptViewModel); void Initialise(IItemFilterBlock itemFilterBlock, ItemFilterScriptViewModel parentScriptViewModel);
bool IsDirty { get; set; } bool IsDirty { get; set; }
bool IsExpanded { get; set; } bool IsExpanded { get; set; }
ItemFilterBlock Block { get; } IItemFilterBlock Block { get; }
bool BlockEnabled { get; set; } bool BlockEnabled { get; set; }
void RefreshBlockPreview(); void RefreshBlockPreview();
} }
@ -61,7 +61,7 @@ namespace Filtration.ViewModels
PlaySoundCommand = new RelayCommand(OnPlaySoundCommand, () => HasSound); PlaySoundCommand = new RelayCommand(OnPlaySoundCommand, () => HasSound);
} }
public void Initialise(ItemFilterBlock itemFilterBlock, ItemFilterScriptViewModel parentScriptViewModel) public void Initialise(IItemFilterBlock itemFilterBlock, ItemFilterScriptViewModel parentScriptViewModel)
{ {
if (itemFilterBlock == null || parentScriptViewModel == null) if (itemFilterBlock == null || parentScriptViewModel == null)
{ {
@ -98,7 +98,7 @@ namespace Filtration.ViewModels
public RelayCommand PlaySoundCommand { get; private set; } public RelayCommand PlaySoundCommand { get; private set; }
public RelayCommand SwitchBlockItemsViewCommand { get; private set; } public RelayCommand SwitchBlockItemsViewCommand { get; private set; }
public ItemFilterBlock Block { get; private set; } public IItemFilterBlock Block { get; private set; }
public bool IsDirty { get; set; } public bool IsDirty { get; set; }

View File

@ -12,7 +12,7 @@ namespace Filtration.ViewModels
{ {
internal interface IReplaceColorsViewModel internal interface IReplaceColorsViewModel
{ {
void Initialise(ItemFilterScript itemFilterScript, ItemFilterBlock initialiseFromBlock); void Initialise(ItemFilterScript itemFilterScript, IItemFilterBlock initialiseFromBlock);
void Initialise(ItemFilterScript itemFilterScript); void Initialise(ItemFilterScript itemFilterScript);
} }
@ -28,7 +28,7 @@ namespace Filtration.ViewModels
public RelayCommand ReplaceColorsCommand { get; private set; } public RelayCommand ReplaceColorsCommand { get; private set; }
public void Initialise(ItemFilterScript itemFilterScript, ItemFilterBlock initialiseFromBlock) public void Initialise(ItemFilterScript itemFilterScript, IItemFilterBlock initialiseFromBlock)
{ {
_replaceColorsParameterSet = new ReplaceColorsParameterSet(); _replaceColorsParameterSet = new ReplaceColorsParameterSet();

View File

@ -8,7 +8,7 @@
<package id="Fluent.Ribbon" version="3.6.1.236" targetFramework="net451" /> <package id="Fluent.Ribbon" version="3.6.1.236" targetFramework="net451" />
<package id="MahApps.Metro" version="1.1.2.0" targetFramework="net451" /> <package id="MahApps.Metro" version="1.1.2.0" targetFramework="net451" />
<package id="MvvmLightLibs" version="5.2.0.0" targetFramework="net451" /> <package id="MvvmLightLibs" version="5.2.0.0" targetFramework="net451" />
<package id="NLog" version="4.2.2" targetFramework="net451" /> <package id="NLog" version="4.2.3" targetFramework="net461" />
<package id="NLog.Config" version="4.2.2" targetFramework="net451" /> <package id="NLog.Config" version="4.2.2" targetFramework="net451" />
<package id="NLog.Schema" version="4.2.1" targetFramework="net451" /> <package id="NLog.Schema" version="4.2.1" targetFramework="net451" />
<package id="WpfAnimatedGif" version="1.4.13" targetFramework="net451" /> <package id="WpfAnimatedGif" version="1.4.13" targetFramework="net451" />