Implemented BlockGroups and related translation

This commit is contained in:
Ben 2015-06-08 22:29:39 +01:00
parent d48f7a58ec
commit 7b0e83b9ae
12 changed files with 269 additions and 72 deletions

View File

@ -47,10 +47,12 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="Models\TestItemFilterBlock.cs" /> <Compile Include="Models\TestItemFilterBlock.cs" />
<Compile Include="Models\TestItemFilterBlockGroup.cs" />
<Compile Include="Models\TestItemFilterScript.cs" /> <Compile Include="Models\TestItemFilterScript.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Services\TestItemFilterPersistenceService.cs" /> <Compile Include="Services\TestItemFilterPersistenceService.cs" />
<Compile Include="Services\TestStaticDataService.cs" /> <Compile Include="Services\TestStaticDataService.cs" />
<Compile Include="Translators\TestBlockGroupHierarchyBuilder.cs" />
<Compile Include="Translators\TestItemFilterBlockTranslator.cs" /> <Compile Include="Translators\TestItemFilterBlockTranslator.cs" />
<Compile Include="Translators\TestItemFilterScriptTranslator.cs" /> <Compile Include="Translators\TestItemFilterScriptTranslator.cs" />
</ItemGroup> </ItemGroup>

View File

@ -29,10 +29,8 @@ namespace Filtration.Tests.Models
{ {
// Arrange // Arrange
var script = new ItemFilterScript var script = new ItemFilterScript();
{ script.ItemFilterBlocks.Add(new ItemFilterBlock());
ItemFilterBlocks = new ObservableCollection<ItemFilterBlock> {new ItemFilterBlock()}
};
// Act // Act
var result = script.Validate(); var result = script.Validate();
@ -62,15 +60,12 @@ namespace Filtration.Tests.Models
var testInputBlock3 = new ItemFilterBlock(); var testInputBlock3 = new ItemFilterBlock();
testInputBlock3.BlockItems.Add(new BackgroundColorBlockItem(new Color { A = 255, R = 255, G = 0, B = 0 })); testInputBlock3.BlockItems.Add(new BackgroundColorBlockItem(new Color { A = 255, R = 255, G = 0, B = 0 }));
var script = new ItemFilterScript() var script = new ItemFilterScript();
{
ItemFilterBlocks = new ObservableCollection<ItemFilterBlock> script.ItemFilterBlocks.Add(testInputBlock1);
{ script.ItemFilterBlocks.Add(testInputBlock2);
testInputBlock1, script.ItemFilterBlocks.Add(testInputBlock3);
testInputBlock2,
testInputBlock3
}
};
// Act // Act
script.ReplaceColors(testInputReplaceColors); script.ReplaceColors(testInputReplaceColors);
@ -108,14 +103,9 @@ namespace Filtration.Tests.Models
testInputBlock2.BlockItems.Add(new BackgroundColorBlockItem(oldBackgroundColor)); testInputBlock2.BlockItems.Add(new BackgroundColorBlockItem(oldBackgroundColor));
testInputBlock2.BlockItems.Add(new TextColorBlockItem(new Color {A = 1, R = 2, G = 3, B = 4})); testInputBlock2.BlockItems.Add(new TextColorBlockItem(new Color {A = 1, R = 2, G = 3, B = 4}));
var script = new ItemFilterScript var script = new ItemFilterScript();
{ script.ItemFilterBlocks.Add(testInputBlock1);
ItemFilterBlocks = new ObservableCollection<ItemFilterBlock> script.ItemFilterBlocks.Add(testInputBlock2);
{
testInputBlock1,
testInputBlock2
}
};
// Act // Act
script.ReplaceColors(testInputReplaceColors); script.ReplaceColors(testInputReplaceColors);
@ -131,3 +121,4 @@ namespace Filtration.Tests.Models
} }
} }
} }

View File

@ -1,4 +1,5 @@
using System; using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Windows.Media; using System.Windows.Media;
using Filtration.Enums; using Filtration.Enums;
@ -6,6 +7,7 @@ using Filtration.Models;
using Filtration.Models.BlockItemBaseTypes; using Filtration.Models.BlockItemBaseTypes;
using Filtration.Models.BlockItemTypes; using Filtration.Models.BlockItemTypes;
using Filtration.Translators; using Filtration.Translators;
using Moq;
using NUnit.Framework; using NUnit.Framework;
namespace Filtration.Tests.Translators namespace Filtration.Tests.Translators
@ -38,6 +40,64 @@ namespace Filtration.Tests.Translators
Assert.AreEqual(FilterPredicateOperator.GreaterThanOrEqual, blockItem.FilterPredicate.PredicateOperator); Assert.AreEqual(FilterPredicateOperator.GreaterThanOrEqual, blockItem.FilterPredicate.PredicateOperator);
} }
[Test]
public void TranslateStringToItemFilterBlock_BlockGroupComment_CallsBlockGroupHierarchyBuilder()
{
// Arrange
var inputString = "Show # TestBlockGroup" + Environment.NewLine;
// Act
_testUtility.MockBlockGroupHierarchyBuilder.Setup(b => b.IntegrateStringListIntoBlockGroupHierarchy(It.IsAny<IEnumerable<string>>())).Verifiable();
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString);
// Assert
_testUtility.MockBlockGroupHierarchyBuilder.Verify();
}
[Test]
public void TranslateStringToItemFilterBlock_NoBlockGroupComment_CallsBlockGroupHierarchyBuilder()
{
// Arrange
var inputString = "Show" + Environment.NewLine;
// Act
_testUtility.MockBlockGroupHierarchyBuilder.Setup(b => b.IntegrateStringListIntoBlockGroupHierarchy(It.IsAny<IEnumerable<string>>())).Verifiable();
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString);
// Assert
_testUtility.MockBlockGroupHierarchyBuilder.Verify(b => b.IntegrateStringListIntoBlockGroupHierarchy(It.IsAny<IEnumerable<string>>()), Times.Never);
}
[Test]
public void TranslateStringToItemFilterBlock_BlockGroupCommentWithNoGroups_DoesNotThrow()
{
// Arrange
var inputString = "Show #" + Environment.NewLine;
// Act
_testUtility.MockBlockGroupHierarchyBuilder.Setup(b => b.IntegrateStringListIntoBlockGroupHierarchy(It.IsAny<IEnumerable<string>>())).Verifiable();
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString);
// Assert
_testUtility.MockBlockGroupHierarchyBuilder.Verify(b => b.IntegrateStringListIntoBlockGroupHierarchy(It.IsAny<IEnumerable<string>>()), Times.Never);
}
[Test]
public void TranslateStringToItemFilterBlock_BlockGroupComment_SetsBlockItemGroupCorrectly()
{
// Arrange
var inputString = "Show # Test Block Group - Test Sub Block Group - Test Another Block Group" + Environment.NewLine;
var testBlockGroup = new ItemFilterBlockGroup("zzzzz", null);
// Act
_testUtility.MockBlockGroupHierarchyBuilder.Setup(b => b.IntegrateStringListIntoBlockGroupHierarchy(It.IsAny<IEnumerable<string>>())).Returns(testBlockGroup).Verifiable();
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString);
// Assert
Assert.AreEqual(testBlockGroup, result.BlockGroup);
_testUtility.MockBlockGroupHierarchyBuilder.Verify();
}
[Test] [Test]
public void TranslateStringToItemFilterBlock_Hide_ReturnsCorrectObject() public void TranslateStringToItemFilterBlock_Hide_ReturnsCorrectObject()
{ {
@ -686,6 +746,24 @@ namespace Filtration.Tests.Translators
Assert.AreEqual(expectedResult, result); Assert.AreEqual(expectedResult, result);
} }
[Test]
public void TranslateItemFilterBlockToString_HasBlockGroup_ReturnsCorrectString()
{
// Arrange
var expectedResult = "Show # Child 1 Block Group - Child 2 Block Group";
var rootBlockGroup = new ItemFilterBlockGroup("Root Block Group", null);
var child1BlockGroup = new ItemFilterBlockGroup("Child 1 Block Group", rootBlockGroup);
var child2BlockGroup = new ItemFilterBlockGroup("Child 2 Block Group", child1BlockGroup);
_testUtility.TestBlock.BlockGroup = child2BlockGroup;
// Act
var result = _testUtility.Translator.TranslateItemFilterBlockToString(_testUtility.TestBlock);
// Assert
Assert.AreEqual(expectedResult, result);
}
[Test] [Test]
public void TranslateItemFilterBlockToString_FilterTypeHide_ReturnsCorrectString() public void TranslateItemFilterBlockToString_FilterTypeHide_ReturnsCorrectString()
{ {
@ -1158,11 +1236,15 @@ namespace Filtration.Tests.Translators
// Test Data // Test Data
TestBlock = new ItemFilterBlock(); TestBlock = new ItemFilterBlock();
// Mock setups
MockBlockGroupHierarchyBuilder = new Mock<IBlockGroupHierarchyBuilder>();
// Class under test instantiation // Class under test instantiation
Translator = new ItemFilterBlockTranslator(); Translator = new ItemFilterBlockTranslator(MockBlockGroupHierarchyBuilder.Object);
} }
public ItemFilterBlock TestBlock { get; set; } public ItemFilterBlock TestBlock { get; set; }
public Mock<IBlockGroupHierarchyBuilder> MockBlockGroupHierarchyBuilder { get; private set; }
public ItemFilterBlockTranslator Translator { get; private set; } public ItemFilterBlockTranslator Translator { get; private set; }
} }
} }

View File

@ -13,23 +13,28 @@ namespace Filtration.Tests.Translators
[TestFixture] [TestFixture]
public class TestItemFilterScriptTranslator public class TestItemFilterScriptTranslator
{ {
private ItemFilterScriptTranslatorTestUtility _testUtility;
[SetUp]
public void ItemFilterScriptTranslatorTestSetup()
{
_testUtility = new ItemFilterScriptTranslatorTestUtility();
}
[Test] [Test]
public void TranslateStringToItemFilterScript_ReturnsScriptWithCorrectNumberOfBlocks() public void TranslateStringToItemFilterScript_ReturnsScriptWithCorrectNumberOfBlocks()
{ {
// Arrange // Arrange
var testInput = File.ReadAllText(@"Resources/testscript.txt"); var testInput = File.ReadAllText(@"Resources/testscript.txt");
var mockItemFilterBlockTranslator = new Mock<IItemFilterBlockTranslator>(); _testUtility.MockItemFilterBlockTranslator.Setup(t => t.TranslateStringToItemFilterBlock(It.IsAny<string>())).Verifiable();
mockItemFilterBlockTranslator.Setup(t => t.TranslateStringToItemFilterBlock(It.IsAny<string>())).Verifiable();
var translator = new ItemFilterScriptTranslator(mockItemFilterBlockTranslator.Object);
// Act // Act
var script = translator.TranslateStringToItemFilterScript(testInput); var script = _testUtility.ScriptTranslator.TranslateStringToItemFilterScript(testInput);
// Assert // Assert
Assert.AreEqual(5, script.ItemFilterBlocks.Count); Assert.AreEqual(5, script.ItemFilterBlocks.Count);
mockItemFilterBlockTranslator.Verify(); _testUtility.MockItemFilterBlockTranslator.Verify();
} }
[Test] [Test]
@ -46,10 +51,8 @@ namespace Filtration.Tests.Translators
var mockItemFilterBlockTranslator = new Mock<IItemFilterBlockTranslator>(); var mockItemFilterBlockTranslator = new Mock<IItemFilterBlockTranslator>();
mockItemFilterBlockTranslator.Setup(t => t.TranslateStringToItemFilterBlock(It.IsAny<string>())).Verifiable(); mockItemFilterBlockTranslator.Setup(t => t.TranslateStringToItemFilterBlock(It.IsAny<string>())).Verifiable();
var translator = new ItemFilterScriptTranslator(mockItemFilterBlockTranslator.Object);
// Act // Act
var script = translator.TranslateStringToItemFilterScript(testInput); var script = _testUtility.ScriptTranslator.TranslateStringToItemFilterScript(testInput);
// Assert // Assert
Assert.AreEqual(expectedDescription, script.Description); Assert.AreEqual(expectedDescription, script.Description);
@ -62,9 +65,10 @@ namespace Filtration.Tests.Translators
// Arrange // Arrange
var testInput = File.ReadAllText(@"Resources/ThioleItemFilter.txt"); var testInput = File.ReadAllText(@"Resources/ThioleItemFilter.txt");
var BlockTranslator = new ItemFilterBlockTranslator(); var mockBlockGroupHierarchyBuilder = new Mock<IBlockGroupHierarchyBuilder>();
var translator = new ItemFilterScriptTranslator(BlockTranslator); var blockTranslator = new ItemFilterBlockTranslator(mockBlockGroupHierarchyBuilder.Object);
var translator = new ItemFilterScriptTranslator(blockTranslator, mockBlockGroupHierarchyBuilder.Object);
// Act // Act
var script = translator.TranslateStringToItemFilterScript(testInput); var script = translator.TranslateStringToItemFilterScript(testInput);
@ -82,20 +86,17 @@ namespace Filtration.Tests.Translators
testBlock.BlockItems.Add(new ItemLevelBlockItem(FilterPredicateOperator.Equal, 5)); testBlock.BlockItems.Add(new ItemLevelBlockItem(FilterPredicateOperator.Equal, 5));
var BlockOutput = "Test Script Output"; var BlockOutput = "Test Script Output";
var expectedOutput = "Test Script Output" + Environment.NewLine + Environment.NewLine;
testScript.ItemFilterBlocks.Add(testBlock); testScript.ItemFilterBlocks.Add(testBlock);
var mockItemFilterBlockTranslator = new Mock<IItemFilterBlockTranslator>(); _testUtility.MockItemFilterBlockTranslator.Setup(t => t.TranslateItemFilterBlockToString(testBlock)).Returns(BlockOutput).Verifiable();
mockItemFilterBlockTranslator.Setup(t => t.TranslateItemFilterBlockToString(testBlock)).Returns(BlockOutput).Verifiable();
var translator = new ItemFilterScriptTranslator(mockItemFilterBlockTranslator.Object);
// Act // Act
var result = translator.TranslateItemFilterScriptToString(testScript); var result = _testUtility.ScriptTranslator.TranslateItemFilterScriptToString(testScript);
// Assert // Assert
mockItemFilterBlockTranslator.Verify(); _testUtility.MockItemFilterBlockTranslator.Verify();
} }
[Test] [Test]
@ -132,8 +133,9 @@ namespace Filtration.Tests.Translators
" Width = 3" + Environment.NewLine + " Width = 3" + Environment.NewLine +
" SetFontSize 7" + Environment.NewLine + Environment.NewLine; " SetFontSize 7" + Environment.NewLine + Environment.NewLine;
var blockTranslator = new ItemFilterBlockTranslator(); var mockBlockGroupHierarchyBuilder = new Mock<IBlockGroupHierarchyBuilder>();
var translator = new ItemFilterScriptTranslator(blockTranslator); var blockTranslator = new ItemFilterBlockTranslator(mockBlockGroupHierarchyBuilder.Object);
var translator = new ItemFilterScriptTranslator(blockTranslator, mockBlockGroupHierarchyBuilder.Object);
// Act // Act
var result = translator.TranslateItemFilterScriptToString(script); var result = translator.TranslateItemFilterScriptToString(script);
@ -155,11 +157,8 @@ namespace Filtration.Tests.Translators
Environment.NewLine + Environment.NewLine +
"# Test script description" + Environment.NewLine + Environment.NewLine; "# Test script description" + Environment.NewLine + Environment.NewLine;
var blockTranslator = new ItemFilterBlockTranslator();
var translator = new ItemFilterScriptTranslator(blockTranslator);
// Act // Act
var result = translator.TranslateItemFilterScriptToString(script); var result = _testUtility.ScriptTranslator.TranslateItemFilterScriptToString(script);
// Assert // Assert
Assert.AreEqual(expectedOutput, result); Assert.AreEqual(expectedOutput, result);
@ -177,8 +176,8 @@ namespace Filtration.Tests.Translators
" SetBorderColor 255 0 255" + Environment.NewLine + " SetBorderColor 255 0 255" + Environment.NewLine +
" SetFontSize 25"; " SetFontSize 25";
var blockTranslator = new ItemFilterBlockTranslator(); var blockTranslator = new ItemFilterBlockTranslator(_testUtility.MockBlockGroupHierarchyBuilder.Object);
var translator = new ItemFilterScriptTranslator(blockTranslator); var translator = new ItemFilterScriptTranslator(blockTranslator, _testUtility.MockBlockGroupHierarchyBuilder.Object);
// Act // Act
var result = translator.TranslateStringToItemFilterScript(testInputScript); var result = translator.TranslateStringToItemFilterScript(testInputScript);
@ -191,5 +190,22 @@ namespace Filtration.Tests.Translators
Assert.AreEqual(2, baseTypeItem.Items.Count); Assert.AreEqual(2, baseTypeItem.Items.Count);
} }
private class ItemFilterScriptTranslatorTestUtility
{
public ItemFilterScriptTranslatorTestUtility()
{
// Mock setups
MockItemFilterBlockTranslator = new Mock<IItemFilterBlockTranslator>();
MockBlockGroupHierarchyBuilder = new Mock<IBlockGroupHierarchyBuilder>();
// Class under test instantiation
ScriptTranslator = new ItemFilterScriptTranslator(MockItemFilterBlockTranslator.Object, MockBlockGroupHierarchyBuilder.Object);
}
public ItemFilterScriptTranslator ScriptTranslator { get; private set; }
public Mock<IItemFilterBlockTranslator> MockItemFilterBlockTranslator { get; private set; }
public Mock<IBlockGroupHierarchyBuilder> MockBlockGroupHierarchyBuilder { get; private set; }
}
} }
} }

View File

@ -142,6 +142,7 @@
<Compile Include="Services\FileSystemService.cs" /> <Compile Include="Services\FileSystemService.cs" />
<Compile Include="Services\ItemFilterPersistenceService.cs" /> <Compile Include="Services\ItemFilterPersistenceService.cs" />
<Compile Include="Services\StaticDataService.cs" /> <Compile Include="Services\StaticDataService.cs" />
<Compile Include="Translators\BlockGroupHierarchyBuilder.cs" />
<Compile Include="Translators\ItemFilterBlockTranslator.cs" /> <Compile Include="Translators\ItemFilterBlockTranslator.cs" />
<Compile Include="Translators\ItemFilterScriptTranslator.cs" /> <Compile Include="Translators\ItemFilterScriptTranslator.cs" />
<Compile Include="UserControls\AutoScrollingListBox.cs" /> <Compile Include="UserControls\AutoScrollingListBox.cs" />

View File

@ -14,6 +14,7 @@ namespace Filtration.Models
} }
public string Description { get; set; } public string Description { get; set; }
public ItemFilterBlockGroup BlockGroup { get; set; }
public BlockAction Action public BlockAction Action
{ {

View File

@ -1,12 +1,32 @@
using System; using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Filtration.Models namespace Filtration.Models
{ {
class ItemFilterBlockGroup internal class ItemFilterBlockGroup
{ {
public ItemFilterBlockGroup(string groupName, ItemFilterBlockGroup parent)
{
GroupName = groupName;
ParentGroup = parent;
ChildGroups = new List<ItemFilterBlockGroup>();
}
public override string ToString()
{
var currentBlockGroup = this;
var outputString = GroupName;
while (currentBlockGroup.ParentGroup.ParentGroup != null)
{
outputString = currentBlockGroup.ParentGroup.GroupName + " - " + outputString;
currentBlockGroup = currentBlockGroup.ParentGroup;
}
return outputString;
}
public string GroupName { get; private set; }
public ItemFilterBlockGroup ParentGroup { get; private set; }
public List<ItemFilterBlockGroup> ChildGroups { get; private set; }
} }
} }

View File

@ -11,9 +11,15 @@ namespace Filtration.Models
public ItemFilterScript() public ItemFilterScript()
{ {
ItemFilterBlocks = new ObservableCollection<ItemFilterBlock>(); ItemFilterBlocks = new ObservableCollection<ItemFilterBlock>();
ItemFilterBlockGroups = new ObservableCollection<ItemFilterBlockGroup>
{
new ItemFilterBlockGroup("Root", null)
};
} }
public ObservableCollection<ItemFilterBlock> ItemFilterBlocks { get; set; } public ObservableCollection<ItemFilterBlock> ItemFilterBlocks { get; private set; }
public ObservableCollection<ItemFilterBlockGroup> ItemFilterBlockGroups { get; private set; }
public string FilePath { get; set; } public string FilePath { get; set; }
public string Description { get; set; } public string Description { get; set; }
public DateTime DateModified { get; set; } public DateTime DateModified { get; set; }

View File

@ -0,0 +1,54 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Filtration.Models;
namespace Filtration.Translators
{
internal interface IBlockGroupHierarchyBuilder
{
void Initialise(ItemFilterBlockGroup rootBlockGroup);
ItemFilterBlockGroup IntegrateStringListIntoBlockGroupHierarchy(IEnumerable<string> groupStrings);
}
internal class BlockGroupHierarchyBuilder : IBlockGroupHierarchyBuilder
{
private ItemFilterBlockGroup _rootBlockGroup;
public void Initialise(ItemFilterBlockGroup rootBlockGroup)
{
_rootBlockGroup = rootBlockGroup;
}
public ItemFilterBlockGroup IntegrateStringListIntoBlockGroupHierarchy(IEnumerable<string> groupStrings)
{
if (_rootBlockGroup == null)
{
throw new Exception("BlockGroupHierarchyBuilder must be initialised with root BlockGroup before use");
}
return IntegrateStringListIntoBlockGroupHierarchy(groupStrings, _rootBlockGroup);
}
public ItemFilterBlockGroup IntegrateStringListIntoBlockGroupHierarchy(IEnumerable<string> groupStrings, ItemFilterBlockGroup startItemGroup)
{
var inputGroups = groupStrings.ToList();
var firstGroup = inputGroups.First().Trim();
ItemFilterBlockGroup matchingChildItemGroup = null;
if (startItemGroup.ChildGroups.Count(g => g.GroupName == firstGroup) > 0)
{
matchingChildItemGroup = startItemGroup.ChildGroups.First(c => c.GroupName == firstGroup);
}
if (matchingChildItemGroup == null)
{
var newItemGroup = new ItemFilterBlockGroup(inputGroups.First().Trim(), startItemGroup);
startItemGroup.ChildGroups.Add(newItemGroup);
inputGroups = inputGroups.Skip(1).ToList();
return inputGroups.Count > 0 ? IntegrateStringListIntoBlockGroupHierarchy(inputGroups, newItemGroup) : newItemGroup;
}
inputGroups = inputGroups.Skip(1).ToList();
return inputGroups.Count > 0 ? IntegrateStringListIntoBlockGroupHierarchy(inputGroups, matchingChildItemGroup) : matchingChildItemGroup;
}
}
}

View File

@ -21,9 +21,15 @@ namespace Filtration.Translators
internal class ItemFilterBlockTranslator : IItemFilterBlockTranslator internal class ItemFilterBlockTranslator : IItemFilterBlockTranslator
{ {
private readonly IBlockGroupHierarchyBuilder _blockGroupHierarchyBuilder;
private const string Indent = " "; private const string Indent = " ";
private readonly string _newLine = Environment.NewLine + Indent; private readonly string _newLine = Environment.NewLine + Indent;
public ItemFilterBlockTranslator(IBlockGroupHierarchyBuilder blockGroupHierarchyBuilder)
{
_blockGroupHierarchyBuilder = blockGroupHierarchyBuilder;
}
// 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) public ItemFilterBlock TranslateStringToItemFilterBlock(string inputString)
@ -32,6 +38,7 @@ namespace Filtration.Translators
var showHideFound = false; var showHideFound = false;
foreach (var line in new LineReader(() => new StringReader(inputString))) foreach (var line in new LineReader(() => new StringReader(inputString)))
{ {
if (line.StartsWith(@"# Section:")) if (line.StartsWith(@"# Section:"))
{ {
var section = new ItemFilterSection var section = new ItemFilterSection
@ -47,7 +54,8 @@ namespace Filtration.Translators
continue; continue;
} }
var trimmedLine = line.TrimStart(' '); var adjustedLine = line.Replace("#", " # ");
var trimmedLine = adjustedLine.TrimStart(' ');
var spaceOrEndOfLinePos = trimmedLine.IndexOf(" ", StringComparison.Ordinal) > 0 ? trimmedLine.IndexOf(" ", StringComparison.Ordinal) : trimmedLine.Length; var spaceOrEndOfLinePos = trimmedLine.IndexOf(" ", StringComparison.Ordinal) > 0 ? trimmedLine.IndexOf(" ", StringComparison.Ordinal) : trimmedLine.Length;
var lineOption = trimmedLine.Substring(0, spaceOrEndOfLinePos); var lineOption = trimmedLine.Substring(0, spaceOrEndOfLinePos);
@ -56,10 +64,12 @@ namespace Filtration.Translators
case "Show": case "Show":
showHideFound = true; showHideFound = true;
block.Action = BlockAction.Show; block.Action = BlockAction.Show;
AddBlockGroupToBlock(block, trimmedLine);
break; break;
case "Hide": case "Hide":
showHideFound = true; showHideFound = true;
block.Action = BlockAction.Hide; block.Action = BlockAction.Hide;
AddBlockGroupToBlock(block, trimmedLine);
break; break;
case "ItemLevel": case "ItemLevel":
{ {
@ -122,20 +132,6 @@ namespace Filtration.Translators
} }
case "SocketGroup": case "SocketGroup":
{ {
//var blockItem = new SocketGroupBlockItem();
//var socketGroups = Regex.Matches(trimmedLine, @"\s+([RGBW]{1,6})");
//foreach (Match socketGroupMatch in socketGroups)
//{
// var socketGroupCharArray = socketGroupMatch.Groups[1].Value.Trim(' ').ToCharArray();
// var socketColorList = socketGroupCharArray.Select(c => (EnumHelper.GetEnumValueFromDescription<SocketColor>(c.ToString()))).ToList();
// blockItem.SocketColorGroups.Add(socketColorList);
//}
//block.FilterBlockItems.Add(blockItem);
AddStringListItemToBlockItems<SocketGroupBlockItem>(block, trimmedLine); AddStringListItemToBlockItems<SocketGroupBlockItem>(block, trimmedLine);
break; break;
} }
@ -268,6 +264,19 @@ namespace Filtration.Translators
block.BlockItems.Add(blockItem); block.BlockItems.Add(blockItem);
} }
private void AddBlockGroupToBlock(ItemFilterBlock block, string inputString)
{
var blockGroupStart = inputString.IndexOf("#", StringComparison.Ordinal);
if (blockGroupStart <= 0) return;
var blockGroupText = inputString.Substring(blockGroupStart + 1);
var blockGroups = blockGroupText.Split('-').ToList();
if (blockGroups.Count(b => !string.IsNullOrEmpty(b.Trim())) > 0)
{
block.BlockGroup = _blockGroupHierarchyBuilder.IntegrateStringListIntoBlockGroupHierarchy(blockGroups);
}
}
private static Color GetColorFromString(string inputString) private static Color GetColorFromString(string inputString)
{ {
var argbValues = Regex.Matches(inputString, @"\s+(\d+)"); var argbValues = Regex.Matches(inputString, @"\s+(\d+)");
@ -294,7 +303,7 @@ namespace Filtration.Translators
return new Color(); return new Color();
} }
// This method converts a 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(ItemFilterBlock block)
{ {
@ -312,6 +321,11 @@ namespace Filtration.Translators
outputString += block.Action.GetAttributeDescription(); outputString += block.Action.GetAttributeDescription();
if (block.BlockGroup != null)
{
outputString += " # " + block.BlockGroup;
}
// This could be refactored to use the upcasted NumericFilterPredicateBlockItem (or even IItemFilterBlockItem) instead // This could be refactored to use the upcasted NumericFilterPredicateBlockItem (or even IItemFilterBlockItem) instead
// of the specific downcasts. Leaving it like this currently to preserve sorting since the different // of the specific downcasts. Leaving it like this currently to preserve sorting since the different
// downcasts have no defined sort order (yet). // downcasts have no defined sort order (yet).

View File

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using Filtration.Models; using Filtration.Models;
using Filtration.Utilities; using Filtration.Utilities;
@ -16,15 +17,19 @@ namespace Filtration.Translators
internal class ItemFilterScriptTranslator : IItemFilterScriptTranslator internal class ItemFilterScriptTranslator : IItemFilterScriptTranslator
{ {
private readonly IItemFilterBlockTranslator _blockTranslator; private readonly IItemFilterBlockTranslator _blockTranslator;
private readonly IBlockGroupHierarchyBuilder _blockGroupHierarchyBuilder;
public ItemFilterScriptTranslator(IItemFilterBlockTranslator blockTranslator) public ItemFilterScriptTranslator(IItemFilterBlockTranslator blockTranslator, IBlockGroupHierarchyBuilder blockGroupHierarchyBuilder)
{ {
_blockTranslator = blockTranslator; _blockTranslator = blockTranslator;
_blockGroupHierarchyBuilder = blockGroupHierarchyBuilder;
} }
public ItemFilterScript TranslateStringToItemFilterScript(string inputString) public ItemFilterScript TranslateStringToItemFilterScript(string inputString)
{ {
var script = new ItemFilterScript(); var script = new ItemFilterScript();
_blockGroupHierarchyBuilder.Initialise(script.ItemFilterBlockGroups.First());
inputString = inputString.Replace("\t", ""); inputString = inputString.Replace("\t", "");
var conditionBoundaries = IdentifyBlockBoundaries(inputString); var conditionBoundaries = IdentifyBlockBoundaries(inputString);

View File

@ -18,6 +18,11 @@ namespace Filtration.WindsorInstallers
Component.For<IItemFilterBlockTranslator>() Component.For<IItemFilterBlockTranslator>()
.ImplementedBy<ItemFilterBlockTranslator>() .ImplementedBy<ItemFilterBlockTranslator>()
.LifeStyle.Singleton); .LifeStyle.Singleton);
container.Register(
Component.For<IBlockGroupHierarchyBuilder>()
.ImplementedBy<BlockGroupHierarchyBuilder>()
.LifeStyle.Singleton);
} }
} }
} }