public void ValidatingACircularReferenceShouldNotThrowOrTimeOut([IntegrationTesting] IGetsValidator validatorFactory) { var manifest = new ValidationManifest { ValidatedType = typeof(Node), RootValue = new ManifestValue { ValidatedType = typeof(Node), IdentityAccessor = obj => ((Node)obj).Identity, Children = new[] { new ManifestValue { ValidatedType = typeof(NodeChild), IdentityAccessor = obj => ((NodeChild)obj).Identity, AccessorFromParent = obj => ((Node)obj).Child, }, new ManifestValue { ValidatedType = typeof(string), AccessorFromParent = obj => ((Node)obj).Name, } } } }; var nameValue = manifest.RootValue.Children.Single(x => x.ValidatedType == typeof(string)); var nameRule = new ManifestRule(nameValue, new ManifestRuleIdentifier(nameValue, typeof(MatchesRegex))) { RuleConfiguration = obj => ((MatchesRegex)obj).Pattern = "^Foo", }; nameValue.Rules.Add(nameRule); var childValue = manifest.RootValue.Children.Single(x => x.ValidatedType == typeof(NodeChild)); var recursiveValue = new RecursiveManifestValue(manifest.RootValue) { AccessorFromParent = obj => ((NodeChild)obj).Node, }; childValue.Children.Add(recursiveValue); var validatedObject = new Node { Child = new NodeChild { Node = new Node { Child = new NodeChild { Node = new Node { Name = "Invalid" } } } } }; validatedObject.Child.Node.Child.Node.Child = validatedObject.Child; var sut = validatorFactory.GetValidator <Node>(manifest); Assert.That(() => sut.ValidateAsync(validatedObject).Wait(300), Is.True, "Validation completes within 300ms"); }
public async Task RecursiveValidationShouldReturnaResultFromADescendentObjectValidatedUsingTheSameManifestAsAnAncestor([IntegrationTesting] IGetsValidator validatorFactory) { var manifest = new ValidationManifest { ValidatedType = typeof(Node), RootValue = new ManifestValue { ValidatedType = typeof(Node), IdentityAccessor = obj => ((Node)obj).Identity, Children = new[] { new ManifestValue { ValidatedType = typeof(NodeChild), IdentityAccessor = obj => ((NodeChild)obj).Identity, AccessorFromParent = obj => ((Node)obj).Child, }, new ManifestValue { ValidatedType = typeof(string), AccessorFromParent = obj => ((Node)obj).Name, } } } }; var nameValue = manifest.RootValue.Children.Single(x => x.ValidatedType == typeof(string)); var nameRule = new ManifestRule(nameValue, new ManifestRuleIdentifier(nameValue, typeof(MatchesRegex))) { RuleConfiguration = obj => ((MatchesRegex)obj).Pattern = "^Foo", }; nameValue.Rules.Add(nameRule); var childValue = manifest.RootValue.Children.Single(x => x.ValidatedType == typeof(NodeChild)); var recursiveValue = new RecursiveManifestValue(manifest.RootValue) { AccessorFromParent = obj => ((NodeChild)obj).Node, }; childValue.Children.Add(recursiveValue); var validatedObject = new Node { Child = new NodeChild { Node = new Node { Child = new NodeChild { Node = new Node { Name = "Invalid" } } } } }; var sut = validatorFactory.GetValidator <Node>(manifest); var result = await sut.ValidateAsync(validatedObject); Assert.That(result, Has.One.Matches <ValidationRuleResult>(r => r.Outcome == RuleOutcome.Failed && Equals(r.ValidatedValue, "Invalid"))); }
IManifestItem GetRecursiveValue() { var recursiveValue = new RecursiveManifestValue(recursiveAncestor) { Parent = context.ManifestValue.Parent, }; if (context.ManifestValue is IManifestValue val) { recursiveValue.AccessorFromParent = val.AccessorFromParent; recursiveValue.MemberName = val.MemberName; } return(recursiveValue); }
/// <inheritdoc/> public IManifestItem GetManifestItem(ModelToManifestConversionContext context) { if (context.ConversionType != ModelToManifestConversionType.RecursiveManifestValue) { return(next.GetManifestItem(context)); } var ancestor = GetAncestor(context); var recursiveItem = new RecursiveManifestValue(ancestor) { AccessorFromParent = context.AccessorFromParent, MemberName = context.MemberName, Parent = context.ParentManifestValue, }; if (context.ParentManifestValue != null) { context.ParentManifestValue.Children.Add(recursiveItem); } return(recursiveItem); }