AvaloniaObjectTests_DataValidation.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Reactive.Subjects;
  5. using Avalonia.Data;
  6. using Xunit;
  7. namespace Avalonia.Base.UnitTests
  8. {
  9. public class AvaloniaObjectTests_DataValidation
  10. {
  11. [Fact]
  12. public void Setting_Non_Validated_Property_Does_Not_Call_UpdateDataValidation()
  13. {
  14. var target = new Class1();
  15. target.SetValue(Class1.NonValidatedDirectProperty, 6);
  16. Assert.Empty(target.Notifications);
  17. }
  18. [Fact]
  19. public void Setting_Non_Validated_Direct_Property_Does_Not_Call_UpdateDataValidation()
  20. {
  21. var target = new Class1();
  22. target.SetValue(Class1.NonValidatedDirectProperty, 6);
  23. Assert.Empty(target.Notifications);
  24. }
  25. [Fact]
  26. public void Setting_Validated_Direct_Property_Calls_UpdateDataValidation()
  27. {
  28. var target = new Class1();
  29. target.SetValue(Class1.ValidatedDirectProperty, new BindingNotification(6));
  30. target.SetValue(Class1.ValidatedDirectProperty, new BindingNotification(new Exception(), BindingErrorType.Error));
  31. target.SetValue(Class1.ValidatedDirectProperty, new BindingNotification(new Exception(), BindingErrorType.DataValidationError));
  32. target.SetValue(Class1.ValidatedDirectProperty, new BindingNotification(7));
  33. Assert.Equal(
  34. new[]
  35. {
  36. new BindingNotification(6),
  37. new BindingNotification(new Exception(), BindingErrorType.Error),
  38. new BindingNotification(new Exception(), BindingErrorType.DataValidationError),
  39. new BindingNotification(7),
  40. },
  41. target.Notifications.AsEnumerable());
  42. }
  43. [Fact]
  44. public void Binding_Non_Validated_Property_Does_Not_Call_UpdateDataValidation()
  45. {
  46. var source = new Subject<object>();
  47. var target = new Class1
  48. {
  49. [!Class1.NonValidatedProperty] = source.ToBinding(),
  50. };
  51. source.OnNext(new BindingNotification(6));
  52. source.OnNext(new BindingNotification(new Exception(), BindingErrorType.Error));
  53. source.OnNext(new BindingNotification(new Exception(), BindingErrorType.DataValidationError));
  54. source.OnNext(new BindingNotification(7));
  55. Assert.Empty(target.Notifications);
  56. }
  57. [Fact]
  58. public void Binding_Validated_Direct_Property_Calls_UpdateDataValidation()
  59. {
  60. var source = new Subject<object>();
  61. var target = new Class1
  62. {
  63. [!Class1.ValidatedDirectProperty] = source.ToBinding(),
  64. };
  65. source.OnNext(new BindingNotification(6));
  66. source.OnNext(new BindingNotification(new Exception(), BindingErrorType.Error));
  67. source.OnNext(new BindingNotification(new Exception(), BindingErrorType.DataValidationError));
  68. source.OnNext(new BindingNotification(7));
  69. Assert.Equal(
  70. new[]
  71. {
  72. new BindingNotification(6),
  73. new BindingNotification(new Exception(), BindingErrorType.Error),
  74. new BindingNotification(new Exception(), BindingErrorType.DataValidationError),
  75. new BindingNotification(7),
  76. },
  77. target.Notifications.AsEnumerable());
  78. }
  79. private class Class1 : AvaloniaObject
  80. {
  81. public static readonly StyledProperty<int> NonValidatedProperty =
  82. AvaloniaProperty.Register<Class1, int>(
  83. nameof(NonValidated));
  84. public static readonly DirectProperty<Class1, int> NonValidatedDirectProperty =
  85. AvaloniaProperty.RegisterDirect<Class1, int>(
  86. nameof(NonValidatedDirect),
  87. o => o.NonValidatedDirect,
  88. (o, v) => o.NonValidatedDirect = v);
  89. public static readonly DirectProperty<Class1, int> ValidatedDirectProperty =
  90. AvaloniaProperty.RegisterDirect<Class1, int>(
  91. nameof(ValidatedDirect),
  92. o => o.ValidatedDirect,
  93. (o, v) => o.ValidatedDirect = v,
  94. enableDataValidation: true);
  95. private int _nonValidatedDirect;
  96. private int _direct;
  97. public int NonValidated
  98. {
  99. get { return GetValue(NonValidatedProperty); }
  100. set { SetValue(NonValidatedProperty, value); }
  101. }
  102. public int NonValidatedDirect
  103. {
  104. get { return _direct; }
  105. set { SetAndRaise(NonValidatedDirectProperty, ref _nonValidatedDirect, value); }
  106. }
  107. public int ValidatedDirect
  108. {
  109. get { return _direct; }
  110. set { SetAndRaise(ValidatedDirectProperty, ref _direct, value); }
  111. }
  112. public IList<BindingNotification> Notifications { get; } = new List<BindingNotification>();
  113. protected override void UpdateDataValidation(AvaloniaProperty property, BindingNotification notification)
  114. {
  115. Notifications.Add(notification);
  116. }
  117. }
  118. }
  119. }