Skip to content

Commit 846f2ae

Browse files
authored
Merge pull request #692 from CommunityToolkit/dev/derived-validatable-properties
Fix ObservableValidator generator to detect inherited properties
2 parents 6fe5b48 + a7c198a commit 846f2ae

File tree

3 files changed

+59
-5
lines changed

3 files changed

+59
-5
lines changed

src/CommunityToolkit.Mvvm.SourceGenerators/ComponentModel/ObservableValidatorValidateAllPropertiesGenerator.Execute.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public static ValidationInfo GetInfo(INamedTypeSymbol typeSymbol)
4242
{
4343
using ImmutableArrayBuilder<string> propertyNames = ImmutableArrayBuilder<string>.Rent();
4444

45-
foreach (ISymbol memberSymbol in typeSymbol.GetMembers())
45+
foreach (ISymbol memberSymbol in typeSymbol.GetAllMembers())
4646
{
4747
if (memberSymbol is { IsStatic: true } or not (IPropertySymbol { IsIndexer: false } or IFieldSymbol))
4848
{

src/CommunityToolkit.Mvvm.SourceGenerators/Messaging/IMessengerRegisterAllGenerator.Execute.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
using System.Collections.Immutable;
66
using System.Linq;
7-
using CommunityToolkit.Mvvm.SourceGenerators.ComponentModel.Models;
87
using CommunityToolkit.Mvvm.SourceGenerators.Extensions;
98
using CommunityToolkit.Mvvm.SourceGenerators.Helpers;
109
using CommunityToolkit.Mvvm.SourceGenerators.Messaging.Models;

tests/CommunityToolkit.Mvvm.UnitTests/Test_ObservableValidator.cs

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,7 @@ public void Test_ObservableRecipient_ValidationOnNonValidatableProperties(Type t
491491
{
492492
ObservableValidatorBase viewmodel = (ObservableValidatorBase)Activator.CreateInstance(type)!;
493493

494-
viewmodel.ValidateAll();
494+
viewmodel.ValidateAllProperties();
495495
}
496496

497497
// See: https://github.com/CommunityToolkit/WindowsCommunityToolkit/issues/4272
@@ -565,6 +565,50 @@ public void Test_ObservableValidator_WithGenericTypeParameters()
565565
Assert.IsFalse(model.HasErrors);
566566
}
567567

568+
// See https://github.com/CommunityToolkit/dotnet/issues/691
569+
[TestMethod]
570+
public void Test_ObservableValidator_ValidateAllProperties_IncludeInheritedProperties()
571+
{
572+
DerivedModelWithValidatableProperties model = new();
573+
List<DataErrorsChangedEventArgs> events = new();
574+
575+
model.ErrorsChanged += (s, e) => events.Add(e);
576+
577+
model.ValidateAllProperties();
578+
579+
Assert.IsTrue(model.HasErrors);
580+
Assert.IsTrue(events.Count == 2);
581+
582+
Assert.IsTrue(events.Any(e => e.PropertyName == nameof(DerivedModelWithValidatableProperties.Name)));
583+
Assert.IsTrue(events.Any(e => e.PropertyName == nameof(DerivedModelWithValidatableProperties.Number)));
584+
585+
events.Clear();
586+
587+
model.Number = 42;
588+
589+
model.ValidateAllProperties();
590+
591+
Assert.IsTrue(model.HasErrors);
592+
Assert.IsTrue(events.Count == 2);
593+
594+
Assert.IsTrue(events.Any(e => e.PropertyName == nameof(DerivedModelWithValidatableProperties.Name)));
595+
Assert.IsTrue(events.Any(e => e.PropertyName == nameof(DerivedModelWithValidatableProperties.Number)));
596+
597+
Assert.AreEqual(1, model.GetErrors(nameof(DerivedModelWithValidatableProperties.Name)).Count());
598+
Assert.AreEqual(0, model.GetErrors(nameof(DerivedModelWithValidatableProperties.Number)).Count());
599+
600+
events.Clear();
601+
602+
model.Name = "Bob";
603+
model.Number = 80;
604+
605+
model.ValidateAllProperties();
606+
607+
Assert.IsFalse(model.HasErrors);
608+
Assert.IsTrue(events.Count == 1);
609+
610+
Assert.IsTrue(events.Any(e => e.PropertyName == nameof(DerivedModelWithValidatableProperties.Name))); }
611+
568612
public class Person : ObservableValidator
569613
{
570614
private string? name;
@@ -786,9 +830,9 @@ public class ObservableValidatorBase : ObservableValidator
786830
{
787831
public int? MyDummyInt { get; set; } = 0;
788832

789-
public void ValidateAll()
833+
public new void ValidateAllProperties()
790834
{
791-
ValidateAllProperties();
835+
base.ValidateAllProperties();
792836
}
793837
}
794838

@@ -824,6 +868,17 @@ public abstract class AbstractModelWithValidatableProperty : ObservableValidator
824868
public string? Name { get; set; }
825869
}
826870

871+
public class DerivedModelWithValidatableProperties : AbstractModelWithValidatableProperty
872+
{
873+
[Range(10, 1000)]
874+
public int Number { get; set; }
875+
876+
public new void ValidateAllProperties()
877+
{
878+
base.ValidateAllProperties();
879+
}
880+
}
881+
827882
public class GenericPerson<T> : ObservableValidator
828883
{
829884
[Required]

0 commit comments

Comments
 (0)