DataAnnotationsValidationPluginTests.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. // Copyright (c) The Avalonia Project. All rights reserved.
  2. // Licensed under the MIT license. See licence.md file in the project root for full license information.
  3. using System;
  4. using System.Collections.Generic;
  5. using System.ComponentModel.DataAnnotations;
  6. using Avalonia.Data;
  7. using Avalonia.Markup.Data.Plugins;
  8. using Avalonia.UnitTests;
  9. using Xunit;
  10. namespace Avalonia.Markup.UnitTests.Data.Plugins
  11. {
  12. public class DataAnnotationsValidationPluginTests : IClassFixture<InvariantCultureFixture>
  13. {
  14. [Fact]
  15. public void Should_Match_Property_With_ValidatorAttribute()
  16. {
  17. var target = new DataAnnotationsValidationPlugin();
  18. var data = new Data();
  19. Assert.True(target.Match(new WeakReference(data), nameof(Data.Between5And10)));
  20. }
  21. [Fact]
  22. public void Should_Match_Property_With_Multiple_ValidatorAttributes()
  23. {
  24. var target = new DataAnnotationsValidationPlugin();
  25. var data = new Data();
  26. Assert.True(target.Match(new WeakReference(data), nameof(Data.PhoneNumber)));
  27. }
  28. [Fact]
  29. public void Should_Not_Match_Property_Without_ValidatorAttribute()
  30. {
  31. var target = new DataAnnotationsValidationPlugin();
  32. var data = new Data();
  33. Assert.False(target.Match(new WeakReference(data), nameof(Data.Unvalidated)));
  34. }
  35. [Fact]
  36. public void Produces_Range_BindingNotificationsx()
  37. {
  38. var inpcAccessorPlugin = new InpcPropertyAccessorPlugin();
  39. var validatorPlugin = new DataAnnotationsValidationPlugin();
  40. var data = new Data();
  41. var accessor = inpcAccessorPlugin.Start(new WeakReference(data), nameof(data.Between5And10));
  42. var validator = validatorPlugin.Start(new WeakReference(data), nameof(data.Between5And10), accessor);
  43. var result = new List<object>();
  44. validator.Subscribe(x => result.Add(x));
  45. validator.SetValue(3, BindingPriority.LocalValue);
  46. validator.SetValue(7, BindingPriority.LocalValue);
  47. validator.SetValue(11, BindingPriority.LocalValue);
  48. Assert.Equal(new[]
  49. {
  50. new BindingNotification(5),
  51. new BindingNotification(
  52. new ValidationException("The field Between5And10 must be between 5 and 10."),
  53. BindingErrorType.DataValidationError,
  54. 3),
  55. new BindingNotification(7),
  56. new BindingNotification(
  57. new ValidationException("The field Between5And10 must be between 5 and 10."),
  58. BindingErrorType.DataValidationError,
  59. 11),
  60. }, result);
  61. }
  62. [Fact]
  63. public void Produces_Aggregate_BindingNotificationsx()
  64. {
  65. var inpcAccessorPlugin = new InpcPropertyAccessorPlugin();
  66. var validatorPlugin = new DataAnnotationsValidationPlugin();
  67. var data = new Data();
  68. var accessor = inpcAccessorPlugin.Start(new WeakReference(data), nameof(data.PhoneNumber));
  69. var validator = validatorPlugin.Start(new WeakReference(data), nameof(data.PhoneNumber), accessor);
  70. var result = new List<object>();
  71. validator.Subscribe(x => result.Add(x));
  72. validator.SetValue("123456", BindingPriority.LocalValue);
  73. validator.SetValue("abcdefghijklm", BindingPriority.LocalValue);
  74. Assert.Equal(new[]
  75. {
  76. new BindingNotification(null),
  77. new BindingNotification("123456"),
  78. new BindingNotification(
  79. new AggregateException(
  80. new ValidationException("The PhoneNumber field is not a valid phone number."),
  81. new ValidationException("The field PhoneNumber must be a string or array type with a maximum length of '10'.")),
  82. BindingErrorType.DataValidationError,
  83. "abcdefghijklm"),
  84. }, result);
  85. }
  86. private class Data
  87. {
  88. [Range(5, 10)]
  89. public int Between5And10 { get; set; } = 5;
  90. public int Unvalidated { get; set; }
  91. [Phone]
  92. [MaxLength(10)]
  93. public string PhoneNumber { get; set; }
  94. }
  95. }
  96. }