using System; using Avalonia.Animation; using Avalonia.Animation.Easings; using Avalonia.Controls.Shapes; using Avalonia.Media; using Avalonia.Styling; using Xunit; namespace Avalonia.Base.UnitTests.Animation { public class KeySplineTests { [Theory] [InlineData("1,2 3,4")] [InlineData("1 2 3 4")] [InlineData("1 2,3 4")] [InlineData("1,2,3,4")] public void Can_Parse_KeySpline_Via_TypeConverter(string input) { var conv = new KeySplineTypeConverter(); var keySpline = (KeySpline)conv.ConvertFrom(input); Assert.NotNull(keySpline); Assert.Equal(1, keySpline.ControlPointX1); Assert.Equal(2, keySpline.ControlPointY1); Assert.Equal(3, keySpline.ControlPointX2); Assert.Equal(4, keySpline.ControlPointY2); } [Theory] [InlineData("1,2F,3,4")] [InlineData("Foo,Bar,Fee,Buzz")] public void Can_Handle_Invalid_String_KeySpline_Via_TypeConverter(string input) { var conv = new KeySplineTypeConverter(); Assert.ThrowsAny(() => (KeySpline)conv.ConvertFrom(input)); } [Theory] [InlineData(0.00)] [InlineData(0.50)] [InlineData(1.00)] public void KeySpline_X_Values_In_Range_Do_Not_Throw(double input) { var keySpline = new KeySpline(); keySpline.ControlPointX1 = input; // no exception will be thrown -- test will fail if exception thrown keySpline.ControlPointX2 = input; // no exception will be thrown -- test will fail if exception thrown } [Theory] [InlineData(-0.01)] [InlineData(1.01)] public void KeySpline_X_Values_Cannot_Be_Out_Of_Range(double input) { var keySpline = new KeySpline(); Assert.Throws(() => keySpline.ControlPointX1 = input); Assert.Throws(() => keySpline.ControlPointX2 = input); } [Fact] public void SplineEasing_Can_Be_Mutated() { var easing = new SplineEasing(); Assert.Equal(0, easing.Ease(0)); Assert.Equal(1, easing.Ease(1)); easing.X1 = 0.25; easing.Y1 = 0.5; easing.X2 = 0.75; easing.Y2 = 1.0; Assert.NotEqual(0.5, easing.Ease(0.5)); } /* To get the test values for the KeySpline test, you can: 1) Grab the WPF sample for KeySpline animations from https://github.com/microsoft/WPF-Samples/tree/master/Animation/KeySplineAnimations 2) Add the following xaml somewhere: