AvaloniaObjectTests_DataValidation.cs 6.0 KB

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