Esempio n. 1
0
        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");
        }
Esempio n. 2
0
        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")));
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        /// <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);
        }