DataAnnotationsValidationPluginTests.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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 System.Linq;
  7. using Avalonia.Data;
  8. using Avalonia.Data.Core.Plugins;
  9. using Avalonia.UnitTests;
  10. using Xunit;
  11. namespace Avalonia.Markup.UnitTests.Data.Plugins
  12. {
  13. public class DataAnnotationsValidationPluginTests : IClassFixture<InvariantCultureFixture>
  14. {
  15. [Fact]
  16. public void Should_Match_Property_With_ValidatorAttribute()
  17. {
  18. var target = new DataAnnotationsValidationPlugin();
  19. var data = new Data();
  20. Assert.True(target.Match(new WeakReference(data), nameof(Data.Between5And10)));
  21. }
  22. [Fact]
  23. public void Should_Match_Property_With_Multiple_ValidatorAttributes()
  24. {
  25. var target = new DataAnnotationsValidationPlugin();
  26. var data = new Data();
  27. Assert.True(target.Match(new WeakReference(data), nameof(Data.PhoneNumber)));
  28. }
  29. [Fact]
  30. public void Should_Not_Match_Property_Without_ValidatorAttribute()
  31. {
  32. var target = new DataAnnotationsValidationPlugin();
  33. var data = new Data();
  34. Assert.False(target.Match(new WeakReference(data), nameof(Data.Unvalidated)));
  35. }
  36. [Fact]
  37. public void Produces_Range_BindingNotificationsx()
  38. {
  39. var inpcAccessorPlugin = new InpcPropertyAccessorPlugin();
  40. var validatorPlugin = new DataAnnotationsValidationPlugin();
  41. var data = new Data();
  42. var accessor = inpcAccessorPlugin.Start(new WeakReference(data), nameof(data.Between5And10));
  43. var validator = validatorPlugin.Start(new WeakReference(data), nameof(data.Between5And10), accessor);
  44. var result = new List<object>();
  45. var errmsg = new RangeAttribute(5, 10).FormatErrorMessage(nameof(Data.Between5And10));
  46. validator.Subscribe(x => result.Add(x));
  47. validator.SetValue(3, BindingPriority.LocalValue);
  48. validator.SetValue(7, BindingPriority.LocalValue);
  49. validator.SetValue(11, BindingPriority.LocalValue);
  50. Assert.Equal(new[]
  51. {
  52. new BindingNotification(5),
  53. new BindingNotification(
  54. new ValidationException(errmsg),
  55. BindingErrorType.DataValidationError,
  56. 3),
  57. new BindingNotification(7),
  58. new BindingNotification(
  59. new ValidationException(errmsg),
  60. BindingErrorType.DataValidationError,
  61. 11),
  62. }, result);
  63. }
  64. [Fact]
  65. public void Produces_Aggregate_BindingNotificationsx()
  66. {
  67. var inpcAccessorPlugin = new InpcPropertyAccessorPlugin();
  68. var validatorPlugin = new DataAnnotationsValidationPlugin();
  69. var data = new Data();
  70. var accessor = inpcAccessorPlugin.Start(new WeakReference(data), nameof(data.PhoneNumber));
  71. var validator = validatorPlugin.Start(new WeakReference(data), nameof(data.PhoneNumber), accessor);
  72. var result = new List<object>();
  73. validator.Subscribe(x => result.Add(x));
  74. validator.SetValue("123456", BindingPriority.LocalValue);
  75. validator.SetValue("abcdefghijklm", BindingPriority.LocalValue);
  76. Assert.Equal(3, result.Count);
  77. Assert.Equal(new BindingNotification(null), result[0]);
  78. Assert.Equal(new BindingNotification("123456"), result[1]);
  79. var errorResult = (BindingNotification)result[2];
  80. Assert.Equal(BindingErrorType.DataValidationError, errorResult.ErrorType);
  81. Assert.Equal("abcdefghijklm", errorResult.Value);
  82. var exceptions = ((AggregateException)(errorResult.Error)).InnerExceptions;
  83. Assert.True(exceptions.Any(ex =>
  84. ex.Message.Contains("The PhoneNumber field is not a valid phone number.")));
  85. Assert.True(exceptions.Any(ex =>
  86. ex.Message.Contains("The field PhoneNumber must be a string or array type with a maximum length of '10'.")));
  87. }
  88. private class Data
  89. {
  90. [Range(5, 10)]
  91. public int Between5And10 { get; set; } = 5;
  92. public int Unvalidated { get; set; }
  93. [Phone]
  94. [MaxLength(10)]
  95. public string PhoneNumber { get; set; }
  96. }
  97. }
  98. }