From 52fd4bde20dcb62d898fdd52dd791c65d9fb2cf6 Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Thu, 23 Apr 2020 13:47:03 +0300 Subject: [PATCH] tmp: improve points parser issue:3813 pr:3814 merged --- .../Converters/PointsListTypeConverter.cs | 10 ++--- .../PointsListTypeConverterTests.cs | 44 +++++++++++++++++++ 2 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 tests/Avalonia.Markup.Xaml.UnitTests/Converters/PointsListTypeConverterTests.cs diff --git a/src/Markup/Avalonia.Markup.Xaml/Converters/PointsListTypeConverter.cs b/src/Markup/Avalonia.Markup.Xaml/Converters/PointsListTypeConverter.cs index 29c7dbfd39..5f6e518d8e 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Converters/PointsListTypeConverter.cs +++ b/src/Markup/Avalonia.Markup.Xaml/Converters/PointsListTypeConverter.cs @@ -7,7 +7,7 @@ using System.Globalization; namespace Avalonia.Markup.Xaml.Converters { - using System.ComponentModel; + using System.ComponentModel; public class PointsListTypeConverter : TypeConverter { @@ -19,11 +19,11 @@ namespace Avalonia.Markup.Xaml.Converters public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { string strValue = (string)value; - string[] pointStrs = strValue.Split(new[] { ' ', '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); - var result = new List(pointStrs.Length); - foreach (var pointStr in pointStrs) + string[] pointStrs = strValue.Split(new[] { ' ', '\t', '\r', '\n', ',' }, StringSplitOptions.RemoveEmptyEntries); + var result = new List(pointStrs.Length / 2); + for (int i = 0; i < pointStrs.Length; i += 2) { - result.Add(Point.Parse(pointStr)); + result.Add(Point.Parse($"{pointStrs[i]} {pointStrs[i + 1]}")); } return result; diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Converters/PointsListTypeConverterTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Converters/PointsListTypeConverterTests.cs new file mode 100644 index 0000000000..b060905f38 --- /dev/null +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Converters/PointsListTypeConverterTests.cs @@ -0,0 +1,44 @@ +using System.Collections.Generic; +using Avalonia.Controls.Shapes; +using Avalonia.Markup.Xaml.Converters; +using Xunit; + +namespace Avalonia.Markup.Xaml.UnitTests.Converters +{ + public class PointsListTypeConverterTests + { + [Theory] + [InlineData("1,2 3,4")] + [InlineData("1 2 3 4")] + [InlineData("1 2,3 4")] + [InlineData("1,2,3,4")] + public void TypeConverter_Should_Parse(string input) + { + var conv = new PointsListTypeConverter(); + + var points = (IList)conv.ConvertFrom(input); + + Assert.Equal(2, points.Count); + Assert.Equal(new Point(1, 2), points[0]); + Assert.Equal(new Point(3, 4), points[1]); + } + + [Theory] + [InlineData("1,2 3,4")] + [InlineData("1 2 3 4")] + [InlineData("1 2,3 4")] + [InlineData("1,2,3,4")] + public void Should_Parse_Points_in_Xaml(string input) + { + var xaml = $""; + var loader = new AvaloniaXamlLoader(); + var polygon = (Polygon)loader.Load(xaml); + + var points = polygon.Points; + + Assert.Equal(2, points.Count); + Assert.Equal(new Point(1, 2), points[0]); + Assert.Equal(new Point(3, 4), points[1]); + } + } +}