Fixed copy paste crashes
This commit is contained in:
parent
3a60a5005b
commit
0c470b3c97
|
@ -18,7 +18,8 @@ namespace Filtration.Tests.Services
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var testInputData = @"<UpdateData>
|
var testInputData = @"<UpdateData>
|
||||||
<CurrentVersion>0.2</CurrentVersion>
|
<LatestVersionMajorPart>1</LatestVersionMajorPart>
|
||||||
|
<LatestVersionMinorPart>3</LatestVersionMinorPart>
|
||||||
<ReleaseDate>2015-07-01</ReleaseDate>
|
<ReleaseDate>2015-07-01</ReleaseDate>
|
||||||
<DownloadUrl>http://www.google.com</DownloadUrl>
|
<DownloadUrl>http://www.google.com</DownloadUrl>
|
||||||
<ReleaseNotes>* Release notes line 1
|
<ReleaseNotes>* Release notes line 1
|
||||||
|
@ -28,7 +29,8 @@ namespace Filtration.Tests.Services
|
||||||
|
|
||||||
var expectedResult = new UpdateData
|
var expectedResult = new UpdateData
|
||||||
{
|
{
|
||||||
CurrentVersion = 0.2m,
|
LatestVersionMajorPart = 1,
|
||||||
|
LatestVersionMinorPart = 3,
|
||||||
DownloadUrl = "http://www.google.com",
|
DownloadUrl = "http://www.google.com",
|
||||||
ReleaseDate = new DateTime(2015, 7, 1),
|
ReleaseDate = new DateTime(2015, 7, 1),
|
||||||
ReleaseNotes = @"* Release notes line 1
|
ReleaseNotes = @"* Release notes line 1
|
||||||
|
@ -43,7 +45,8 @@ namespace Filtration.Tests.Services
|
||||||
var result = service.DeserializeUpdateData(testInputData);
|
var result = service.DeserializeUpdateData(testInputData);
|
||||||
|
|
||||||
// Assert
|
// 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.DownloadUrl, result.DownloadUrl);
|
||||||
Assert.AreEqual(expectedResult.ReleaseDate, result.ReleaseDate);
|
Assert.AreEqual(expectedResult.ReleaseDate, result.ReleaseDate);
|
||||||
Assert.AreEqual(expectedResult.ReleaseNotes, result.ReleaseNotes);
|
Assert.AreEqual(expectedResult.ReleaseNotes, result.ReleaseNotes);
|
||||||
|
|
|
@ -506,6 +506,7 @@ namespace Filtration.Tests.Translators
|
||||||
t =>
|
t =>
|
||||||
t.AddComponent(ThemeComponentType.TextColor, "Rare Item Text",
|
t.AddComponent(ThemeComponentType.TextColor, "Rare Item Text",
|
||||||
new Color {A = 255, R = 255, G = 20, B = 100})).Returns(testComponent).Verifiable();
|
new Color {A = 255, R = 255, G = 20, B = 100})).Returns(testComponent).Verifiable();
|
||||||
|
_testUtility.MockThemeComponentListBuilder.SetupGet(t => t.IsInitialised).Returns(true);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString);
|
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString);
|
||||||
|
@ -1460,6 +1461,23 @@ namespace Filtration.Tests.Translators
|
||||||
Assert.AreEqual(0, testInputBlockItems.Count(b => b is BorderColorBlockItem));
|
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<IItemFilterBlockItem>();
|
||||||
|
var testInputBlockItem = new TextColorBlockItem(Colors.Red);
|
||||||
|
testInputBlockItems.Add(testInputBlockItem);
|
||||||
|
_testUtility.MockThemeComponentListBuilder.Setup(t => t.AddComponent(It.IsAny<ThemeComponentType>(), It.IsAny<string>(), It.IsAny<Color>())).Verifiable();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
_testUtility.Translator.ReplaceColorBlockItemsFromString(testInputBlockItems, testInputString);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
_testUtility.MockThemeComponentListBuilder.Verify(t => t.AddComponent(It.IsAny<ThemeComponentType>(), It.IsAny<string>(), It.IsAny<Color>()), Times.Never);
|
||||||
|
}
|
||||||
private class ItemFilterBlockTranslatorTestUtility
|
private class ItemFilterBlockTranslatorTestUtility
|
||||||
{
|
{
|
||||||
public ItemFilterBlockTranslatorTestUtility()
|
public ItemFilterBlockTranslatorTestUtility()
|
||||||
|
|
|
@ -20,6 +20,7 @@ namespace Filtration.Tests.Translators
|
||||||
var testInputColor = new Color();
|
var testInputColor = new Color();
|
||||||
|
|
||||||
var builder = new ThemeComponentListBuilder();
|
var builder = new ThemeComponentListBuilder();
|
||||||
|
builder.Initialise();
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var firstResult = builder.AddComponent(testInputTargetType, testInputComponentName, testInputColor);
|
var firstResult = builder.AddComponent(testInputTargetType, testInputComponentName, testInputColor);
|
||||||
|
@ -28,5 +29,32 @@ namespace Filtration.Tests.Translators
|
||||||
// Assert
|
// Assert
|
||||||
Assert.AreSame(firstResult, secondResult);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,7 +71,6 @@ namespace Filtration
|
||||||
public void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
|
public void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
|
||||||
{
|
{
|
||||||
_logger.Fatal(e.Exception);
|
_logger.Fatal(e.Exception);
|
||||||
|
|
||||||
var exception = e.Exception.Message + Environment.NewLine + e.Exception.StackTrace;
|
var exception = e.Exception.Message + Environment.NewLine + e.Exception.StackTrace;
|
||||||
var innerException = e.Exception.InnerException != null
|
var innerException = e.Exception.InnerException != null
|
||||||
? e.Exception.InnerException.Message + Environment.NewLine +
|
? e.Exception.InnerException.Message + Environment.NewLine +
|
||||||
|
|
|
@ -293,14 +293,17 @@ namespace Filtration.Translators
|
||||||
{
|
{
|
||||||
throw new Exception("Parsing error - unknown theme component type");
|
throw new Exception("Parsing error - unknown theme component type");
|
||||||
}
|
}
|
||||||
|
if (_themeComponentListBuilder.IsInitialised)
|
||||||
blockItem.ThemeComponent = _themeComponentListBuilder.AddComponent(componentType, componentName, blockItem.Color);
|
{
|
||||||
|
blockItem.ThemeComponent = _themeComponentListBuilder.AddComponent(componentType, componentName,
|
||||||
|
blockItem.Color);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return blockItem;
|
return blockItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ReplaceColorBlockItemsFromString(ObservableCollection<IItemFilterBlockItem> blockItems , string inputString)
|
public void ReplaceColorBlockItemsFromString(ObservableCollection<IItemFilterBlockItem> blockItems, string inputString)
|
||||||
{
|
{
|
||||||
// Reverse iterate to remove existing IAudioVisualBlockItems
|
// Reverse iterate to remove existing IAudioVisualBlockItems
|
||||||
for (var idx = blockItems.Count - 1; idx >= 0; idx--)
|
for (var idx = blockItems.Count - 1; idx >= 0; idx--)
|
||||||
|
@ -342,26 +345,7 @@ namespace Filtration.Translators
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ReplaceColorBlockItem<T>(ObservableCollection<IItemFilterBlockItem> blockItems, string inputString) where T : ColorBlockItem
|
|
||||||
{
|
|
||||||
var newBlockItem = GetColorBlockItemFromString<T>(inputString);
|
|
||||||
var existingBlockItem = blockItems.OfType<T>().FirstOrDefault();
|
|
||||||
blockItems.Remove(existingBlockItem);
|
|
||||||
blockItems.Add(newBlockItem);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ReplaceFontSizeBlockItem(ObservableCollection<IItemFilterBlockItem> 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<FontSizeBlockItem>().FirstOrDefault();
|
|
||||||
blockItems.Remove(existingBlockItem);
|
|
||||||
blockItems.Add(newBlockItem);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void AddBlockGroupToBlock(ItemFilterBlock block, string inputString)
|
private void AddBlockGroupToBlock(ItemFilterBlock block, string inputString)
|
||||||
{
|
{
|
||||||
var blockGroupStart = inputString.IndexOf("#", StringComparison.Ordinal);
|
var blockGroupStart = inputString.IndexOf("#", StringComparison.Ordinal);
|
||||||
|
|
|
@ -10,6 +10,8 @@ namespace Filtration.Translators
|
||||||
internal interface IThemeComponentListBuilder
|
internal interface IThemeComponentListBuilder
|
||||||
{
|
{
|
||||||
void Initialise();
|
void Initialise();
|
||||||
|
void Initialise(List<ThemeComponent> themeComponents);
|
||||||
|
bool IsInitialised { get; }
|
||||||
ThemeComponent AddComponent(ThemeComponentType componentType, string componentName, Color componentColor);
|
ThemeComponent AddComponent(ThemeComponentType componentType, string componentName, Color componentColor);
|
||||||
List<ThemeComponent> GetComponents();
|
List<ThemeComponent> GetComponents();
|
||||||
void Cleanup();
|
void Cleanup();
|
||||||
|
@ -21,7 +23,14 @@ namespace Filtration.Translators
|
||||||
|
|
||||||
public ThemeComponentListBuilder()
|
public ThemeComponentListBuilder()
|
||||||
{
|
{
|
||||||
_themeComponents = new List<ThemeComponent>();
|
}
|
||||||
|
|
||||||
|
public bool IsInitialised
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _themeComponents != null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Initialise()
|
public void Initialise()
|
||||||
|
@ -29,6 +38,11 @@ namespace Filtration.Translators
|
||||||
_themeComponents = new List<ThemeComponent>();
|
_themeComponents = new List<ThemeComponent>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Initialise(List<ThemeComponent> themeComponents)
|
||||||
|
{
|
||||||
|
_themeComponents = themeComponents;
|
||||||
|
}
|
||||||
|
|
||||||
public void Cleanup()
|
public void Cleanup()
|
||||||
{
|
{
|
||||||
_themeComponents = null;
|
_themeComponents = null;
|
||||||
|
|
|
@ -533,29 +533,38 @@ namespace Filtration.ViewModels
|
||||||
|
|
||||||
public void PasteBlock(IItemFilterBlockViewModel targetBlockViewModel)
|
public void PasteBlock(IItemFilterBlockViewModel targetBlockViewModel)
|
||||||
{
|
{
|
||||||
var clipboardText = Clipboard.GetText();
|
try
|
||||||
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);
|
var clipboardText = Clipboard.GetText();
|
||||||
ItemFilterBlockViewModels.Insert(ItemFilterBlockViewModels.IndexOf(targetBlockViewModel) + 1, vm);
|
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);
|
_logger.Error(e);
|
||||||
ItemFilterBlockViewModels.Add(vm);
|
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()
|
private void OnMoveBlockToTopCommand()
|
||||||
|
|
Loading…
Reference in New Issue