Example #1
0
        public void ForValuesShouldPassConfigurationActionToBuilder([Frozen, ManifestModel] ValidatorBuilderContext context,
                                                                    [Frozen] IGetsValidatorBuilderContext ruleContextFactory,
                                                                    [Frozen] IGetsValueAccessorBuilder valueBuilderFactory,
                                                                    ValidatorBuilder <ValidatedObject> sut,
                                                                    [ManifestModel] ValidatorBuilderContext ruleContext,
                                                                    IBuildsValueAccessor <ValidatedObject, char> valueBuilder,
                                                                    [ManifestModel] ManifestValue value)
        {
            Mock.Get(ruleContextFactory)
            .Setup(x => x.GetContextForValue(It.IsAny <Func <ValidatedObject, IEnumerable <char> > >(), context, false))
            .Returns(ruleContext);
            Mock.Get(ruleContextFactory)
            .Setup(x => x.GetContextForValue <ValidatedObject, char>(null, ruleContext, true))
            .Returns(ruleContext);
            Mock.Get(valueBuilderFactory)
            .Setup(x => x.GetValueAccessorBuilder <ValidatedObject, char>(ruleContext, It.IsAny <Action <IConfiguresValueAccessor <ValidatedObject, char> > >()))
            .Returns(valueBuilder);
            Mock.Get(valueBuilder)
            .Setup(x => x.GetManifestValue())
            .Returns(() => value);

            Action <IConfiguresValueAccessor <ValidatedObject, char> > configAction = c => c.AddRuleWithParent <CharValueRule>();

            sut.ForValues(x => x.AProperty, configAction);

            Mock.Get(valueBuilderFactory)
            .Verify(x => x.GetValueAccessorBuilder <ValidatedObject, char>(ruleContext, configAction), Times.Once);
        }
        public void GetManifestRuleShouldReturnAManifestRuleWithCorrectDependencies([Frozen] IGetsManifestRuleIdentifierFromRelativeIdentifier relativeToManifestIdentityConverter,
                                                                                    [Frozen] IGetsManifestRuleIdentifier identifierFactory,
                                                                                    [Frozen, ManifestModel] ValidatorBuilderContext context,
                                                                                    RuleBuilder <SampleRule> sut,
                                                                                    [ManifestModel] ManifestRuleIdentifier identifier,
                                                                                    RelativeRuleIdentifier relativeId1,
                                                                                    RelativeRuleIdentifier relativeId2,
                                                                                    RelativeRuleIdentifier relativeId3,
                                                                                    [ManifestModel] ManifestRuleIdentifier manifestId1,
                                                                                    [ManifestModel] ManifestRuleIdentifier manifestId2,
                                                                                    [ManifestModel] ManifestRuleIdentifier manifestId3)
        {
            Mock.Get(identifierFactory)
            .Setup(x => x.GetManifestRuleIdentifier(typeof(SampleRule), It.IsAny <ValidatorBuilderContext>(), It.IsAny <string>()))
            .Returns(identifier);
            Mock.Get(relativeToManifestIdentityConverter).Setup(x => x.GetManifestRuleIdentifier(context.ManifestValue, relativeId1)).Returns(manifestId1);
            Mock.Get(relativeToManifestIdentityConverter).Setup(x => x.GetManifestRuleIdentifier(context.ManifestValue, relativeId2)).Returns(manifestId2);
            Mock.Get(relativeToManifestIdentityConverter).Setup(x => x.GetManifestRuleIdentifier(context.ManifestValue, relativeId3)).Returns(manifestId3);

            sut.Dependencies = new[] { relativeId1, relativeId2, relativeId3 };

            var result = sut.GetManifestValue().Rules.Single();

            Assert.That(result, Has.Property(nameof(ManifestRule.DependencyRules)).EquivalentTo(new[] { manifestId1, manifestId2, manifestId3 }));
        }
        public void GetContextForValueShouldReturnContextWithoutMemberName([ManifestModel] ValidatorBuilderContext validationContext,
                                                                           ValidatorBuilderContextFactory sut)
        {
            var result = sut.GetContextForValue <ValidatedObject, string>(v => v.AProperty, validationContext);

            Assert.That(result.ManifestValue, Has.Property(nameof(ManifestValue.MemberName)).Null);
        }
Example #4
0
        public void GetManifestRulesShouldIterateOverEveryRuleAdded([Frozen, ManifestModel] ValidatorBuilderContext context,
                                                                    [Frozen] IGetsValidatorBuilderContext ruleContextFactory,
                                                                    [Frozen] IGetsRuleBuilder ruleBuilderFactory,
                                                                    ValidatorBuilder <ValidatedObject> sut,
                                                                    [ManifestModel] ManifestValue value)
        {
            Mock.Get(ruleBuilderFactory)
            .Setup(x => x.GetRuleBuilder <ObjectRule>(It.IsAny <ValidatorBuilderContext>(), It.IsAny <Action <IConfiguresRule <ObjectRule> > >()))
            .Returns(() => {
                var ruleBuilder = new Mock <IBuildsRule <ObjectRule> >();
                ruleBuilder
                .Setup(x => x.GetManifestValue())
                .Returns(() => value);
                return(ruleBuilder.Object);
            });

            sut.AddRule <ObjectRule>();
            sut.AddRule <ObjectRule>();

            sut.GetManifestValue();

            Mock.Get(ruleBuilderFactory)
            .Verify(x => x.GetRuleBuilder <ObjectRule>(context, It.IsAny <Action <IConfiguresRule <ObjectRule> > >()),
                    Times.Exactly(2));
        }
        /// <inheritdoc/>
        public ValidatorBuilderContext GetPolymorphicContext(ValidatorBuilderContext validatorContext, Type derivedType)
        {
            if (validatorContext is null)
            {
                throw new ArgumentNullException(nameof(validatorContext));
            }
            if (derivedType is null)
            {
                throw new ArgumentNullException(nameof(derivedType));
            }
            if (!(validatorContext.ManifestValue is IHasPolymorphicTypes polyManifest))
            {
                var message = String.Format(Resources.ExceptionMessages.GetExceptionMessage("MustImplementPolymorphicInterface"),
                                            typeof(IHasPolymorphicTypes).Name,
                                            validatorContext.ManifestValue?.GetType().FullName ?? "<null>");
                throw new ArgumentException(message, nameof(validatorContext));
            }

            ManifestPolymorphicType existingPoly;

            if ((existingPoly = polyManifest.PolymorphicTypes.FirstOrDefault(x => x.ValidatedType == derivedType)) != null)
            {
                return(new ValidatorBuilderContext(existingPoly));
            }

            var polymorphicValue = new ManifestPolymorphicType
            {
                Parent        = validatorContext.ManifestValue.Parent,
                ValidatedType = derivedType,
            };

            polyManifest.PolymorphicTypes.Add(polymorphicValue);
            return(new ValidatorBuilderContext(polymorphicValue));
        }
Example #6
0
        public void ForValuesShouldAddBuilderReturnedFromValueBuilderFactory([Frozen, ManifestModel] ValidatorBuilderContext context,
                                                                             [Frozen] IGetsValidatorBuilderContext ruleContextFactory,
                                                                             [Frozen] IGetsValueAccessorBuilder valueBuilderFactory,
                                                                             ValidatorBuilder <ValidatedObject> sut,
                                                                             [ManifestModel] ValidatorBuilderContext ruleContext,
                                                                             IBuildsValueAccessor <ValidatedObject, char> valueBuilder,
                                                                             [ManifestModel] ManifestValue value)
        {
            Mock.Get(ruleContextFactory)
            .Setup(x => x.GetContextForValue(It.IsAny <Func <ValidatedObject, IEnumerable <char> > >(), context, false))
            .Returns(ruleContext);
            Mock.Get(ruleContextFactory)
            .Setup(x => x.GetContextForValue <ValidatedObject, char>(null, ruleContext, true))
            .Returns(ruleContext);
            Mock.Get(valueBuilderFactory)
            .Setup(x => x.GetValueAccessorBuilder <ValidatedObject, char>(ruleContext, It.IsAny <Action <IConfiguresValueAccessor <ValidatedObject, char> > >()))
            .Returns(valueBuilder);
            Mock.Get(valueBuilder)
            .Setup(x => x.GetManifestValue())
            .Returns(() => value);

            sut.ForValues(x => x.AProperty, c => {});

            Assert.That(sut.GetManifestValue().Children.Single(), Is.SameAs(value));
        }
        public void GetContextForValueShouldReturnContextWithCorrectAccessor([ManifestModel] ValidatorBuilderContext validationContext,
                                                                             ValidatorBuilderContextFactory sut,
                                                                             ValidatedObject obj)
        {
            var result = sut.GetContextForValue <ValidatedObject, string>(v => v.AProperty, validationContext);

            Assert.That(() => ((ManifestValue)result.ManifestValue).AccessorFromParent(obj), Is.EqualTo(obj.AProperty));
        }
Example #8
0
 public void ValidateAsAncestorShouldThrowIfUsedTwice([Frozen, ManifestModel] ValidatorBuilderContext context,
                                                      ValidatorBuilder <ValidatedObject> sut,
                                                      [ManifestModel] ManifestValue parent)
 {
     context.ManifestValue.Parent = parent;
     sut.ValidateAsAncestor(1);
     Assert.That(() => sut.ValidateAsAncestor(1), Throws.InvalidOperationException);
 }
        public void GetPolymorphicContextShouldThrowIfManifestValueCannotHavePolymorphicTypes([ManifestModel] ManifestPolymorphicType manifestModel,
                                                                                              ValidatorBuilderContextFactory sut)
        {
            var validationContext = new ValidatorBuilderContext(manifestModel);

            Assert.That(() => sut.GetPolymorphicContext(validationContext, typeof(object)),
                        Throws.ArgumentException.And.Message.StartWith("The validation manifest value for the current context must implement IHasPolymorphicTypes"));
        }
Example #10
0
        public void UseObjectIdentityShouldAddIdentityAccessorToTheContext([Frozen, ManifestModel] ValidatorBuilderContext context,
                                                                           ValidatorBuilder <ValidatedObject> sut,
                                                                           ValidatedObject obj)
        {
            sut.UseObjectIdentity(x => x.Identity);

            Assert.That(() => context.ManifestValue.IdentityAccessor(obj), Is.EqualTo(obj.Identity));
        }
Example #11
0
        /// <summary>
        /// Gets an object which provides manifest rules from a specified validator-builder type.
        /// </summary>
        /// <param name="definitionType">A type which must implement <see cref="IBuildsValidator{TValidated}"/>.</param>
        /// <param name="context">Contextual information about how a validator should be built.</param>
        /// <returns>An object which provides a collection of <see cref="Manifest.ManifestRule"/> instances.</returns>
        /// <exception cref="ArgumentException">If the <paramref name="definitionType"/> does not implement <see cref="IBuildsValidator{TValidated}"/>.</exception>
        public IGetsManifestValue GetValidatorManifest(Type definitionType, ValidatorBuilderContext context)
        {
            var validatedType = GetValidatedType(definitionType);

            var method = getValidatorManifestGenericMethod.MakeGenericMethod(validatedType);

            return((IGetsManifestValue)method.Invoke(this, new object[] { definitionType, context }));
        }
Example #12
0
 public void ForMemberShouldThrowIfValidateAsAncestorHasAlreadyBeenUsed([Frozen, ManifestModel] ValidatorBuilderContext context,
                                                                        ValidatorBuilder <ValidatedObject> sut,
                                                                        [ManifestModel] ManifestValue parent)
 {
     context.ManifestValue.Parent = parent;
     sut.ValidateAsAncestor(1);
     Assert.That(() => sut.ForMember(x => x.AProperty, v => { }), Throws.InvalidOperationException);
 }
Example #13
0
        IGetsManifestValue GetValidatorManifestGeneric <T>(Type definitionType, ValidatorBuilderContext context)
        {
            var definition = GetValidatorBuilder <T>(definitionType);
            var builder    = new ValidatorBuilder <T>(RuleContextFactory, RuleBuilderFactory, ValueBuilderFactory, ValidatorManifestFactory, context);

            definition.ConfigureValidator(builder);
            return(builder);
        }
Example #14
0
        public void GetRuleBuilderShouldReturnBuilder(IGetsManifestRuleIdentifierFromRelativeIdentifier identifierConverter,
                                                      IGetsManifestRuleIdentifier identifierFactory,
                                                      [ManifestModel] ValidatorBuilderContext context)
        {
            var sut = new RuleBuilderFactory(() => identifierConverter, () => identifierFactory);

            Assert.That(() => sut.GetRuleBuilder <ObjectRule>(context, c => { }), Is.Not.Null);
        }
        public void GetPolymorphicContextShouldReturnANewContextIfAnExistingPolymorphicTypeDoesNotExist([ManifestModel] ManifestValue manifestValue,
                                                                                                        ValidatorBuilderContextFactory sut)
        {
            manifestValue.PolymorphicTypes.Clear();
            var validationContext = new ValidatorBuilderContext(manifestValue);

            Assert.That(() => sut.GetPolymorphicContext(validationContext, typeof(string))?.ManifestValue,
                        Is.InstanceOf <ManifestPolymorphicType>());
        }
Example #16
0
        public void GetValueAccessorBuilderShouldReturnAnAccessorBuilder([ManifestModel] ValidatorBuilderContext context,
                                                                         IGetsRuleBuilder ruleBuilderFactory,
                                                                         IGetsValidatorManifest validatorManifestFactory,
                                                                         IGetsValidatorBuilderContext contextFactory)
        {
            var sut = new ValueAccessorBuilderFactory(() => ruleBuilderFactory, () => validatorManifestFactory, () => contextFactory);

            Assert.That(() => sut.GetValueAccessorBuilder <ValidatedObject, string>(context, c => { }), Is.Not.Null);
        }
Example #17
0
        public void GetRuleBuilderShouldExecuteConfigurationUponBuilder(IGetsManifestRuleIdentifierFromRelativeIdentifier identifierConverter,
                                                                        IGetsManifestRuleIdentifier identifierFactory,
                                                                        [ManifestModel] ValidatorBuilderContext context,
                                                                        string name)
        {
            var sut    = new RuleBuilderFactory(() => identifierConverter, () => identifierFactory);
            var result = sut.GetRuleBuilder <ObjectRule>(context, c => c.Name = name);

            Assert.That(result.Name, Is.EqualTo(name));
        }
        /// <summary>
        /// Gets the validator builder object, optionally for a specified validator builder context.
        /// </summary>
        /// <typeparam name="TValidated">The type of object to be validated.</typeparam>
        /// <param name="context">An optional validator builder context; if <see langword="null"/> then a new/empty context will be created.</param>
        /// <returns>A validator builder.</returns>
        public IValidatorBuilder <TValidated> GetValidatorBuilder <TValidated>(ValidatorBuilderContext context = null)
        {
            var builderContext = context ?? CreateEmptyContext(typeof(TValidated));

            return(new ValidatorBuilder <TValidated>(ruleContextFactory(),
                                                     ruleBuilderFactory(),
                                                     valueBuilderFactory(),
                                                     validatorManifestFactory(),
                                                     builderContext));
        }
Example #19
0
 /// <summary>
 /// Initializes a new instance of <see cref="ValueAccessorBuilder{TValidated, TValue}"/>.
 /// </summary>
 /// <param name="context">The context which should be used for newly-added rule-builders.</param>
 /// <param name="ruleBuilderFactory">A factory for rule-builder instances.</param>
 /// <param name="validatorManifestFactory">A factory for validator manifest instances.</param>
 /// <param name="builderContextFactory">A factory for validator builder contexts.</param>
 public ValueAccessorBuilder(ValidatorBuilderContext context,
                             IGetsRuleBuilder ruleBuilderFactory,
                             IGetsValidatorManifest validatorManifestFactory,
                             IGetsValidatorBuilderContext builderContextFactory)
 {
     this.validatorManifestFactory = validatorManifestFactory ?? throw new ArgumentNullException(nameof(validatorManifestFactory));
     this.builderContextFactory    = builderContextFactory ?? throw new ArgumentNullException(nameof(builderContextFactory));
     this.context            = context ?? throw new ArgumentNullException(nameof(context));
     this.ruleBuilderFactory = ruleBuilderFactory ?? throw new ArgumentNullException(nameof(ruleBuilderFactory));
 }
Example #20
0
        /// <summary>
        /// Gets a rule builder instance from the specified context and rule-definition action.
        /// </summary>
        /// <typeparam name="TRule">The type of object which the rule validates.</typeparam>
        /// <param name="context">Contextual information from which to build this rule.</param>
        /// <param name="ruleDefinition">An optional configuration/definition action which will be used to customise the rule.</param>
        /// <returns>A rule builder object.</returns>
        public IBuildsRule <TRule> GetRuleBuilder <TRule>(ValidatorBuilderContext context, Action <IConfiguresRule <TRule> > ruleDefinition)
        {
            var builder = new RuleBuilder <TRule>(context, manifestIdentifierConverter(), manifestIdentifierFactory());

            if (!(ruleDefinition is null))
            {
                ruleDefinition(builder);
            }
            return(builder);
        }
        public void GetPolymorphicContextShouldReturnAContextFromAnExistingPolymorphicTypeIfItExists([ManifestModel] ManifestPolymorphicType polymorphicValue,
                                                                                                     [ManifestModel] ManifestValue manifestValue,
                                                                                                     ValidatorBuilderContextFactory sut)
        {
            manifestValue.PolymorphicTypes.Add(polymorphicValue);
            polymorphicValue.ValidatedType = typeof(string);
            var validationContext = new ValidatorBuilderContext(manifestValue);

            Assert.That(() => sut.GetPolymorphicContext(validationContext, typeof(string))?.ManifestValue,
                        Is.SameAs(polymorphicValue));
        }
Example #22
0
        public void GetValueAccessorBuilderShouldExecuteConfigurationUponBuilder([ManifestModel] ValidatorBuilderContext context,
                                                                                 IGetsRuleBuilder ruleBuilderFactory,
                                                                                 IGetsValidatorManifest validatorManifestFactory,
                                                                                 IGetsValidatorBuilderContext contextFactory)
        {
            var sut = new ValueAccessorBuilderFactory(() => ruleBuilderFactory, () => validatorManifestFactory, () => contextFactory);

            sut.GetValueAccessorBuilder <ValidatedObject, string>(context, c => c.AddRuleWithParent <StringValueRule>());
            Mock.Get(ruleBuilderFactory)
            .Verify(x => x.GetRuleBuilder <StringValueRule>(context, It.IsAny <Action <IConfiguresRule <StringValueRule> > >()), Times.Once);
        }
        public void GetContextForMemberShouldReturnContextWithMemberName([Frozen] IStaticallyReflects reflect,
                                                                         [ManifestModel] ValidatorBuilderContext validationContext,
                                                                         ValidatorBuilderContextFactory sut)
        {
            Mock.Get(reflect)
            .Setup(x => x.Member(It.IsAny <Expression <Func <ValidatedObject, string> > >()))
            .Returns((Expression <Func <ValidatedObject, string> > accessor) => Reflect.Member(accessor));

            var result = sut.GetContextForMember <ValidatedObject, string>(v => v.AProperty, validationContext);

            Assert.That(result.ManifestValue, Has.Property(nameof(ManifestValue.MemberName)).EqualTo(nameof(ValidatedObject.AProperty)));
        }
Example #24
0
        public void AddRulesShouldAddBuilderReturnedFromManifestFactory([Frozen, ManifestModel] ValidatorBuilderContext context,
                                                                        [Frozen] IGetsValidatorManifest manifestFactory,
                                                                        ValidatorBuilder <ValidatedObject> sut,
                                                                        IGetsManifestValue manifest,
                                                                        [ManifestModel] ManifestValue value)
        {
            Mock.Get(manifestFactory)
            .Setup(x => x.GetValidatorManifest(typeof(ValidatedObjectValidator), context))
            .Returns(manifest);
            Mock.Get(manifest).Setup(x => x.GetManifestValue()).Returns(() => value);

            sut.AddRules <ValidatedObjectValidator>();

            Assert.That(sut.GetManifestValue().Children.Single(), Is.SameAs(value));
        }
        ValidatorBuilderContext GetCollectionItemContext(ValidatorBuilderContext parentContext, Type validatedType)
        {
            if (parentContext.ManifestValue.CollectionItemValue != null)
            {
                return(new ValidatorBuilderContext(parentContext.ManifestValue.CollectionItemValue));
            }

            var manifestValue = new ManifestCollectionItem
            {
                Parent        = parentContext.ManifestValue,
                ValidatedType = validatedType,
            };

            parentContext.ManifestValue.CollectionItemValue = manifestValue;
            return(new ValidatorBuilderContext(manifestValue));
        }
Example #26
0
        public void AddRuleShouldAddRuleCreatedFromFactoryUsingContext([Frozen, ManifestModel] ValidatorBuilderContext context,
                                                                       [Frozen] IGetsValidatorBuilderContext ruleContextFactory,
                                                                       [Frozen] IGetsRuleBuilder ruleBuilderFactory,
                                                                       IBuildsRule <ObjectRule> ruleBuilder,
                                                                       ValidatorBuilder <ValidatedObject> sut,
                                                                       [ManifestModel] ManifestValue value)
        {
            Mock.Get(ruleBuilderFactory)
            .Setup(x => x.GetRuleBuilder <ObjectRule>(context, It.IsAny <Action <IConfiguresRule <ObjectRule> > >()))
            .Returns(ruleBuilder);
            Mock.Get(ruleBuilder)
            .Setup(x => x.GetManifestValue())
            .Returns(() => value);

            sut.AddRule <ObjectRule>();

            Assert.That(() => sut.GetManifestValue().Children.Single(), Is.SameAs(value));
        }
Example #27
0
        public void GetValidatorManifestWithRuleContextShouldReturnAValidatorBuilder([Frozen] IServiceProvider serviceProvider,
                                                                                     ImportedValidatorBuilderManifestFactory sut,
                                                                                     IGetsValidatorBuilderContext ruleContextFactory,
                                                                                     IGetsRuleBuilder ruleBuilderFactory,
                                                                                     IGetsValueAccessorBuilder valueBuilderFactory,
                                                                                     IGetsValidatorManifest validatorManifestFactory,
                                                                                     IResolvesServices resolver,
                                                                                     [ManifestModel] ValidatorBuilderContext context)
        {
            Mock.Get(serviceProvider).Setup(x => x.GetService(typeof(IGetsValidatorBuilderContext))).Returns(ruleContextFactory);
            Mock.Get(serviceProvider).Setup(x => x.GetService(typeof(IGetsRuleBuilder))).Returns(ruleBuilderFactory);
            Mock.Get(serviceProvider).Setup(x => x.GetService(typeof(IGetsValueAccessorBuilder))).Returns(valueBuilderFactory);
            Mock.Get(serviceProvider).Setup(x => x.GetService(typeof(IGetsValidatorManifest))).Returns(validatorManifestFactory);
            Mock.Get(serviceProvider).Setup(x => x.GetService(typeof(IResolvesServices))).Returns(resolver);
            Mock.Get(resolver).Setup(x => x.ResolveService <object>(typeof(GenericValidatorDefinition <object>))).Returns(() => new GenericValidatorDefinition <object>());

            var result = sut.GetValidatorManifest(typeof(GenericValidatorDefinition <object>), context);

            Assert.That(result, Is.InstanceOf <ValidatorBuilder <object> >());
        }
        static ValidatorBuilderContext GetContext(Func <object, object> accessor, ValidatorBuilderContext parentContext, Type validatedType, string memberName = null)
        {
            ManifestValue existingManifest;

            if (!(memberName is null) && (existingManifest = parentContext.ManifestValue.Children.OfType <ManifestValue>().FirstOrDefault(x => x.MemberName == memberName)) != null)
            {
                return(new ValidatorBuilderContext(existingManifest));
            }

            var manifestValue = new ManifestValue
            {
                Parent             = parentContext.ManifestValue,
                AccessorFromParent = accessor,
                MemberName         = memberName,
                ValidatedType      = validatedType,
            };

            parentContext.ManifestValue.Children.Add(manifestValue);
            return(new ValidatorBuilderContext(manifestValue));
        }
        public void AddRuleShouldProvideConfigFunctionToRuleBuilder([Frozen] IGetsRuleBuilder ruleBuilderFactory,
                                                                    [Frozen, ManifestModel] ValidatorBuilderContext context,
                                                                    ValueAccessorBuilder <ValidatedObject, string> sut,
                                                                    IBuildsRule <StringValueRule> ruleBuilder,
                                                                    [ManifestModel] ManifestRule rule,
                                                                    [ManifestModel] ManifestValue value)
        {
            Mock.Get(ruleBuilderFactory)
            .Setup(x => x.GetRuleBuilder <StringValueRule>(It.IsAny <ValidatorBuilderContext>(), It.IsAny <Action <IConfiguresRule <StringValueRule> > >()))
            .Returns(ruleBuilder);
            Mock.Get(ruleBuilder)
            .Setup(x => x.GetManifestValue())
            .Returns(() => value);

            Action <IConfiguresRule <StringValueRule> > configFunction = r => { };

            sut.AddRuleWithParent <StringValueRule>(configFunction);

            Mock.Get(ruleBuilderFactory)
            .Verify(x => x.GetRuleBuilder <StringValueRule>(It.IsAny <ValidatorBuilderContext>(), configFunction), Times.Once);
        }
        public void WhenValueIsShouldAddAPolymorphicTypeToTheManifestValue([Frozen] IGetsValidatorBuilderContext contextFactory,
                                                                           [Frozen, ManifestModel] ValidatorBuilderContext context,
                                                                           ValueAccessorBuilder <object, ValidatedObject> sut,
                                                                           [ManifestModel] ManifestPolymorphicType polymorphicType)
        {
            var derivedContext = new ValidatorBuilderContext(polymorphicType);

            Mock.Get(contextFactory).Setup(x => x.GetPolymorphicContext(context, typeof(DerivedValidatedObject))).Returns(derivedContext);
            sut.WhenValueIs <DerivedValidatedObject>(c => { });

            Assert.Multiple(() =>
            {
                var manifestValue = sut.GetManifestValue();
                Assert.That(manifestValue,
                            Is.InstanceOf <IHasPolymorphicTypes>(),
                            "Manifest value has polymorphic types.");
                Assert.That(manifestValue,
                            Has.Property(nameof(IHasPolymorphicTypes.PolymorphicTypes)).One.SameAs(polymorphicType),
                            "Manifest includes expected polymotphic type");
            });
        }