diff --git a/.gitignore b/.gitignore index 7964536..b092826 100644 --- a/.gitignore +++ b/.gitignore @@ -186,4 +186,5 @@ FakesAssemblies/ # LightSwitch generated files GeneratedArtifacts/ _Pvt_Extensions/ -ModelManifest.xml \ No newline at end of file +ModelManifest.xml +/Releases diff --git a/Filtration.LootExplosionStudio.Tests/Filtration.LootExplosionStudio.Tests.csproj b/Filtration.LootExplosionStudio.Tests/Filtration.LootExplosionStudio.Tests.csproj new file mode 100644 index 0000000..fb5b62c --- /dev/null +++ b/Filtration.LootExplosionStudio.Tests/Filtration.LootExplosionStudio.Tests.csproj @@ -0,0 +1,74 @@ + + + + + Debug + AnyCPU + {56D0887E-B10D-4F9C-A88E-09CF8E8E06E3} + Library + Properties + Filtration.LootExplosionStudio.Tests + Filtration.LootExplosionStudio.Tests + v4.5.1 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Moq.4.2.1507.0118\lib\net40\Moq.dll + + + ..\packages\NUnit.2.6.4\lib\nunit.framework.dll + + + + + + + + + + + + + + + + + + + + + {c8009b11-14d0-4421-94f0-9ef4603cb363} + Filtration.LootExplosionStudio + + + {4aac3beb-1dc1-483e-9d11-0e9334e80227} + Filtration.ObjectModel + + + + + \ No newline at end of file diff --git a/Filtration.LootExplosionStudio.Tests/Services/TestItemFilterBlockFinderService.cs b/Filtration.LootExplosionStudio.Tests/Services/TestItemFilterBlockFinderService.cs new file mode 100644 index 0000000..dab83d8 --- /dev/null +++ b/Filtration.LootExplosionStudio.Tests/Services/TestItemFilterBlockFinderService.cs @@ -0,0 +1,178 @@ +using Filtration.LootExplosionStudio.Services; +using Filtration.ObjectModel; +using Filtration.ObjectModel.BlockItemTypes; +using Filtration.ObjectModel.Enums; +using Filtration.ObjectModel.LootExplosionStudio; +using NUnit.Framework; + +namespace Filtration.LootExplosionStudio.Tests.Services +{ + [TestFixture] + public class TestItemFilterBlockFinderService + { + private ItemFilterBlockFinderServiceTestUtility _testUtility; + + [SetUp] + public void ItemFilterProcessingServiceTestSetup() + { + _testUtility = new ItemFilterBlockFinderServiceTestUtility(); + } + + [Test] + public void FindBlockForLootItem_SingleBlock_BaseType_Matches() + { + // Arrange + var testInputBaseType = "TestBaseType"; + var testInputBlockItem = new BaseTypeBlockItem(); + testInputBlockItem.Items.Add(testInputBaseType); + + _testUtility.TestLootItem.BaseType = testInputBaseType; + _testUtility.TestBlock.BlockItems.Add(testInputBlockItem); + + + // Act + var result = _testUtility.Service.FindBlockForLootItem(_testUtility.TestLootItem, _testUtility.TestScript); + + // Assert + Assert.AreEqual(_testUtility.TestBlock, result); + } + + [Test] + public void FindBlockForLootItem_SingleHideBlock_Matches() + { + // Arrange + + _testUtility.TestBlock.Action = BlockAction.Hide; + + // Act + var result = _testUtility.Service.FindBlockForLootItem(_testUtility.TestLootItem, _testUtility.TestScript); + + // Assert + Assert.AreEqual(_testUtility.TestBlock, result); + } + + [Test] + public void FindBlockForLootItem_SingleBlock_MultipleBlockItems_Matches() + { + // Arrange + var testInputBaseType = "TestBaseType"; + var testInputBaseTypeBlockItem = new BaseTypeBlockItem(); + testInputBaseTypeBlockItem.Items.Add(testInputBaseType); + + var testInputClass = "Test Class"; + var testInputClassBlockItem = new ClassBlockItem(); + testInputClassBlockItem.Items.Add(testInputClass); + + var testInputItemLevel = 57; + var testInputItemLevelBlockItem = new ItemLevelBlockItem(FilterPredicateOperator.GreaterThan, 50); + + _testUtility.TestLootItem.BaseType = testInputBaseType; + _testUtility.TestLootItem.Class = testInputClass; + _testUtility.TestLootItem.ItemLevel = testInputItemLevel; + + _testUtility.TestBlock.BlockItems.Add(testInputBaseTypeBlockItem); + _testUtility.TestBlock.BlockItems.Add(testInputClassBlockItem); + _testUtility.TestBlock.BlockItems.Add(testInputItemLevelBlockItem); + + + // Act + var result = _testUtility.Service.FindBlockForLootItem(_testUtility.TestLootItem, _testUtility.TestScript); + + // Assert + Assert.AreEqual(_testUtility.TestBlock, result); + } + + + + [Test] + public void FindBlockForLootItem_SingleBlock_MultipleBlockItemsOneWithoutMatch_Matches() + { + // Arrange + var testInputBaseType = "TestBaseType"; + var testInputBaseTypeBlockItem = new BaseTypeBlockItem(); + testInputBaseTypeBlockItem.Items.Add(testInputBaseType); + + var testInputClass = "Test Class"; + var testInputClassBlockItem = new ClassBlockItem(); + testInputClassBlockItem.Items.Add(testInputClass); + + var testInputItemLevel = 57; + var testInputItemLevelBlockItem = new ItemLevelBlockItem(FilterPredicateOperator.GreaterThan, 50); + + var testInputDropLevel = 35; + var testInputDropLevelBlockItem = new DropLevelBlockItem(FilterPredicateOperator.GreaterThanOrEqual, 89); + + _testUtility.TestLootItem.BaseType = testInputBaseType; + _testUtility.TestLootItem.Class = testInputClass; + _testUtility.TestLootItem.ItemLevel = testInputItemLevel; + _testUtility.TestLootItem.DropLevel = testInputDropLevel; + + _testUtility.TestBlock.BlockItems.Add(testInputBaseTypeBlockItem); + _testUtility.TestBlock.BlockItems.Add(testInputClassBlockItem); + _testUtility.TestBlock.BlockItems.Add(testInputItemLevelBlockItem); + _testUtility.TestBlock.BlockItems.Add(testInputDropLevelBlockItem); + + // Act + var result = _testUtility.Service.FindBlockForLootItem(_testUtility.TestLootItem, _testUtility.TestScript); + + // Assert + Assert.IsNull(result); + } + + [Test] + public void FindBlockForLootItem_MultipleBlocksBlock_Matches() + { + // Arrange + var testInputBlock1 = new ItemFilterBlock(); + var testInputClass1 = "Test Class"; + var testInputClassBlockItem1 = new ClassBlockItem(); + testInputClassBlockItem1.Items.Add(testInputClass1); + testInputBlock1.BlockItems.Add(testInputClassBlockItem1); + + _testUtility.TestScript.ItemFilterBlocks.Add(testInputBlock1); + + var testInputBaseType = "TestBaseType"; + var testInputBaseTypeBlockItem = new BaseTypeBlockItem(); + testInputBaseTypeBlockItem.Items.Add(testInputBaseType); + + var testInputClass = "Test Class"; + var testInputClassBlockItem = new ClassBlockItem(); + testInputClassBlockItem.Items.Add(testInputClass); + + var testInputItemLevel = 57; + var testInputItemLevelBlockItem = new ItemLevelBlockItem(FilterPredicateOperator.GreaterThan, 50); + + _testUtility.TestLootItem.BaseType = testInputBaseType; + _testUtility.TestLootItem.Class = testInputClass; + _testUtility.TestLootItem.ItemLevel = testInputItemLevel; + + _testUtility.TestBlock.BlockItems.Add(testInputBaseTypeBlockItem); + _testUtility.TestBlock.BlockItems.Add(testInputClassBlockItem); + _testUtility.TestBlock.BlockItems.Add(testInputItemLevelBlockItem); + + // Act + var result = _testUtility.Service.FindBlockForLootItem(_testUtility.TestLootItem, _testUtility.TestScript); + + // Assert + Assert.AreEqual(_testUtility.TestBlock, result); + } + + private class ItemFilterBlockFinderServiceTestUtility + { + public ItemFilterBlockFinderServiceTestUtility() + { + TestBlock = new ItemFilterBlock(); + TestScript = new ItemFilterScript(); + TestScript.ItemFilterBlocks.Add(TestBlock); + TestLootItem = new LootItem(); + + Service = new ItemFilterBlockFinderService(); + } + + public ItemFilterScript TestScript { get; private set; } + public ItemFilterBlock TestBlock { get; private set; } + public LootItem TestLootItem { get; private set; } + public ItemFilterBlockFinderService Service { get; private set; } + } + } +} diff --git a/Filtration.LootExplosionStudio.Tests/Services/TestLootItemAppearanceService.cs b/Filtration.LootExplosionStudio.Tests/Services/TestLootItemAppearanceService.cs new file mode 100644 index 0000000..e1096bb --- /dev/null +++ b/Filtration.LootExplosionStudio.Tests/Services/TestLootItemAppearanceService.cs @@ -0,0 +1,275 @@ +using System.Windows.Media; +using Filtration.LootExplosionStudio.Services; +using Filtration.ObjectModel; +using Filtration.ObjectModel.BlockItemTypes; +using Filtration.ObjectModel.Enums; +using Filtration.ObjectModel.LootExplosionStudio; +using Moq; +using NUnit.Framework; + +namespace Filtration.LootExplosionStudio.Tests.Services +{ + [TestFixture] + class TestLootItemAppearanceService + { + private LootItemAppearanceServiceTestUtility _testUtility; + + [SetUp] + public void ItemFilterProcessingServiceTestSetup() + { + _testUtility = new LootItemAppearanceServiceTestUtility(); + } + + [Test] + public void ProcessLootItemAgainstScript_NoMatchingBlocks_NormalItem_SetsCorrectTextColor() + { + // Arrange + _testUtility.TestLootItem.Rarity = ItemRarity.Normal; + + // Act + _testUtility.Service.ProcessLootItemAgainstFilterScript(_testUtility.TestLootItem, _testUtility.TestScript); + + // Assert + Assert.AreEqual(DefaultLootItemAppearanceConstants.NormalTextColor, _testUtility.TestLootItem.TextColor); + } + + [Test] + public void ProcessLootItemAgainstScript_NoMatchingBlocks_MagicItem_SetsCorrectTextColor() + { + // Arrange + _testUtility.TestLootItem.Rarity = ItemRarity.Magic; + _testUtility.TestBlock.BlockItems.Add(new ItemLevelBlockItem(FilterPredicateOperator.GreaterThan, 99)); + + // Act + _testUtility.Service.ProcessLootItemAgainstFilterScript(_testUtility.TestLootItem, _testUtility.TestScript); + + // Assert + Assert.AreEqual(DefaultLootItemAppearanceConstants.MagicTextColor, _testUtility.TestLootItem.TextColor); + } + + [Test] + public void ProcessLootItemAgainstScript_NoMatchingBlocks_RareItem_SetsCorrectTextColor() + { + // Arrange + _testUtility.TestLootItem.Rarity = ItemRarity.Rare; + _testUtility.TestBlock.BlockItems.Add(new ItemLevelBlockItem(FilterPredicateOperator.GreaterThan, 99)); + + // Act + _testUtility.Service.ProcessLootItemAgainstFilterScript(_testUtility.TestLootItem, _testUtility.TestScript); + + // Assert + Assert.AreEqual(DefaultLootItemAppearanceConstants.RareTextColor, _testUtility.TestLootItem.TextColor); + } + + [Test] + public void ProcessLootItemAgainstScript_NoMatchingBlocks_UniqueItem_SetsCorrectTextColor() + { + // Arrange + _testUtility.TestLootItem.Rarity = ItemRarity.Unique; + _testUtility.TestBlock.BlockItems.Add(new ItemLevelBlockItem(FilterPredicateOperator.GreaterThan, 99)); + + // Act + _testUtility.Service.ProcessLootItemAgainstFilterScript(_testUtility.TestLootItem, _testUtility.TestScript); + + // Assert + Assert.AreEqual(DefaultLootItemAppearanceConstants.UniqueTextColor, _testUtility.TestLootItem.TextColor); + } + + [Test] + public void ProcessLootItemAgainstScript_NoMatchingBlocks_SetsCorrectBackgroundColor() + { + // Arrange + _testUtility.TestBlock.BlockItems.Add(new ItemLevelBlockItem(FilterPredicateOperator.GreaterThan, 99)); + + // Act + _testUtility.Service.ProcessLootItemAgainstFilterScript(_testUtility.TestLootItem, _testUtility.TestScript); + + // Assert + Assert.AreEqual(DefaultLootItemAppearanceConstants.BackgroundColor, _testUtility.TestLootItem.BackgroundColor); + } + + [Test] + public void ProcessLootItemAgainstScript_NoMatchingBlocks_SetsCorrectBorderColor() + { + // Arrange + _testUtility.TestBlock.BlockItems.Add(new ItemLevelBlockItem(FilterPredicateOperator.GreaterThan, 99)); + + // Act + _testUtility.Service.ProcessLootItemAgainstFilterScript(_testUtility.TestLootItem, _testUtility.TestScript); + + // Assert + Assert.AreEqual(DefaultLootItemAppearanceConstants.BorderColor, _testUtility.TestLootItem.BorderColor); + } + + [Test] + public void ProcessLootItemAgainstScript_MatchingTextColorOnly_SetsColorsCorrectly() + { + // Arrange + var testInputTextColor = new Color {R = 123, G = 5, B = 22, A = 200}; + _testUtility.TestBlock.BlockItems.Add(new TextColorBlockItem {Color = testInputTextColor}); + + // Act + _testUtility.Service.ProcessLootItemAgainstFilterScript(_testUtility.TestLootItem, _testUtility.TestScript); + + // Assert + Assert.AreEqual(testInputTextColor, _testUtility.TestLootItem.TextColor); + Assert.AreEqual(DefaultLootItemAppearanceConstants.BackgroundColor, _testUtility.TestLootItem.BackgroundColor); + Assert.AreEqual(DefaultLootItemAppearanceConstants.BorderColor, _testUtility.TestLootItem.BorderColor); + Assert.AreEqual(DefaultLootItemAppearanceConstants.FontSize, _testUtility.TestLootItem.FontSize ); + } + + [Test] + public void ProcessLootItemAgainstScript_MatchingBackgroundColorOnly_RarityNormal_SetsColorsCorrectly() + { + // Arrange + var testInputBackgroundColor = new Color {R = 123, G = 5, B = 22, A = 200}; + _testUtility.TestBlock.BlockItems.Add(new BackgroundColorBlockItem {Color = testInputBackgroundColor}); + + // Act + _testUtility.Service.ProcessLootItemAgainstFilterScript(_testUtility.TestLootItem, _testUtility.TestScript); + + // Assert + Assert.AreEqual(testInputBackgroundColor, _testUtility.TestLootItem.BackgroundColor); + Assert.AreEqual(DefaultLootItemAppearanceConstants.NormalTextColor, _testUtility.TestLootItem.TextColor); + Assert.AreEqual(DefaultLootItemAppearanceConstants.BorderColor, _testUtility.TestLootItem.BorderColor); + Assert.AreEqual(DefaultLootItemAppearanceConstants.FontSize, _testUtility.TestLootItem.FontSize); + } + + [Test] + public void ProcessLootItemAgainstScript_MatchingBackgroundColorOnly_RarityMagic_SetsColorsCorrectly() + { + // Arrange + var testInputBackgroundColor = new Color { R = 123, G = 5, B = 22, A = 200 }; + _testUtility.TestBlock.BlockItems.Add(new BackgroundColorBlockItem {Color = testInputBackgroundColor}); + _testUtility.TestLootItem.Rarity = ItemRarity.Magic; + + // Act + _testUtility.Service.ProcessLootItemAgainstFilterScript(_testUtility.TestLootItem, _testUtility.TestScript); + + // Assert + Assert.AreEqual(testInputBackgroundColor, _testUtility.TestLootItem.BackgroundColor); + Assert.AreEqual(DefaultLootItemAppearanceConstants.MagicTextColor, _testUtility.TestLootItem.TextColor); + Assert.AreEqual(DefaultLootItemAppearanceConstants.BorderColor, _testUtility.TestLootItem.BorderColor); + Assert.AreEqual(DefaultLootItemAppearanceConstants.FontSize, _testUtility.TestLootItem.FontSize); + } + + [Test] + public void ProcessLootItemAgainstScript_MatchingBackgroundColorOnly_RarityRare_SetsColorsCorrectly() + { + // Arrange + var testInputBackgroundColor = new Color { R = 123, G = 5, B = 22, A = 200 }; + _testUtility.TestBlock.BlockItems.Add(new BackgroundColorBlockItem { Color = testInputBackgroundColor }); + _testUtility.TestLootItem.Rarity = ItemRarity.Rare; + + // Act + _testUtility.Service.ProcessLootItemAgainstFilterScript(_testUtility.TestLootItem, _testUtility.TestScript); + + // Assert + Assert.AreEqual(testInputBackgroundColor, _testUtility.TestLootItem.BackgroundColor); + Assert.AreEqual(DefaultLootItemAppearanceConstants.RareTextColor, _testUtility.TestLootItem.TextColor); + Assert.AreEqual(DefaultLootItemAppearanceConstants.BorderColor, _testUtility.TestLootItem.BorderColor); + Assert.AreEqual(DefaultLootItemAppearanceConstants.FontSize, _testUtility.TestLootItem.FontSize); + } + + [Test] + public void ProcessLootItemAgainstScript_MatchingBackgroundColorOnly_RarityUnique_SetsColorsCorrectly() + { + // Arrange + var testInputBackgroundColor = new Color { R = 123, G = 5, B = 22, A = 200 }; + _testUtility.TestBlock.BlockItems.Add(new BackgroundColorBlockItem { Color = testInputBackgroundColor }); + _testUtility.TestLootItem.Rarity = ItemRarity.Unique; + + // Act + _testUtility.Service.ProcessLootItemAgainstFilterScript(_testUtility.TestLootItem, _testUtility.TestScript); + + // Assert + Assert.AreEqual(testInputBackgroundColor, _testUtility.TestLootItem.BackgroundColor); + Assert.AreEqual(DefaultLootItemAppearanceConstants.UniqueTextColor, _testUtility.TestLootItem.TextColor); + Assert.AreEqual(DefaultLootItemAppearanceConstants.BorderColor, _testUtility.TestLootItem.BorderColor); + Assert.AreEqual(DefaultLootItemAppearanceConstants.FontSize, _testUtility.TestLootItem.FontSize); + } + + [Test] + public void ProcessLootItemAgainstScript_MatchingBorderColorOnly_RarityUnique_SetsColorsCorrectly() + { + // Arrange + var testInputBorderColor = new Color { R = 123, G = 5, B = 22, A = 200 }; + _testUtility.TestBlock.BlockItems.Add(new BorderColorBlockItem { Color = testInputBorderColor }); + + // Act + _testUtility.Service.ProcessLootItemAgainstFilterScript(_testUtility.TestLootItem, _testUtility.TestScript); + + // Assert + Assert.AreEqual(testInputBorderColor, _testUtility.TestLootItem.BorderColor); + Assert.AreEqual(DefaultLootItemAppearanceConstants.NormalTextColor, _testUtility.TestLootItem.TextColor); + Assert.AreEqual(DefaultLootItemAppearanceConstants.BackgroundColor, _testUtility.TestLootItem.BackgroundColor); + Assert.AreEqual(DefaultLootItemAppearanceConstants.FontSize, _testUtility.TestLootItem.FontSize); + } + + [Test] + public void ProcessLootItemAgainstScript_MatchingFontSizeOnly_RarityUnique_SetsColorsCorrectly() + { + // Arrange + var testInputFontSize = 22; + _testUtility.TestBlock.BlockItems.Add(new FontSizeBlockItem(22)); + + // Act + _testUtility.Service.ProcessLootItemAgainstFilterScript(_testUtility.TestLootItem, _testUtility.TestScript); + + // Assert + Assert.AreEqual(testInputFontSize, _testUtility.TestLootItem.FontSize); + Assert.AreEqual(DefaultLootItemAppearanceConstants.NormalTextColor, _testUtility.TestLootItem.TextColor); + Assert.AreEqual(DefaultLootItemAppearanceConstants.BackgroundColor, _testUtility.TestLootItem.BackgroundColor); + Assert.AreEqual(DefaultLootItemAppearanceConstants.BorderColor, _testUtility.TestLootItem.BorderColor); + } + + [Test] + public void ProcessLootItemAgainstScript_AllAppearanceMatching_SetsColorsCorrectly() + { + // Arrange + var testInputFontSize = 22; + var testInputTextColor = new Color { R = 123, G = 5, B = 22, A = 200 }; + var testInputBackgroundColor = new Color { R = 123, G = 59, B = 27, A = 50 }; + var testInputBorderColor = new Color { R = 166, G = 0, B = 100, A = 255 }; + + _testUtility.TestBlock.BlockItems.Add(new FontSizeBlockItem(22)); + _testUtility.TestBlock.BlockItems.Add(new BorderColorBlockItem { Color = testInputBorderColor }); + _testUtility.TestBlock.BlockItems.Add(new BackgroundColorBlockItem { Color = testInputBackgroundColor }); + _testUtility.TestBlock.BlockItems.Add(new TextColorBlockItem { Color = testInputTextColor }); + + // Act + _testUtility.Service.ProcessLootItemAgainstFilterScript(_testUtility.TestLootItem, _testUtility.TestScript); + + // Assert + Assert.AreEqual(testInputFontSize, _testUtility.TestLootItem.FontSize); + Assert.AreEqual(testInputTextColor, _testUtility.TestLootItem.TextColor); + Assert.AreEqual(testInputBackgroundColor, _testUtility.TestLootItem.BackgroundColor); + Assert.AreEqual(testInputBorderColor, _testUtility.TestLootItem.BorderColor); + } + + private class LootItemAppearanceServiceTestUtility + { + public LootItemAppearanceServiceTestUtility() + { + TestBlock = new ItemFilterBlock(); + TestScript = new ItemFilterScript(); + TestScript.ItemFilterBlocks.Add(TestBlock); + TestLootItem = new LootItem(); + + MockItemFilterBlockFinderService = new Mock(); + MockItemFilterBlockFinderService.Setup( + b => b.FindBlockForLootItem(TestLootItem, TestScript)) + .Returns(TestBlock); + + Service = new LootItemAppearanceService(MockItemFilterBlockFinderService.Object); + } + + public Mock MockItemFilterBlockFinderService { get; private set; } + + public ItemFilterScript TestScript { get; private set; } + public ItemFilterBlock TestBlock { get; private set; } + public LootItem TestLootItem { get; private set; } + public LootItemAppearanceService Service { get; private set; } + } + } +} diff --git a/Filtration.LootExplosionStudio.Tests/packages.config b/Filtration.LootExplosionStudio.Tests/packages.config new file mode 100644 index 0000000..d38a376 --- /dev/null +++ b/Filtration.LootExplosionStudio.Tests/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/Filtration.LootExplosionStudio/Filtration.LootExplosionStudio.csproj b/Filtration.LootExplosionStudio/Filtration.LootExplosionStudio.csproj new file mode 100644 index 0000000..4eff50b --- /dev/null +++ b/Filtration.LootExplosionStudio/Filtration.LootExplosionStudio.csproj @@ -0,0 +1,72 @@ + + + + + Debug + AnyCPU + {C8009B11-14D0-4421-94F0-9EF4603CB363} + Library + Properties + Filtration.LootExplosionStudio + Filtration.LootExplosionStudio + v4.5.1 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Castle.Core.3.3.0\lib\net45\Castle.Core.dll + + + ..\packages\Castle.Windsor.3.3.0\lib\net45\Castle.Windsor.dll + + + + + + + + + + + + + + + + + + + + {4aac3beb-1dc1-483e-9d11-0e9334e80227} + Filtration.ObjectModel + + + + + + + + \ No newline at end of file diff --git a/Filtration.LootExplosionStudio/Services/ItemFilterBlockFinderService.cs b/Filtration.LootExplosionStudio/Services/ItemFilterBlockFinderService.cs new file mode 100644 index 0000000..7f72841 --- /dev/null +++ b/Filtration.LootExplosionStudio/Services/ItemFilterBlockFinderService.cs @@ -0,0 +1,37 @@ +using System.Linq; +using Filtration.ObjectModel; +using Filtration.ObjectModel.BlockItemBaseTypes; +using Filtration.ObjectModel.LootExplosionStudio; + +namespace Filtration.LootExplosionStudio.Services +{ + internal interface IItemFilterBlockFinderService + { + ItemFilterBlock FindBlockForLootItem(LootItem lootItem, ItemFilterScript script); + } + + internal class ItemFilterBlockFinderService : IItemFilterBlockFinderService + { + public ItemFilterBlock FindBlockForLootItem(LootItem lootItem, ItemFilterScript script) + { + return script.ItemFilterBlocks.FirstOrDefault(block => BlockMatchesLootItem(lootItem, block)); + } + + private static bool BlockMatchesLootItem(LootItem lootItem, ItemFilterBlock block) + { + if (!block.BlockItems.OfType().All(blockItem => blockItem.MatchesLootItem(lootItem))) + { + return false; + } + + if ( + !block.BlockItems.OfType() + .All(blockItem => blockItem.MatchesLootItem(lootItem))) + { + return false; + } + + return true; + } + } +} diff --git a/Filtration.LootExplosionStudio/Services/LootItemAppearanceService.cs b/Filtration.LootExplosionStudio/Services/LootItemAppearanceService.cs new file mode 100644 index 0000000..ef6d9eb --- /dev/null +++ b/Filtration.LootExplosionStudio/Services/LootItemAppearanceService.cs @@ -0,0 +1,80 @@ +using System.Linq; +using System.Windows.Media; +using Filtration.ObjectModel; +using Filtration.ObjectModel.BlockItemTypes; +using Filtration.ObjectModel.Enums; +using Filtration.ObjectModel.LootExplosionStudio; + +namespace Filtration.LootExplosionStudio.Services +{ + internal interface ILootItemAppearanceService + { + void ProcessLootItemAgainstFilterScript(LootItem lootItem, ItemFilterScript script); + } + + internal class LootItemAppearanceService : ILootItemAppearanceService + { + private readonly IItemFilterBlockFinderService _blockFinderService; + + public LootItemAppearanceService(IItemFilterBlockFinderService blockFinderService) + { + _blockFinderService = blockFinderService; + } + + public void ProcessLootItemAgainstFilterScript(LootItem lootItem, ItemFilterScript script) + { + var matchedBlock = _blockFinderService.FindBlockForLootItem(lootItem, script); + if (matchedBlock == null) + { + lootItem.TextColor = GetDefaultTextColorForRarity(lootItem.Rarity); + lootItem.BackgroundColor = DefaultLootItemAppearanceConstants.BackgroundColor; + lootItem.BorderColor = DefaultLootItemAppearanceConstants.BorderColor; + lootItem.FontSize = 35; + return; + } + + lootItem.TextColor = matchedBlock.HasBlockItemOfType() + ? matchedBlock.BlockItems.OfType().First().Color + : GetDefaultTextColorForRarity(lootItem.Rarity); + + lootItem.BackgroundColor = matchedBlock.HasBlockItemOfType() + ? matchedBlock.BlockItems.OfType().First().Color + : DefaultLootItemAppearanceConstants.BackgroundColor; + + lootItem.BorderColor = matchedBlock.HasBlockItemOfType() + ? matchedBlock.BlockItems.OfType().First().Color + : DefaultLootItemAppearanceConstants.BorderColor; + + lootItem.FontSize = matchedBlock.HasBlockItemOfType() + ? matchedBlock.BlockItems.OfType().First().Value + : 35; + } + + private Color GetDefaultTextColorForRarity(ItemRarity rarity) + { + switch (rarity) + { + case ItemRarity.Normal: + { + return DefaultLootItemAppearanceConstants.NormalTextColor; + } + case ItemRarity.Magic: + { + return DefaultLootItemAppearanceConstants.MagicTextColor; + } + case ItemRarity.Rare: + { + return DefaultLootItemAppearanceConstants.RareTextColor; + } + case ItemRarity.Unique: + { + return DefaultLootItemAppearanceConstants.UniqueTextColor; + } + default: + { + return DefaultLootItemAppearanceConstants.NormalTextColor; + } + } + } + } +} diff --git a/Filtration.LootExplosionStudio/Services/LootItemCollectionItemFilterCombinerService.cs b/Filtration.LootExplosionStudio/Services/LootItemCollectionItemFilterCombinerService.cs new file mode 100644 index 0000000..faa4750 --- /dev/null +++ b/Filtration.LootExplosionStudio/Services/LootItemCollectionItemFilterCombinerService.cs @@ -0,0 +1,30 @@ +using Filtration.ObjectModel; +using Filtration.ObjectModel.LootExplosionStudio; + +namespace Filtration.LootExplosionStudio.Services +{ + internal interface ILootItemCollectionItemFilterCombinerService + { + void CombineLootItemCollectionWithItemFilterScript(LootItemCollection lootItemCollection, + ItemFilterScript script); + } + + internal class LootItemCollectionItemFilterCombinerService : ILootItemCollectionItemFilterCombinerService + { + private readonly ILootItemAppearanceService _lootItemAppearanceService; + + public LootItemCollectionItemFilterCombinerService(ILootItemAppearanceService lootItemAppearanceService) + { + _lootItemAppearanceService = lootItemAppearanceService; + } + + public void CombineLootItemCollectionWithItemFilterScript(LootItemCollection lootItemCollection, + ItemFilterScript script) + { + foreach (var lootItem in lootItemCollection) + { + _lootItemAppearanceService.ProcessLootItemAgainstFilterScript(lootItem, script); + } + } + } +} diff --git a/Filtration.LootExplosionStudio/WindsorInstallers/ServicesInstaller.cs b/Filtration.LootExplosionStudio/WindsorInstallers/ServicesInstaller.cs new file mode 100644 index 0000000..1eca1c5 --- /dev/null +++ b/Filtration.LootExplosionStudio/WindsorInstallers/ServicesInstaller.cs @@ -0,0 +1,27 @@ +using Castle.MicroKernel.Registration; +using Castle.MicroKernel.SubSystems.Configuration; +using Castle.Windsor; +using Filtration.LootExplosionStudio.Services; + +namespace Filtration.LootExplosionStudio.WindsorInstallers +{ + class ServicesInstaller : IWindsorInstaller + { + public void Install(IWindsorContainer container, IConfigurationStore store) + { + container.Register( + Component.For() + .ImplementedBy() + .LifeStyle.Singleton); + + container.Register( + Component.For() + .ImplementedBy() + .LifeStyle.Singleton); + container.Register( + Component.For() + .ImplementedBy() + .LifeStyle.Singleton); + } + } +} diff --git a/Filtration.LootExplosionStudio/packages.config b/Filtration.LootExplosionStudio/packages.config new file mode 100644 index 0000000..b93e4a4 --- /dev/null +++ b/Filtration.LootExplosionStudio/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file