IndeiValidationPluginTests.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using Avalonia.Data;
  5. using Avalonia.Data.Core.Plugins;
  6. using Xunit;
  7. namespace Avalonia.Base.UnitTests.Data.Core.Plugins
  8. {
  9. public class IndeiValidationPluginTests
  10. {
  11. [Fact]
  12. public void Produces_BindingNotifications()
  13. {
  14. var inpcAccessorPlugin = new InpcPropertyAccessorPlugin();
  15. var validatorPlugin = new IndeiValidationPlugin();
  16. var data = new Data { Maximum = 5 };
  17. var accessor = inpcAccessorPlugin.Start(new WeakReference<object>(data), nameof(data.Value));
  18. var validator = validatorPlugin.Start(new WeakReference<object>(data), nameof(data.Value), accessor);
  19. var result = new List<object>();
  20. validator.Subscribe(x => result.Add(x));
  21. validator.SetValue(5, BindingPriority.LocalValue);
  22. validator.SetValue(6, BindingPriority.LocalValue);
  23. data.Maximum = 10;
  24. data.Maximum = 5;
  25. Assert.Equal(new[]
  26. {
  27. new BindingNotification(0),
  28. new BindingNotification(5),
  29. // Value is first signalled without an error as validation hasn't been updated.
  30. new BindingNotification(6),
  31. // Then the ErrorsChanged event is fired.
  32. new BindingNotification(new DataValidationException("Must be less than Maximum"), BindingErrorType.DataValidationError, 6),
  33. // Maximum is changed to 10 so value is now valid.
  34. new BindingNotification(6),
  35. // And Maximum is changed back to 5.
  36. new BindingNotification(new DataValidationException("Must be less than Maximum"), BindingErrorType.DataValidationError, 6),
  37. }, result);
  38. }
  39. [Fact]
  40. public void Subscribes_And_Unsubscribes()
  41. {
  42. var inpcAccessorPlugin = new InpcPropertyAccessorPlugin();
  43. var validatorPlugin = new IndeiValidationPlugin();
  44. var data = new Data { Maximum = 5 };
  45. var accessor = inpcAccessorPlugin.Start(new WeakReference<object>(data), nameof(data.Value));
  46. var validator = validatorPlugin.Start(new WeakReference<object>(data), nameof(data.Value), accessor);
  47. Assert.Equal(0, data.ErrorsChangedSubscriptionCount);
  48. validator.Subscribe(_ => { });
  49. Assert.Equal(1, data.ErrorsChangedSubscriptionCount);
  50. validator.Unsubscribe();
  51. Assert.Equal(0, data.ErrorsChangedSubscriptionCount);
  52. }
  53. internal class Data : IndeiBase
  54. {
  55. private int _value;
  56. private int _maximum;
  57. private string _error;
  58. public override bool HasErrors => _error != null;
  59. public int Value
  60. {
  61. get { return _value; }
  62. set
  63. {
  64. _value = value;
  65. RaisePropertyChanged();
  66. UpdateError();
  67. }
  68. }
  69. public int Maximum
  70. {
  71. get { return _maximum; }
  72. set
  73. {
  74. _maximum = value;
  75. UpdateError();
  76. }
  77. }
  78. public override IEnumerable GetErrors(string propertyName)
  79. {
  80. if (propertyName == nameof(Value) && _error != null)
  81. {
  82. return new[] { _error };
  83. }
  84. return null;
  85. }
  86. private void UpdateError()
  87. {
  88. if (_value <= _maximum)
  89. {
  90. if (_error != null)
  91. {
  92. _error = null;
  93. RaiseErrorsChanged(nameof(Value));
  94. }
  95. }
  96. else
  97. {
  98. if (_error == null)
  99. {
  100. _error = "Must be less than Maximum";
  101. RaiseErrorsChanged(nameof(Value));
  102. }
  103. }
  104. }
  105. }
  106. }
  107. }