ExceptionValidationPluginTests.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Reactive.Linq;
  4. using Avalonia.Data;
  5. using Avalonia.Data.Core.Plugins;
  6. using Avalonia.UnitTests;
  7. using Xunit;
  8. namespace Avalonia.Base.UnitTests.Data.Core.Plugins
  9. {
  10. public class ExceptionValidationPluginTests
  11. {
  12. [Fact]
  13. public void Produces_BindingNotifications()
  14. {
  15. var inpcAccessorPlugin = new InpcPropertyAccessorPlugin();
  16. var validatorPlugin = new ExceptionValidationPlugin();
  17. var data = new Data();
  18. var accessor = inpcAccessorPlugin.Start(new WeakReference<object>(data), nameof(data.MustBePositive));
  19. var validator = validatorPlugin.Start(new WeakReference<object>(data), nameof(data.MustBePositive), accessor);
  20. var result = new List<object>();
  21. validator.Subscribe(x => result.Add(x));
  22. validator.SetValue(5, BindingPriority.LocalValue);
  23. validator.SetValue(-2, BindingPriority.LocalValue);
  24. validator.SetValue(6, BindingPriority.LocalValue);
  25. Assert.Equal(new[]
  26. {
  27. new BindingNotification(0),
  28. new BindingNotification(5),
  29. new BindingNotification(new ArgumentOutOfRangeException("value"), BindingErrorType.DataValidationError),
  30. new BindingNotification(6),
  31. }, result);
  32. GC.KeepAlive(data);
  33. }
  34. public class Data : NotifyingBase
  35. {
  36. private int _mustBePositive;
  37. public int MustBePositive
  38. {
  39. get { return _mustBePositive; }
  40. set
  41. {
  42. if (value <= 0)
  43. {
  44. throw new ArgumentOutOfRangeException(nameof(value));
  45. }
  46. if (value != _mustBePositive)
  47. {
  48. _mustBePositive = value;
  49. RaisePropertyChanged();
  50. }
  51. }
  52. }
  53. }
  54. }
  55. }