Browse Source

Move Thickness parsing to Thickness.Parse.

And added unit tests.
pull/114/head
Steven Kirk 11 years ago
parent
commit
ab352ebfcb
  1. 45
      Tests/Perspex.SceneGraph.UnitTests/ThicknessTests.cs
  2. 51
      src/Markup/Perspex.Markup.Xaml/Converters/ThicknessConverter.cs
  3. 32
      src/Perspex.SceneGraph/Thickness.cs
  4. 1
      tests/Perspex.SceneGraph.UnitTests/Perspex.SceneGraph.UnitTests.csproj

45
Tests/Perspex.SceneGraph.UnitTests/ThicknessTests.cs

@ -0,0 +1,45 @@
// -----------------------------------------------------------------------
// <copyright file="ThicknessTests.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
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);
}
}
}

51
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;
}
}
}

32
src/Perspex.SceneGraph/Thickness.cs

@ -7,6 +7,7 @@
namespace Perspex
{
using System;
using System.Linq;
/// <summary>
/// Describes the thickness of a frame around a rectangle.
@ -155,6 +156,37 @@ namespace Perspex
a.Bottom + b.Bottom);
}
/// <summary>
/// Parses a <see cref="Thickness"/> string.
/// </summary>
/// <param name="s">The string.</param>
/// <returns>The <see cref="Thickness"/>.</returns>
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.");
}
/// <summary>
/// Checks for equality between a thickness and an object.
/// </summary>

1
tests/Perspex.SceneGraph.UnitTests/Perspex.SceneGraph.UnitTests.csproj

@ -80,6 +80,7 @@
<Otherwise />
</Choose>
<ItemGroup>
<Compile Include="ThicknessTests.cs" />
<Compile Include="GlobalSuppressions.cs" />
<Compile Include="Media\BrushTests.cs" />
<Compile Include="Media\ColorTests.cs" />

Loading…
Cancel
Save