NumericUpDownTests.cs 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using System;
  2. using System.Linq;
  3. using System.Reactive.Subjects;
  4. using Avalonia.Controls.Templates;
  5. using Avalonia.Data;
  6. using Avalonia.Threading;
  7. using Avalonia.UnitTests;
  8. using Xunit;
  9. namespace Avalonia.Controls.UnitTests
  10. {
  11. public class NumericUpDownTests
  12. {
  13. private static TestServices Services => TestServices.StyledWindow;
  14. [Fact]
  15. public void Text_Validation()
  16. {
  17. RunTest((control, textbox) =>
  18. {
  19. var exception = new InvalidCastException("failed validation");
  20. var textObservable = new BehaviorSubject<BindingNotification>(new BindingNotification(exception, BindingErrorType.DataValidationError));
  21. control.Bind(NumericUpDown.TextProperty, textObservable);
  22. Dispatcher.UIThread.RunJobs();
  23. Assert.True(DataValidationErrors.GetHasErrors(control));
  24. Assert.True(DataValidationErrors.GetErrors(control).SequenceEqual(new[] { exception }));
  25. });
  26. }
  27. [Fact]
  28. public void Value_Validation()
  29. {
  30. RunTest((control, textbox) =>
  31. {
  32. var exception = new InvalidCastException("failed validation");
  33. var valueObservable = new BehaviorSubject<BindingNotification>(new BindingNotification(exception, BindingErrorType.DataValidationError));
  34. control.Bind(NumericUpDown.ValueProperty, valueObservable);
  35. Dispatcher.UIThread.RunJobs();
  36. Assert.True(DataValidationErrors.GetHasErrors(control));
  37. Assert.True(DataValidationErrors.GetErrors(control).SequenceEqual(new[] { exception }));
  38. });
  39. }
  40. private void RunTest(Action<NumericUpDown, TextBox> test)
  41. {
  42. using (UnitTestApplication.Start(Services))
  43. {
  44. var control = CreateControl();
  45. TextBox textBox = GetTextBox(control);
  46. var window = new Window { Content = control };
  47. window.ApplyTemplate();
  48. window.Presenter.ApplyTemplate();
  49. Dispatcher.UIThread.RunJobs();
  50. test.Invoke(control, textBox);
  51. }
  52. }
  53. private NumericUpDown CreateControl()
  54. {
  55. var control = new NumericUpDown
  56. {
  57. Template = CreateTemplate()
  58. };
  59. control.ApplyTemplate();
  60. return control;
  61. }
  62. private static TextBox GetTextBox(NumericUpDown control)
  63. {
  64. return control.GetTemplateChildren()
  65. .OfType<ButtonSpinner>()
  66. .Select(b => b.Content)
  67. .OfType<TextBox>()
  68. .First();
  69. }
  70. private IControlTemplate CreateTemplate()
  71. {
  72. return new FuncControlTemplate<NumericUpDown>((control, scope) =>
  73. {
  74. var textBox =
  75. new TextBox
  76. {
  77. Name = "PART_TextBox"
  78. }.RegisterInNameScope(scope);
  79. return new ButtonSpinner
  80. {
  81. Name = "PART_Spinner",
  82. Content = textBox,
  83. }.RegisterInNameScope(scope);
  84. });
  85. }
  86. }
  87. }