Skip to content

Commit

Permalink
Merge pull request #12214 from Youssef1313/align-easing
Browse files Browse the repository at this point in the history
fix!: Align `EasingFunctionBase` with WinUI
  • Loading branch information
jeromelaban authored May 15, 2023
2 parents f0f6a30 + 8fe2c36 commit 34c8d64
Show file tree
Hide file tree
Showing 23 changed files with 452 additions and 513 deletions.
7 changes: 7 additions & 0 deletions build/PackageDiffIgnore.xml
Original file line number Diff line number Diff line change
Expand Up @@ -749,6 +749,8 @@
<Member fullName="System.Double Windows.UI.Xaml.Media.Animation.RepeatBehavior::Count()" reason="Api alignments" />
<Member fullName="System.TimeSpan Windows.UI.Xaml.Media.Animation.RepeatBehavior::Duration()" reason="Api alignments" />
<Member fullName="Windows.UI.Xaml.Media.Animation.RepeatBehaviorType Windows.UI.Xaml.Media.Animation.RepeatBehavior::Type()" reason="Api alignments" />

<Member fullName="System.Int32 Windows.UI.Xaml.Media.Animation.PowerEase::Power()" reason="Api alignments" />
<Member fullName="System.Func`2&lt;System.String,System.String&gt; Windows.ApplicationModel.Resources.ResourceLoader::GetStringInternal()" reason="Api alignments" />

<!-- BEGIN WebView -->
Expand Down Expand Up @@ -1367,6 +1369,11 @@
<Member fullName="System.Void Windows.Devices.Sensors.SimpleOrientationSensor.OnAccuracyChanged(Android.Hardware.Sensor sensor, Android.Hardware.SensorStatus accuracy)" reason="Api alignments" />
<Member fullName="System.Void Windows.Devices.Sensors.SimpleOrientationSensor.OnSensorChanged(Android.Hardware.SensorEvent e)" reason="Api alignments" />

<Member fullName="System.Void Windows.UI.Xaml.Media.Animation.EasingFunctionBase..ctor()" reason="API Alignment" />
<Member fullName="System.Double Windows.UI.Xaml.Media.Animation.EasingFunctionBase.Ease(System.Double currentTime, System.Double startValue, System.Double finalValue, System.Double duration)" reason="API Alignment" />
<Member fullName="System.Int32 Windows.UI.Xaml.Media.Animation.PowerEase.get_Power()" reason="API Alignment" />
<Member fullName="System.Void Windows.UI.Xaml.Media.Animation.PowerEase.set_Power(System.Int32 value)" reason="API Alignment" />

<!-- BEGIN Skia Adjustments -->
<Member fullName="System.Void Uno.UI.Runtime.Skia.GtkHost..ctor(System.Func`1&lt;Windows.UI.Xaml.Application&gt; appBuilder, System.String[] args)" reason="API Alignment" />
<Member fullName="System.Void Uno.UI.Runtime.Skia.FrameBufferHost..ctor(System.Func`1&lt;Windows.UI.Xaml.Application&gt; appBuilder, System.String[] args)" reason="API Alignment" />
Expand Down

This file was deleted.

252 changes: 252 additions & 0 deletions src/Uno.UI.Tests/Windows_UI_Xaml_Media_Animation/Given_Ease.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,252 @@
using Windows.UI.Xaml.Media.Animation;
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Uno.UI.Tests.Windows_UI_Xaml_Media_Animation
{
/*
Tests were generated by running code similar to this on UWP:
var ease = new SineEase();
double start = 100;
double end = 200;
for (double i = 0; i <= 1.1; i += 0.2)
{
var value = start + ease.Ease(i) * (end - start);
Debug.WriteLine($@"AssertEase(sut, normalizedTime: {i}, expectedValue: {value}, testInfo);");
}
*/
[TestClass]
public class Given_Ease
{
private readonly record struct TestInfo(double StartValue, double FinalValue);

private void AssertEase(IEasingFunction easingFunction, double normalizedTime, double expectedValue, TestInfo testInfo)
{
var actual = easingFunction.Ease(normalizedTime, testInfo.StartValue, testInfo.FinalValue, duration: 1.0);
actual.Should().BeApproximately(expectedValue, 0.1);
}

[TestMethod]
public void When_BounceEase_FinalValueGreaterThanInitial()
{
var sut = new BounceEase();
var testInfo = new TestInfo(100, 200);
AssertEase(sut, normalizedTime: 0, expectedValue: 100, testInfo);
AssertEase(sut, normalizedTime: 0.2, expectedValue: 130.24999499321, testInfo);
AssertEase(sut, normalizedTime: 0.4, expectedValue: 182.000029087067, testInfo);
AssertEase(sut, normalizedTime: 0.6, expectedValue: 154.50000166893, testInfo);
AssertEase(sut, normalizedTime: 0.8, expectedValue: 175.999999046326, testInfo);
AssertEase(sut, normalizedTime: 1, expectedValue: 200, testInfo);
}

[TestMethod]
public void When_BounceEase_FinalValueLowerThanInitial()
{
var sut = new BounceEase();
var testInfo = new TestInfo(200, 100);
AssertEase(sut, normalizedTime: 0, expectedValue: 200, testInfo);
AssertEase(sut, normalizedTime: 0.2, expectedValue: 169.75000500679, testInfo);
AssertEase(sut, normalizedTime: 0.4, expectedValue: 117.999970912933, testInfo);
AssertEase(sut, normalizedTime: 0.6, expectedValue: 145.49999833107, testInfo);
AssertEase(sut, normalizedTime: 0.8, expectedValue: 124.000000953674, testInfo);
AssertEase(sut, normalizedTime: 1, expectedValue: 100, testInfo);
}

[TestMethod]
public void When_BackEase_Amplitude_1()
{
var sut = new BackEase();
var testInfo = new TestInfo(100, 200);
sut.Amplitude.Should().Be(1.0);
AssertEase(sut, normalizedTime: 0, expectedValue: 99.999988079071, testInfo);
AssertEase(sut, normalizedTime: 0.2, expectedValue: 195.822811126709, testInfo);
AssertEase(sut, normalizedTime: 0.4, expectedValue: 235.463392734528, testInfo);
AssertEase(sut, normalizedTime: 0.6, expectedValue: 231.642258167267, testInfo);
AssertEase(sut, normalizedTime: 0.8, expectedValue: 210.955703258514, testInfo);
AssertEase(sut, normalizedTime: 1, expectedValue: 200, testInfo);
}

[TestMethod]
public void When_BackEase_Amplitude_4()
{
var sut = new BackEase() { Amplitude = 4 };
var testInfo = new TestInfo(100, 200);
AssertEase(sut, normalizedTime: 0, expectedValue: 99.9999642372131, testInfo);
AssertEase(sut, normalizedTime: 0.2, expectedValue: 336.891269683838, testInfo);
AssertEase(sut, normalizedTime: 0.4, expectedValue: 406.653571128845, testInfo);
AssertEase(sut, normalizedTime: 0.6, expectedValue: 345.769023895264, testInfo);
AssertEase(sut, normalizedTime: 0.8, expectedValue: 246.222817897797, testInfo);
AssertEase(sut, normalizedTime: 1, expectedValue: 200, testInfo);
}

[TestMethod]
public void When_CircleEase()
{
var sut = new CircleEase();
var testInfo = new TestInfo(100, 200);
AssertEase(sut, normalizedTime: 0, expectedValue: 100, testInfo);
AssertEase(sut, normalizedTime: 0.2, expectedValue: 159.999996423721, testInfo);
AssertEase(sut, normalizedTime: 0.4, expectedValue: 180.000001192093, testInfo);
AssertEase(sut, normalizedTime: 0.6, expectedValue: 191.651517152786, testInfo);
AssertEase(sut, normalizedTime: 0.8, expectedValue: 197.979587316513, testInfo);
AssertEase(sut, normalizedTime: 1, expectedValue: 200, testInfo);
}

[TestMethod]
public void When_CubicEase()
{
var sut = new CubicEase();
var testInfo = new TestInfo(100, 200);
AssertEase(sut, normalizedTime: 0, expectedValue: 100, testInfo);
AssertEase(sut, normalizedTime: 0.2, expectedValue: 148.79999756813, testInfo);
AssertEase(sut, normalizedTime: 0.4, expectedValue: 178.3999979496, testInfo);
AssertEase(sut, normalizedTime: 0.6, expectedValue: 193.599998950958, testInfo);
AssertEase(sut, normalizedTime: 0.8, expectedValue: 199.199998378754, testInfo);
AssertEase(sut, normalizedTime: 1, expectedValue: 200, testInfo);
}

[TestMethod]
public void When_ElasticEase()
{
var sut = new ElasticEase();
var testInfo = new TestInfo(100, 200);
AssertEase(sut, normalizedTime: 0, expectedValue: 100, testInfo);
AssertEase(sut, normalizedTime: 0.2, expectedValue: 230.86884021759, testInfo);
AssertEase(sut, normalizedTime: 0.4, expectedValue: 208.175933361053, testInfo);
AssertEase(sut, normalizedTime: 0.6, expectedValue: 188.438564538956, testInfo);
AssertEase(sut, normalizedTime: 0.8, expectedValue: 203.484880924225, testInfo);
AssertEase(sut, normalizedTime: 1, expectedValue: 200, testInfo);
}

[TestMethod]
public void When_ElasticEase_Oscillations_Apringiness()
{
var sut = new ElasticEase() { Oscillations = 7, Springiness = 10 };
var testInfo = new TestInfo(100, 200);
AssertEase(sut, normalizedTime: 0, expectedValue: 100, testInfo);
AssertEase(sut, normalizedTime: 0.2, expectedValue: 212.867403030396, testInfo);
AssertEase(sut, normalizedTime: 0.4, expectedValue: 198.521840572357, testInfo);
AssertEase(sut, normalizedTime: 0.6, expectedValue: 200.143039226532, testInfo);
AssertEase(sut, normalizedTime: 0.8, expectedValue: 199.991035461426, testInfo);
AssertEase(sut, normalizedTime: 1, expectedValue: 200, testInfo);
}

[TestMethod]
public void When_ExponentialEase()
{
var sut = new ExponentialEase();
var testInfo = new TestInfo(100, 200);
AssertEase(sut, normalizedTime: 0, expectedValue: 100, testInfo);
AssertEase(sut, normalizedTime: 0.2, expectedValue: 138.128066062927, testInfo);
AssertEase(sut, normalizedTime: 0.4, expectedValue: 163.686072826385, testInfo);
AssertEase(sut, normalizedTime: 0.6, expectedValue: 180.818122625351, testInfo);
AssertEase(sut, normalizedTime: 0.8, expectedValue: 192.302078008652, testInfo);
AssertEase(sut, normalizedTime: 1, expectedValue: 200, testInfo);
}

[TestMethod]
public void When_ExponentialEase_ZeroExponent()
{
var sut = new ExponentialEase() { Exponent = 0 };
var testInfo = new TestInfo(100, 200);
AssertEase(sut, normalizedTime: 0, expectedValue: 100, testInfo);
AssertEase(sut, normalizedTime: 0.2, expectedValue: 119.999998807907, testInfo);
AssertEase(sut, normalizedTime: 0.4, expectedValue: 139.999997615814, testInfo);
AssertEase(sut, normalizedTime: 0.6, expectedValue: 160.000002384186, testInfo);
AssertEase(sut, normalizedTime: 0.8, expectedValue: 180.000001192093, testInfo);
AssertEase(sut, normalizedTime: 1, expectedValue: 200, testInfo);
}

[TestMethod]
public void When_PowerEase()
{
var sut = new PowerEase();
var testInfo = new TestInfo(100, 200);
AssertEase(sut, normalizedTime: 0, expectedValue: 100, testInfo);
AssertEase(sut, normalizedTime: 0.2, expectedValue: 135.999995470047, testInfo);
AssertEase(sut, normalizedTime: 0.4, expectedValue: 163.999998569489, testInfo);
AssertEase(sut, normalizedTime: 0.6, expectedValue: 184.00000333786, testInfo);
AssertEase(sut, normalizedTime: 0.8, expectedValue: 195.999997854233, testInfo);
AssertEase(sut, normalizedTime: 1, expectedValue: 200, testInfo);
}

[TestMethod]
public void When_PowerEase_ZeroPower()
{
var sut = new PowerEase() { Power = 0 };
var testInfo = new TestInfo(100, 200);
AssertEase(sut, normalizedTime: 0, expectedValue: 100, testInfo);
AssertEase(sut, normalizedTime: 0.2, expectedValue: 100, testInfo);
AssertEase(sut, normalizedTime: 0.4, expectedValue: 100, testInfo);
AssertEase(sut, normalizedTime: 0.6, expectedValue: 100, testInfo);
AssertEase(sut, normalizedTime: 0.8, expectedValue: 100, testInfo);
AssertEase(sut, normalizedTime: 1, expectedValue: 100, testInfo);
}

[TestMethod]
public void When_PowerEase_NegativePower()
{
var sut = new PowerEase() { Power = -10.0 };
var testInfo = new TestInfo(100, 200);
AssertEase(sut, normalizedTime: 0, expectedValue: 100, testInfo);
AssertEase(sut, normalizedTime: 0.2, expectedValue: 100, testInfo);
AssertEase(sut, normalizedTime: 0.4, expectedValue: 100, testInfo);
AssertEase(sut, normalizedTime: 0.6, expectedValue: 100, testInfo);
AssertEase(sut, normalizedTime: 0.8, expectedValue: 100, testInfo);
AssertEase(sut, normalizedTime: 1, expectedValue: 100, testInfo);
}

[TestMethod]
public void When_QuadraticEase()
{
var sut = new QuadraticEase();
var testInfo = new TestInfo(100, 200);
AssertEase(sut, normalizedTime: 0, expectedValue: 100, testInfo);
AssertEase(sut, normalizedTime: 0.2, expectedValue: 135.999995470047, testInfo);
AssertEase(sut, normalizedTime: 0.4, expectedValue: 163.999998569489, testInfo);
AssertEase(sut, normalizedTime: 0.6, expectedValue: 184.00000333786, testInfo);
AssertEase(sut, normalizedTime: 0.8, expectedValue: 195.999997854233, testInfo);
AssertEase(sut, normalizedTime: 1, expectedValue: 200, testInfo);
}

[TestMethod]
public void When_QuarticEase()
{
var sut = new QuarticEase();
var testInfo = new TestInfo(100, 200);
AssertEase(sut, normalizedTime: 0, expectedValue: 100, testInfo);
AssertEase(sut, normalizedTime: 0.2, expectedValue: 159.039998054504, testInfo);
AssertEase(sut, normalizedTime: 0.4, expectedValue: 187.039995193481, testInfo);
AssertEase(sut, normalizedTime: 0.6, expectedValue: 197.43999838829, testInfo);
AssertEase(sut, normalizedTime: 0.8, expectedValue: 199.839997291565, testInfo);
AssertEase(sut, normalizedTime: 1, expectedValue: 200, testInfo);
}

[TestMethod]
public void When_QuinticEase()
{
var sut = new QuinticEase();
var testInfo = new TestInfo(100, 200);
AssertEase(sut, normalizedTime: 0, expectedValue: 100, testInfo);
AssertEase(sut, normalizedTime: 0.2, expectedValue: 167.232000827789, testInfo);
AssertEase(sut, normalizedTime: 0.4, expectedValue: 192.223995923996, testInfo);
AssertEase(sut, normalizedTime: 0.6, expectedValue: 198.975998163223, testInfo);
AssertEase(sut, normalizedTime: 0.8, expectedValue: 199.96799826622, testInfo);
AssertEase(sut, normalizedTime: 1, expectedValue: 200, testInfo);
}

[TestMethod]
public void When_SineEase()
{
var sut = new SineEase();
var testInfo = new TestInfo(100, 200);
AssertEase(sut, normalizedTime: 0, expectedValue: 100, testInfo);
AssertEase(sut, normalizedTime: 0.2, expectedValue: 130.901694297791, testInfo);
AssertEase(sut, normalizedTime: 0.4, expectedValue: 158.778524398804, testInfo);
AssertEase(sut, normalizedTime: 0.6, expectedValue: 180.901706218719, testInfo);
AssertEase(sut, normalizedTime: 0.8, expectedValue: 195.105654001236, testInfo);
AssertEase(sut, normalizedTime: 1, expectedValue: 200, testInfo);
}
}
}
12 changes: 6 additions & 6 deletions src/Uno.UI/Extensions/EasingFunctionExtensions.iOSmacOS.cs
Original file line number Diff line number Diff line change
Expand Up @@ -141,19 +141,19 @@ private static CAMediaTimingFunction GetBackTimingFunction(EasingMode easingMode
return GetDefaultTimingFunction();
}

private static CAMediaTimingFunction GetPowerTimingFunction(int power, EasingMode easingMode)
private static CAMediaTimingFunction GetPowerTimingFunction(double power, EasingMode easingMode)
{
switch (power)
{
case 1:
case 1.0:
return CAMediaTimingFunction.FromName(CAMediaTimingFunction.Linear);
case 2:
case 2.0:
return GetQuadraticTimingFunction(easingMode);
case 3:
case 3.0:
return GetCubicTimingFunction(easingMode);
case 4:
case 4.0:
return GetQuarticTimingFunction(easingMode);
case 5:
case 5.0:
return GetQuinticTimingFunction(easingMode);
default:
return CAMediaTimingFunction.FromName(CAMediaTimingFunction.Default);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,50 +7,6 @@ namespace Windows.UI.Xaml.Media.Animation
#endif
public partial class BounceEase : global::Windows.UI.Xaml.Media.Animation.EasingFunctionBase
{
#if __ANDROID__ || __IOS__ || IS_UNIT_TESTS || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__ || __MACOS__
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "IS_UNIT_TESTS", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__", "__MACOS__")]
public double Bounciness
{
get
{
return (double)this.GetValue(BouncinessProperty);
}
set
{
this.SetValue(BouncinessProperty, value);
}
}
#endif
#if __ANDROID__ || __IOS__ || IS_UNIT_TESTS || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__ || __MACOS__
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "IS_UNIT_TESTS", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__", "__MACOS__")]
public int Bounces
{
get
{
return (int)this.GetValue(BouncesProperty);
}
set
{
this.SetValue(BouncesProperty, value);
}
}
#endif
#if __ANDROID__ || __IOS__ || IS_UNIT_TESTS || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__ || __MACOS__
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "IS_UNIT_TESTS", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__", "__MACOS__")]
public static global::Windows.UI.Xaml.DependencyProperty BouncesProperty { get; } =
Windows.UI.Xaml.DependencyProperty.Register(
nameof(Bounces), typeof(int),
typeof(global::Windows.UI.Xaml.Media.Animation.BounceEase),
new Windows.UI.Xaml.FrameworkPropertyMetadata(default(int)));
#endif
#if __ANDROID__ || __IOS__ || IS_UNIT_TESTS || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__ || __MACOS__
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "IS_UNIT_TESTS", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__", "__MACOS__")]
public static global::Windows.UI.Xaml.DependencyProperty BouncinessProperty { get; } =
Windows.UI.Xaml.DependencyProperty.Register(
nameof(Bounciness), typeof(double),
typeof(global::Windows.UI.Xaml.Media.Animation.BounceEase),
new Windows.UI.Xaml.FrameworkPropertyMetadata(default(double)));
#endif
// Skipping already declared method Windows.UI.Xaml.Media.Animation.BounceEase.BounceEase()
// Forced skipping of method Windows.UI.Xaml.Media.Animation.BounceEase.BounceEase()
// Forced skipping of method Windows.UI.Xaml.Media.Animation.BounceEase.Bounces.get
Expand Down
Loading

0 comments on commit 34c8d64

Please sign in to comment.