AvaloniaObjectTests_DataValidation.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Reactive.Subjects;
  5. using Avalonia.Data;
  6. using Avalonia.UnitTests;
  7. using Xunit;
  8. namespace Avalonia.Base.UnitTests
  9. {
  10. public class AvaloniaObjectTests_DataValidation
  11. {
  12. [Fact]
  13. public void Setting_Non_Validated_Property_Does_Not_Call_UpdateDataValidation()
  14. {
  15. var target = new Class1();
  16. target.SetValue(Class1.NonValidatedDirectProperty, 6);
  17. Assert.Empty(target.Notifications);
  18. }
  19. [Fact]
  20. public void Setting_Non_Validated_Direct_Property_Does_Not_Call_UpdateDataValidation()
  21. {
  22. var target = new Class1();
  23. target.SetValue(Class1.NonValidatedDirectProperty, 6);
  24. Assert.Empty(target.Notifications);
  25. }
  26. [Fact]
  27. public void Setting_Validated_Direct_Property_Calls_UpdateDataValidation()
  28. {
  29. var target = new Class1();
  30. target.SetValue(Class1.ValidatedDirectIntProperty, new BindingNotification(6));
  31. target.SetValue(Class1.ValidatedDirectIntProperty, new BindingNotification(new Exception(), BindingErrorType.Error));
  32. target.SetValue(Class1.ValidatedDirectIntProperty, new BindingNotification(new Exception(), BindingErrorType.DataValidationError));
  33. target.SetValue(Class1.ValidatedDirectIntProperty, new BindingNotification(7));
  34. Assert.Equal(
  35. new[]
  36. {
  37. new BindingNotification(6),
  38. new BindingNotification(new Exception(), BindingErrorType.Error),
  39. new BindingNotification(new Exception(), BindingErrorType.DataValidationError),
  40. new BindingNotification(7),
  41. },
  42. target.Notifications.AsEnumerable());
  43. }
  44. [Fact]
  45. public void Binding_Non_Validated_Property_Does_Not_Call_UpdateDataValidation()
  46. {
  47. var source = new Subject<object>();
  48. var target = new Class1
  49. {
  50. [!Class1.NonValidatedProperty] = source.ToBinding(),
  51. };
  52. source.OnNext(new BindingNotification(6));
  53. source.OnNext(new BindingNotification(new Exception(), BindingErrorType.Error));
  54. source.OnNext(new BindingNotification(new Exception(), BindingErrorType.DataValidationError));
  55. source.OnNext(new BindingNotification(7));
  56. Assert.Empty(target.Notifications);
  57. }
  58. [Fact]
  59. public void Binding_Validated_Direct_Property_Calls_UpdateDataValidation()
  60. {
  61. var source = new Subject<object>();
  62. var target = new Class1
  63. {
  64. [!Class1.ValidatedDirectIntProperty] = source.ToBinding(),
  65. };
  66. source.OnNext(new BindingNotification(6));
  67. source.OnNext(new BindingNotification(new Exception(), BindingErrorType.Error));
  68. source.OnNext(new BindingNotification(new Exception(), BindingErrorType.DataValidationError));
  69. source.OnNext(new BindingNotification(7));
  70. Assert.Equal(
  71. new[]
  72. {
  73. new BindingNotification(6),
  74. new BindingNotification(new Exception(), BindingErrorType.Error),
  75. new BindingNotification(new Exception(), BindingErrorType.DataValidationError),
  76. new BindingNotification(7),
  77. },
  78. target.Notifications.AsEnumerable());
  79. }
  80. [Fact]
  81. public void Bound_Validated_Direct_String_Property_Can_Be_Set_To_Null()
  82. {
  83. var source = new ViewModel
  84. {
  85. StringValue = "foo",
  86. };
  87. var target = new Class1
  88. {
  89. [!Class1.ValidatedDirectStringProperty] = new Binding
  90. {
  91. Path = nameof(ViewModel.StringValue),
  92. Source = source,
  93. },
  94. };
  95. Assert.Equal("foo", target.ValidatedDirectString);
  96. source.StringValue = null;
  97. Assert.Null(target.ValidatedDirectString);
  98. }
  99. private class Class1 : AvaloniaObject
  100. {
  101. public static readonly StyledProperty<int> NonValidatedProperty =
  102. AvaloniaProperty.Register<Class1, int>(
  103. nameof(NonValidated));
  104. public static readonly DirectProperty<Class1, int> NonValidatedDirectProperty =
  105. AvaloniaProperty.RegisterDirect<Class1, int>(
  106. nameof(NonValidatedDirect),
  107. o => o.NonValidatedDirect,
  108. (o, v) => o.NonValidatedDirect = v);
  109. public static readonly DirectProperty<Class1, int> ValidatedDirectIntProperty =
  110. AvaloniaProperty.RegisterDirect<Class1, int>(
  111. nameof(ValidatedDirectInt),
  112. o => o.ValidatedDirectInt,
  113. (o, v) => o.ValidatedDirectInt = v,
  114. enableDataValidation: true);
  115. public static readonly DirectProperty<Class1, string> ValidatedDirectStringProperty =
  116. AvaloniaProperty.RegisterDirect<Class1, string>(
  117. nameof(ValidatedDirectString),
  118. o => o.ValidatedDirectString,
  119. (o, v) => o.ValidatedDirectString = v,
  120. enableDataValidation: true);
  121. private int _nonValidatedDirect;
  122. private int _directInt;
  123. private string _directString;
  124. public int NonValidated
  125. {
  126. get { return GetValue(NonValidatedProperty); }
  127. set { SetValue(NonValidatedProperty, value); }
  128. }
  129. public int NonValidatedDirect
  130. {
  131. get { return _directInt; }
  132. set { SetAndRaise(NonValidatedDirectProperty, ref _nonValidatedDirect, value); }
  133. }
  134. public int ValidatedDirectInt
  135. {
  136. get { return _directInt; }
  137. set { SetAndRaise(ValidatedDirectIntProperty, ref _directInt, value); }
  138. }
  139. public string ValidatedDirectString
  140. {
  141. get { return _directString; }
  142. set { SetAndRaise(ValidatedDirectStringProperty, ref _directString, value); }
  143. }
  144. public IList<BindingNotification> Notifications { get; } = new List<BindingNotification>();
  145. protected override void UpdateDataValidation(AvaloniaProperty property, BindingNotification notification)
  146. {
  147. Notifications.Add(notification);
  148. }
  149. }
  150. public class ViewModel : NotifyingBase
  151. {
  152. private string _stringValue;
  153. public string StringValue
  154. {
  155. get { return _stringValue; }
  156. set { _stringValue = value; RaisePropertyChanged(); }
  157. }
  158. }
  159. }
  160. }