From 0c470b3c973bfd49d2a8f1cc4c12732cd5f5bd1d Mon Sep 17 00:00:00 2001 From: Ben Date: Sat, 4 Jul 2015 16:47:28 +0100 Subject: [PATCH] Fixed copy paste crashes --- .../Services/TestUpdateService.cs | 9 ++-- .../TestItemFilterBlockTranslator.cs | 18 +++++++ .../TestThemeComponentListBuilder.cs | 28 +++++++++++ Filtration/App.xaml.cs | 1 - .../Translators/ItemFilterBlockTranslator.cs | 30 +++--------- .../Translators/ThemeComponentListBuilder.cs | 16 ++++++- .../ViewModels/ItemFilterScriptViewModel.cs | 47 +++++++++++-------- 7 files changed, 102 insertions(+), 47 deletions(-) diff --git a/Filtration.Tests/Services/TestUpdateService.cs b/Filtration.Tests/Services/TestUpdateService.cs index 343c3ee..b90fc77 100644 --- a/Filtration.Tests/Services/TestUpdateService.cs +++ b/Filtration.Tests/Services/TestUpdateService.cs @@ -18,7 +18,8 @@ namespace Filtration.Tests.Services { // Arrange var testInputData = @" - 0.2 + 1 + 3 2015-07-01 http://www.google.com * Release notes line 1 @@ -28,7 +29,8 @@ namespace Filtration.Tests.Services var expectedResult = new UpdateData { - CurrentVersion = 0.2m, + LatestVersionMajorPart = 1, + LatestVersionMinorPart = 3, DownloadUrl = "http://www.google.com", ReleaseDate = new DateTime(2015, 7, 1), ReleaseNotes = @"* Release notes line 1 @@ -43,7 +45,8 @@ namespace Filtration.Tests.Services var result = service.DeserializeUpdateData(testInputData); // Assert - Assert.AreEqual(expectedResult.CurrentVersion, result.CurrentVersion); + Assert.AreEqual(expectedResult.LatestVersionMajorPart, result.LatestVersionMajorPart); + Assert.AreEqual(expectedResult.LatestVersionMinorPart, result.LatestVersionMinorPart); Assert.AreEqual(expectedResult.DownloadUrl, result.DownloadUrl); Assert.AreEqual(expectedResult.ReleaseDate, result.ReleaseDate); Assert.AreEqual(expectedResult.ReleaseNotes, result.ReleaseNotes); diff --git a/Filtration.Tests/Translators/TestItemFilterBlockTranslator.cs b/Filtration.Tests/Translators/TestItemFilterBlockTranslator.cs index 75d8244..94387d8 100644 --- a/Filtration.Tests/Translators/TestItemFilterBlockTranslator.cs +++ b/Filtration.Tests/Translators/TestItemFilterBlockTranslator.cs @@ -506,6 +506,7 @@ namespace Filtration.Tests.Translators t => t.AddComponent(ThemeComponentType.TextColor, "Rare Item Text", new Color {A = 255, R = 255, G = 20, B = 100})).Returns(testComponent).Verifiable(); + _testUtility.MockThemeComponentListBuilder.SetupGet(t => t.IsInitialised).Returns(true); // Act var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString); @@ -1460,6 +1461,23 @@ namespace Filtration.Tests.Translators Assert.AreEqual(0, testInputBlockItems.Count(b => b is BorderColorBlockItem)); } + [Test] + public void ReplaceColorBlockItemsFromString_ThemeComponentBuilderNotInitialised_DoesNotCallAddComponent() + { + // Arrange + var testInputString = "SetTextColor 240 200 150 # Rarest Currency"; + + var testInputBlockItems = new ObservableCollection(); + var testInputBlockItem = new TextColorBlockItem(Colors.Red); + testInputBlockItems.Add(testInputBlockItem); + _testUtility.MockThemeComponentListBuilder.Setup(t => t.AddComponent(It.IsAny(), It.IsAny(), It.IsAny())).Verifiable(); + + // Act + _testUtility.Translator.ReplaceColorBlockItemsFromString(testInputBlockItems, testInputString); + + // Assert + _testUtility.MockThemeComponentListBuilder.Verify(t => t.AddComponent(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + } private class ItemFilterBlockTranslatorTestUtility { public ItemFilterBlockTranslatorTestUtility() diff --git a/Filtration.Tests/Translators/TestThemeComponentListBuilder.cs b/Filtration.Tests/Translators/TestThemeComponentListBuilder.cs index f466143..4328adb 100644 --- a/Filtration.Tests/Translators/TestThemeComponentListBuilder.cs +++ b/Filtration.Tests/Translators/TestThemeComponentListBuilder.cs @@ -20,6 +20,7 @@ namespace Filtration.Tests.Translators var testInputColor = new Color(); var builder = new ThemeComponentListBuilder(); + builder.Initialise(); // Act var firstResult = builder.AddComponent(testInputTargetType, testInputComponentName, testInputColor); @@ -28,5 +29,32 @@ namespace Filtration.Tests.Translators // Assert Assert.AreSame(firstResult, secondResult); } + + [Test] + public void IsInitialised_NotInitialised_ReturnsFalse() + { + // Arrange + var builder = new ThemeComponentListBuilder(); + + // Act + var result = builder.IsInitialised; + + // Assert + Assert.IsFalse(result); + } + + [Test] + public void IsInitialised_Initialised_ReturnsTrue() + { + // Arrange + var builder = new ThemeComponentListBuilder(); + builder.Initialise(); + + // Act + var result = builder.IsInitialised; + + // Assert + Assert.IsTrue(result); + } } } diff --git a/Filtration/App.xaml.cs b/Filtration/App.xaml.cs index 243ac5c..fff22e5 100644 --- a/Filtration/App.xaml.cs +++ b/Filtration/App.xaml.cs @@ -71,7 +71,6 @@ namespace Filtration public void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) { _logger.Fatal(e.Exception); - var exception = e.Exception.Message + Environment.NewLine + e.Exception.StackTrace; var innerException = e.Exception.InnerException != null ? e.Exception.InnerException.Message + Environment.NewLine + diff --git a/Filtration/Translators/ItemFilterBlockTranslator.cs b/Filtration/Translators/ItemFilterBlockTranslator.cs index 6169dec..15e699b 100644 --- a/Filtration/Translators/ItemFilterBlockTranslator.cs +++ b/Filtration/Translators/ItemFilterBlockTranslator.cs @@ -293,14 +293,17 @@ namespace Filtration.Translators { throw new Exception("Parsing error - unknown theme component type"); } - - blockItem.ThemeComponent = _themeComponentListBuilder.AddComponent(componentType, componentName, blockItem.Color); + if (_themeComponentListBuilder.IsInitialised) + { + blockItem.ThemeComponent = _themeComponentListBuilder.AddComponent(componentType, componentName, + blockItem.Color); + } } return blockItem; } - public void ReplaceColorBlockItemsFromString(ObservableCollection blockItems , string inputString) + public void ReplaceColorBlockItemsFromString(ObservableCollection blockItems, string inputString) { // Reverse iterate to remove existing IAudioVisualBlockItems for (var idx = blockItems.Count - 1; idx >= 0; idx--) @@ -342,26 +345,7 @@ namespace Filtration.Translators } } } - - private void ReplaceColorBlockItem(ObservableCollection blockItems, string inputString) where T : ColorBlockItem - { - var newBlockItem = GetColorBlockItemFromString(inputString); - var existingBlockItem = blockItems.OfType().FirstOrDefault(); - blockItems.Remove(existingBlockItem); - blockItems.Add(newBlockItem); - } - - private void ReplaceFontSizeBlockItem(ObservableCollection blockItems, string inputString) - { - var match = Regex.Match(inputString, @"\s+(\d+)"); - if (!match.Success) return; - - var newBlockItem = new FontSizeBlockItem(Convert.ToInt16(match.Value)); - var existingBlockItem = blockItems.OfType().FirstOrDefault(); - blockItems.Remove(existingBlockItem); - blockItems.Add(newBlockItem); - } - + private void AddBlockGroupToBlock(ItemFilterBlock block, string inputString) { var blockGroupStart = inputString.IndexOf("#", StringComparison.Ordinal); diff --git a/Filtration/Translators/ThemeComponentListBuilder.cs b/Filtration/Translators/ThemeComponentListBuilder.cs index 79a46af..42ce942 100644 --- a/Filtration/Translators/ThemeComponentListBuilder.cs +++ b/Filtration/Translators/ThemeComponentListBuilder.cs @@ -10,6 +10,8 @@ namespace Filtration.Translators internal interface IThemeComponentListBuilder { void Initialise(); + void Initialise(List themeComponents); + bool IsInitialised { get; } ThemeComponent AddComponent(ThemeComponentType componentType, string componentName, Color componentColor); List GetComponents(); void Cleanup(); @@ -21,7 +23,14 @@ namespace Filtration.Translators public ThemeComponentListBuilder() { - _themeComponents = new List(); + } + + public bool IsInitialised + { + get + { + return _themeComponents != null; + } } public void Initialise() @@ -29,6 +38,11 @@ namespace Filtration.Translators _themeComponents = new List(); } + public void Initialise(List themeComponents) + { + _themeComponents = themeComponents; + } + public void Cleanup() { _themeComponents = null; diff --git a/Filtration/ViewModels/ItemFilterScriptViewModel.cs b/Filtration/ViewModels/ItemFilterScriptViewModel.cs index cabfbb8..85325f3 100644 --- a/Filtration/ViewModels/ItemFilterScriptViewModel.cs +++ b/Filtration/ViewModels/ItemFilterScriptViewModel.cs @@ -533,29 +533,38 @@ namespace Filtration.ViewModels public void PasteBlock(IItemFilterBlockViewModel targetBlockViewModel) { - var clipboardText = Clipboard.GetText(); - if (clipboardText.IsNullOrEmpty()) return; - - var translatedBlock = _blockTranslator.TranslateStringToItemFilterBlock(clipboardText); - if (translatedBlock == null) return; - - var vm = _itemFilterBlockViewModelFactory.Create(); - vm.Initialise(translatedBlock, this); - - if (ItemFilterBlockViewModels.Count > 0) + try { - Script.ItemFilterBlocks.Insert(Script.ItemFilterBlocks.IndexOf(targetBlockViewModel.Block) + 1, translatedBlock); - ItemFilterBlockViewModels.Insert(ItemFilterBlockViewModels.IndexOf(targetBlockViewModel) + 1, vm); + var clipboardText = Clipboard.GetText(); + if (clipboardText.IsNullOrEmpty()) return; + + var translatedBlock = _blockTranslator.TranslateStringToItemFilterBlock(clipboardText); + if (translatedBlock == null) return; + + var vm = _itemFilterBlockViewModelFactory.Create(); + vm.Initialise(translatedBlock, this); + + if (ItemFilterBlockViewModels.Count > 0) + { + Script.ItemFilterBlocks.Insert(Script.ItemFilterBlocks.IndexOf(targetBlockViewModel.Block) + 1, + translatedBlock); + ItemFilterBlockViewModels.Insert(ItemFilterBlockViewModels.IndexOf(targetBlockViewModel) + 1, vm); + } + else + { + Script.ItemFilterBlocks.Add(translatedBlock); + ItemFilterBlockViewModels.Add(vm); + } + + SelectedBlockViewModel = vm; + IsDirty = true; } - else + catch (Exception e) { - Script.ItemFilterBlocks.Add(translatedBlock); - ItemFilterBlockViewModels.Add(vm); + _logger.Error(e); + MessageBox.Show(e.Message + Environment.NewLine + e.StackTrace + Environment.NewLine + + e.InnerException.Message + Environment.NewLine + e.InnerException.StackTrace, "Paste Error", MessageBoxButton.OK); } - - SelectedBlockViewModel = vm; - IsDirty = true; - } private void OnMoveBlockToTopCommand()