Browse Source

Merge pull request #3814 from donandren/issues/3813

Improve points parsing
pull/3837/head
Benedikt Stebner 6 years ago
committed by GitHub
parent
commit
cd623bdff3
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 17
      src/Markup/Avalonia.Markup.Xaml/Converters/PointsListTypeConverter.cs
  2. 44
      tests/Avalonia.Markup.Xaml.UnitTests/Converters/PointsListTypeConverterTests.cs

17
src/Markup/Avalonia.Markup.Xaml/Converters/PointsListTypeConverter.cs

@ -4,7 +4,8 @@ using System.Globalization;
namespace Avalonia.Markup.Xaml.Converters namespace Avalonia.Markup.Xaml.Converters
{ {
using System.ComponentModel; using System.ComponentModel;
using Avalonia.Utilities;
public class PointsListTypeConverter : TypeConverter public class PointsListTypeConverter : TypeConverter
{ {
@ -15,15 +16,17 @@ namespace Avalonia.Markup.Xaml.Converters
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{ {
string strValue = (string)value; var points = new List<Point>();
string[] pointStrs = strValue.Split(new[] { ' ', '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
var result = new List<Point>(pointStrs.Length); using (var tokenizer = new StringTokenizer((string)value, CultureInfo.InvariantCulture, exceptionMessage: "Invalid PointsList."))
foreach (var pointStr in pointStrs)
{ {
result.Add(Point.Parse(pointStr)); while (tokenizer.TryReadDouble(out double x))
{
points.Add(new Point(x, tokenizer.ReadDouble()));
}
} }
return result; return points;
} }
} }
} }

44
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<Point>)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 = $"<Polygon xmlns='https://github.com/avaloniaui' Points='{input}' />";
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]);
}
}
}
Loading…
Cancel
Save