diff --git a/Tests/Perspex.SceneGraph.UnitTests/ThicknessTests.cs b/Tests/Perspex.SceneGraph.UnitTests/ThicknessTests.cs new file mode 100644 index 0000000000..2844bc007e --- /dev/null +++ b/Tests/Perspex.SceneGraph.UnitTests/ThicknessTests.cs @@ -0,0 +1,45 @@ +// ----------------------------------------------------------------------- +// +// Copyright 2015 MIT Licence. See licence.md for more information. +// +// ----------------------------------------------------------------------- + +namespace Perspex.SceneGraph.UnitTests.Media +{ + using Xunit; + + public class ThicknessTests + { + [Fact] + public void Parse_Parses_Single_Uniform_Size() + { + var result = Thickness.Parse("1.2"); + + Assert.Equal(new Thickness(1.2), result); + } + + [Fact] + public void Parse_Parses_Horizontal_Vertical() + { + var result = Thickness.Parse("1.2,3.4"); + + Assert.Equal(new Thickness(1.2, 3.4), result); + } + + [Fact] + public void Parse_Parses_Left_Top_Right_Bottom() + { + var result = Thickness.Parse("1.2, 3.4, 5, 6"); + + Assert.Equal(new Thickness(1.2, 3.4, 5, 6), result); + } + + [Fact] + public void Parse_Accepts_Spaces() + { + var result = Thickness.Parse("1.2 3.4 5 6"); + + Assert.Equal(new Thickness(1.2, 3.4, 5, 6), result); + } + } +} diff --git a/src/Markup/Perspex.Markup.Xaml/Converters/ThicknessConverter.cs b/src/Markup/Perspex.Markup.Xaml/Converters/ThicknessConverter.cs index d1fc66f16f..c37de53933 100644 --- a/src/Markup/Perspex.Markup.Xaml/Converters/ThicknessConverter.cs +++ b/src/Markup/Perspex.Markup.Xaml/Converters/ThicknessConverter.cs @@ -7,66 +7,29 @@ namespace Perspex.Markup.Xaml.Converters { using System; - using System.Collections.Generic; using System.Globalization; - using System.Linq; using OmniXaml.TypeConversion; public class ThicknessConverter : ITypeConverter { - public object ConvertFrom(IXamlTypeConverterContext context, CultureInfo culture, object value) + public bool CanConvertFrom(IXamlTypeConverterContext context, Type sourceType) { - var s = value as string; - if (s != null) - { - return ConvertFromString(s); - } - - return null; + return sourceType == typeof(string); } - private static Thickness ConvertFromString(string s) + public bool CanConvertTo(IXamlTypeConverterContext context, Type destinationType) { - var parts = s.Split(',', ' '); - - switch (parts.Length) - { - case 1: - var uniform = double.Parse(parts[0]); - return new Thickness(uniform); - case 2: - var horizontal = double.Parse(parts[0]); - var vertical = double.Parse(parts[1]); - return new Thickness(horizontal, vertical); - case 4: - var left = double.Parse(parts[0]); - var top = double.Parse(parts[1]); - var right = double.Parse(parts[2]); - var bottom = double.Parse(parts[3]); - return new Thickness(left, top, right, bottom); - } - - throw new InvalidOperationException("Invalid Thickness."); + return false; } - public object ConvertTo(IXamlTypeConverterContext context, CultureInfo culture, object value, Type destinationType) + public object ConvertFrom(IXamlTypeConverterContext context, CultureInfo culture, object value) { - throw new System.NotImplementedException(); + return Thickness.Parse((string)value); } - public bool CanConvertTo(IXamlTypeConverterContext context, Type destinationType) + public object ConvertTo(IXamlTypeConverterContext context, CultureInfo culture, object value, Type destinationType) { throw new NotImplementedException(); } - - public bool CanConvertFrom(IXamlTypeConverterContext context, Type sourceType) - { - if (sourceType == typeof(string)) - { - return true; - } - - return false; - } } } \ No newline at end of file diff --git a/src/Perspex.SceneGraph/Thickness.cs b/src/Perspex.SceneGraph/Thickness.cs index 7673c239e8..e890092ef4 100644 --- a/src/Perspex.SceneGraph/Thickness.cs +++ b/src/Perspex.SceneGraph/Thickness.cs @@ -7,6 +7,7 @@ namespace Perspex { using System; + using System.Linq; /// /// Describes the thickness of a frame around a rectangle. @@ -155,6 +156,37 @@ namespace Perspex a.Bottom + b.Bottom); } + /// + /// Parses a string. + /// + /// The string. + /// The . + public static Thickness Parse(string s) + { + var parts = s.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries) + .Select(x => x.Trim()) + .ToList(); + + switch (parts.Count) + { + case 1: + var uniform = double.Parse(parts[0]); + return new Thickness(uniform); + case 2: + var horizontal = double.Parse(parts[0]); + var vertical = double.Parse(parts[1]); + return new Thickness(horizontal, vertical); + case 4: + var left = double.Parse(parts[0]); + var top = double.Parse(parts[1]); + var right = double.Parse(parts[2]); + var bottom = double.Parse(parts[3]); + return new Thickness(left, top, right, bottom); + } + + throw new FormatException("Invalid Thickness."); + } + /// /// Checks for equality between a thickness and an object. /// diff --git a/tests/Perspex.SceneGraph.UnitTests/Perspex.SceneGraph.UnitTests.csproj b/tests/Perspex.SceneGraph.UnitTests/Perspex.SceneGraph.UnitTests.csproj index ff8383a1b0..818af19064 100644 --- a/tests/Perspex.SceneGraph.UnitTests/Perspex.SceneGraph.UnitTests.csproj +++ b/tests/Perspex.SceneGraph.UnitTests/Perspex.SceneGraph.UnitTests.csproj @@ -80,6 +80,7 @@ +