|
@@ -1,8 +1,10 @@
|
|
|
using System;
|
|
using System;
|
|
|
|
|
+using System.Collections.Generic;
|
|
|
using System.Linq;
|
|
using System.Linq;
|
|
|
using System.Reactive.Subjects;
|
|
using System.Reactive.Subjects;
|
|
|
using Avalonia.Controls.Templates;
|
|
using Avalonia.Controls.Templates;
|
|
|
using Avalonia.Data;
|
|
using Avalonia.Data;
|
|
|
|
|
+using Avalonia.Interactivity;
|
|
|
using Avalonia.Threading;
|
|
using Avalonia.Threading;
|
|
|
using Avalonia.UnitTests;
|
|
using Avalonia.UnitTests;
|
|
|
using Xunit;
|
|
using Xunit;
|
|
@@ -43,6 +45,38 @@ namespace Avalonia.Controls.UnitTests
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ [Theory]
|
|
|
|
|
+ [MemberData(nameof(Increment_Decrement_TestData))]
|
|
|
|
|
+ public void Increment_Decrement_Tests(decimal min, decimal max, decimal? value, SpinDirection direction,
|
|
|
|
|
+ decimal? expected)
|
|
|
|
|
+ {
|
|
|
|
|
+ var control = CreateControl();
|
|
|
|
|
+ if (min > decimal.MinValue) control.Minimum = min;
|
|
|
|
|
+ if (max < decimal.MaxValue) control.Maximum = max;
|
|
|
|
|
+ control.Value = value;
|
|
|
|
|
+
|
|
|
|
|
+ var spinner = GetSpinner(control);
|
|
|
|
|
+
|
|
|
|
|
+ spinner.RaiseEvent(new SpinEventArgs(Spinner.SpinEvent, direction));
|
|
|
|
|
+
|
|
|
|
|
+ Assert.Equal(control.Value, expected);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static IEnumerable<object[]> Increment_Decrement_TestData()
|
|
|
|
|
+ {
|
|
|
|
|
+ // if min and max are not defined and value was null, 0 should be ne new value after spin
|
|
|
|
|
+ yield return new object[] { decimal.MinValue, decimal.MaxValue, null, SpinDirection.Decrease, 0m };
|
|
|
|
|
+ yield return new object[] { decimal.MinValue, decimal.MaxValue, null, SpinDirection.Increase, 0m };
|
|
|
|
|
+
|
|
|
|
|
+ // if no value was defined, but Min or Max are defined, use these as the new value
|
|
|
|
|
+ yield return new object[] { -400m, -200m, null, SpinDirection.Decrease, -200m };
|
|
|
|
|
+ yield return new object[] { 200m, 400m, null, SpinDirection.Increase, 200m };
|
|
|
|
|
+
|
|
|
|
|
+ // Value should be clamped to Min / Max after spinning
|
|
|
|
|
+ yield return new object[] { 200m, 400m, 5m, SpinDirection.Increase, 200m };
|
|
|
|
|
+ yield return new object[] { 200m, 400m, 200m, SpinDirection.Decrease, 200m };
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private void RunTest(Action<NumericUpDown, TextBox> test)
|
|
private void RunTest(Action<NumericUpDown, TextBox> test)
|
|
|
{
|
|
{
|
|
|
using (UnitTestApplication.Start(Services))
|
|
using (UnitTestApplication.Start(Services))
|
|
@@ -76,6 +110,14 @@ namespace Avalonia.Controls.UnitTests
|
|
|
.OfType<TextBox>()
|
|
.OfType<TextBox>()
|
|
|
.First();
|
|
.First();
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ private static ButtonSpinner GetSpinner(NumericUpDown control)
|
|
|
|
|
+ {
|
|
|
|
|
+ return control.GetTemplateChildren()
|
|
|
|
|
+ .OfType<ButtonSpinner>()
|
|
|
|
|
+ .First();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private static IControlTemplate CreateTemplate()
|
|
private static IControlTemplate CreateTemplate()
|
|
|
{
|
|
{
|
|
|
return new FuncControlTemplate<NumericUpDown>((control, scope) =>
|
|
return new FuncControlTemplate<NumericUpDown>((control, scope) =>
|