|
|
|
@ -1,4 +1,4 @@ |
|
|
|
using System.Globalization; |
|
|
|
using System; |
|
|
|
using Avalonia.Utilities; |
|
|
|
using Xunit; |
|
|
|
|
|
|
|
@ -7,13 +7,29 @@ namespace Avalonia.Visuals.UnitTests.Media |
|
|
|
public class MatrixTests |
|
|
|
{ |
|
|
|
[Fact] |
|
|
|
public void Parse_Parses() |
|
|
|
public void Can_Parse() |
|
|
|
{ |
|
|
|
var matrix = Matrix.Parse("1,2,3,-4,5 6"); |
|
|
|
var expected = new Matrix(1, 2, 3, -4, 5, 6); |
|
|
|
Assert.Equal(expected, matrix); |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Singular_Has_No_Inverse() |
|
|
|
{ |
|
|
|
var matrix = new Matrix(0, 0, 0, 0, 0, 0); |
|
|
|
|
|
|
|
Assert.False(matrix.HasInverse); |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Identity_Has_Inverse() |
|
|
|
{ |
|
|
|
var matrix = Matrix.Identity; |
|
|
|
|
|
|
|
Assert.True(matrix.HasInverse); |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Can_Decompose_Translation() |
|
|
|
{ |
|
|
|
@ -26,17 +42,25 @@ namespace Avalonia.Visuals.UnitTests.Media |
|
|
|
Assert.Equal(10, decomposed.Translate.Y); |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Can_Decompose_Angle() |
|
|
|
[Theory] |
|
|
|
[InlineData(30d)] |
|
|
|
[InlineData(0d)] |
|
|
|
[InlineData(90d)] |
|
|
|
[InlineData(270d)] |
|
|
|
public void Can_Decompose_Angle(double angleDeg) |
|
|
|
{ |
|
|
|
var angleRad = MathUtilities.Deg2Rad(30); |
|
|
|
var angleRad = MathUtilities.Deg2Rad(angleDeg); |
|
|
|
|
|
|
|
var matrix = Matrix.CreateRotation(angleRad); |
|
|
|
|
|
|
|
var result = Matrix.TryDecomposeTransform(matrix, out Matrix.Decomposed decomposed); |
|
|
|
|
|
|
|
Assert.Equal(true, result); |
|
|
|
Assert.Equal(angleRad, decomposed.Angle); |
|
|
|
|
|
|
|
var expected = NormalizeAngle(angleRad); |
|
|
|
var actual = NormalizeAngle(decomposed.Angle); |
|
|
|
|
|
|
|
Assert.Equal(expected, actual, 4); |
|
|
|
} |
|
|
|
|
|
|
|
[Theory] |
|
|
|
@ -54,5 +78,22 @@ namespace Avalonia.Visuals.UnitTests.Media |
|
|
|
Assert.Equal(x, decomposed.Scale.X); |
|
|
|
Assert.Equal(y, decomposed.Scale.Y); |
|
|
|
} |
|
|
|
|
|
|
|
private static double NormalizeAngle(double rad) |
|
|
|
{ |
|
|
|
double twoPi = 2 * Math.PI; |
|
|
|
|
|
|
|
while (rad < 0) |
|
|
|
{ |
|
|
|
rad += twoPi; |
|
|
|
} |
|
|
|
|
|
|
|
while (rad > twoPi) |
|
|
|
{ |
|
|
|
rad -= twoPi; |
|
|
|
} |
|
|
|
|
|
|
|
return rad; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|