2 changed files with 111 additions and 2 deletions
@ -0,0 +1,95 @@ |
|||||
|
using System; |
||||
|
using System.Linq; |
||||
|
using System.Reactive.Subjects; |
||||
|
using Avalonia.Controls.Templates; |
||||
|
using Avalonia.Data; |
||||
|
using Avalonia.Threading; |
||||
|
using Avalonia.UnitTests; |
||||
|
using Xunit; |
||||
|
|
||||
|
namespace Avalonia.Controls.UnitTests |
||||
|
{ |
||||
|
public class NumericUpDownTests |
||||
|
{ |
||||
|
private static TestServices Services => TestServices.StyledWindow; |
||||
|
|
||||
|
[Fact] |
||||
|
public void Text_Validation() |
||||
|
{ |
||||
|
RunTest((control, textbox) => |
||||
|
{ |
||||
|
var exception = new InvalidCastException("failed validation"); |
||||
|
var textObservable = new BehaviorSubject<BindingNotification>(new BindingNotification(exception, BindingErrorType.DataValidationError)); |
||||
|
control.Bind(NumericUpDown.TextProperty, textObservable); |
||||
|
Dispatcher.UIThread.RunJobs(); |
||||
|
|
||||
|
Assert.True(DataValidationErrors.GetHasErrors(control)); |
||||
|
Assert.True(DataValidationErrors.GetErrors(control).SequenceEqual(new[] { exception })); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Value_Validation() |
||||
|
{ |
||||
|
RunTest((control, textbox) => |
||||
|
{ |
||||
|
var exception = new InvalidCastException("failed validation"); |
||||
|
var valueObservable = new BehaviorSubject<BindingNotification>(new BindingNotification(exception, BindingErrorType.DataValidationError)); |
||||
|
control.Bind(NumericUpDown.ValueProperty, valueObservable); |
||||
|
Dispatcher.UIThread.RunJobs(); |
||||
|
|
||||
|
Assert.True(DataValidationErrors.GetHasErrors(control)); |
||||
|
Assert.True(DataValidationErrors.GetErrors(control).SequenceEqual(new[] { exception })); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
private void RunTest(Action<NumericUpDown, TextBox> test) |
||||
|
{ |
||||
|
using (UnitTestApplication.Start(Services)) |
||||
|
{ |
||||
|
var control = CreateControl(); |
||||
|
TextBox textBox = GetTextBox(control); |
||||
|
var window = new Window { Content = control }; |
||||
|
window.ApplyTemplate(); |
||||
|
window.Presenter.ApplyTemplate(); |
||||
|
Dispatcher.UIThread.RunJobs(); |
||||
|
test.Invoke(control, textBox); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private NumericUpDown CreateControl() |
||||
|
{ |
||||
|
var control = new NumericUpDown |
||||
|
{ |
||||
|
Template = CreateTemplate() |
||||
|
}; |
||||
|
|
||||
|
control.ApplyTemplate(); |
||||
|
return control; |
||||
|
} |
||||
|
private TextBox GetTextBox(NumericUpDown control) |
||||
|
{ |
||||
|
return control.GetTemplateChildren() |
||||
|
.OfType<ButtonSpinner>() |
||||
|
.Select(b => b.Content) |
||||
|
.OfType<TextBox>() |
||||
|
.First(); |
||||
|
} |
||||
|
private IControlTemplate CreateTemplate() |
||||
|
{ |
||||
|
return new FuncControlTemplate<NumericUpDown>((control, scope) => |
||||
|
{ |
||||
|
var textBox = |
||||
|
new TextBox |
||||
|
{ |
||||
|
Name = "PART_TextBox" |
||||
|
}.RegisterInNameScope(scope); |
||||
|
return new ButtonSpinner |
||||
|
{ |
||||
|
Name = "PART_Spinner", |
||||
|
Content = textBox, |
||||
|
}.RegisterInNameScope(scope); |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue