Example #1
0
        /// <summary>
        /// Gets a builder for validating a value of a validated object (typically retrieved via member access).
        /// </summary>
        /// <typeparam name="TValidated">The type of the primary object under validation.</typeparam>
        /// <typeparam name="TValue">The type of the derived value to be validated.</typeparam>
        /// <param name="ValidatorBuilderContext">Contextual information about how validation rules should be built.</param>
        /// <param name="valueConfig">An action which configures the value accessor-builder.</param>
        /// <returns>A builder for validating the derived value.</returns>
        public IBuildsValueAccessor <TValidated, TValue> GetValueAccessorBuilder <TValidated, TValue>(ValidatorBuilderContext ValidatorBuilderContext,
                                                                                                      Action <IConfiguresValueAccessor <TValidated, TValue> > valueConfig)
        {
            var builder = new ValueAccessorBuilder <TValidated, TValue>(ValidatorBuilderContext,
                                                                        ruleBuilderFactory(),
                                                                        validatorManifestFactory(),
                                                                        contextFactory());

            if (!(valueConfig is null))
            {
                valueConfig(builder);
            }

            return(builder);
        }
        public void AddRulesShouldAddBuilderReturnedFromManifestFactory([Frozen] IGetsValidatorManifest manifestFactory,
                                                                        [Frozen, ManifestModel] ValidatorBuilderContext context,
                                                                        ValueAccessorBuilder <ValidatedObject, string> sut,
                                                                        IGetsManifestValue manifest,
                                                                        [ManifestModel] ManifestRule rule,
                                                                        [ManifestModel] ManifestValue value)
        {
            Mock.Get(manifestFactory)
            .Setup(x => x.GetValidatorManifest(typeof(StringValidator), context))
            .Returns(manifest);
            Mock.Get(manifest).Setup(x => x.GetManifestValue()).Returns(() => value);

            sut.AddRules <StringValidator>();

            Assert.That(sut.GetManifestValue().Children.Single(), Is.SameAs(value));
        }
Example #3
0
        /// <inheritdoc/>
        public IConfiguresValueAccessor <TValidated, TValue> WhenValueIs <TDerived>(Action <IConfiguresValueAccessor <TValidated, TDerived> > derivedConfig)
            where TDerived : TValue
        {
            var derivedContext = builderContextFactory.GetPolymorphicContext(context, typeof(TDerived));
            var derivedBuilder = new ValueAccessorBuilder <TValidated, TDerived>(derivedContext,
                                                                                 ruleBuilderFactory,
                                                                                 validatorManifestFactory,
                                                                                 builderContextFactory);

            if (!(derivedConfig is null))
            {
                derivedConfig(derivedBuilder);
            }
            ruleBuilders.Add(derivedBuilder);

            return(this);
        }
        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");
            });
        }
        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 GetManifestRulesShouldIterateOverEveryRuleAdded([Frozen, ManifestModel] ValidatorBuilderContext context,
                                                                    [Frozen] IGetsRuleBuilder ruleBuilderFactory,
                                                                    ValueAccessorBuilder <ValidatedObject, string> sut,
                                                                    [ManifestModel] ManifestValue value)
        {
            Mock.Get(ruleBuilderFactory)
            .Setup(x => x.GetRuleBuilder <StringValueRule>(It.IsAny <ValidatorBuilderContext>(), It.IsAny <Action <IConfiguresRule <StringValueRule> > >()))
            .Returns(() => {
                var ruleBuilder = new Mock <IBuildsRule <StringValueRule> >();
                ruleBuilder
                .Setup(x => x.GetManifestValue())
                .Returns(() => value);
                return(ruleBuilder.Object);
            });

            sut.AddRuleWithParent <StringValueRule>();
            sut.AddRuleWithParent <StringValueRule>();

            var manifestRules = sut.GetManifestValue().Rules.ToList();

            Mock.Get(ruleBuilderFactory)
            .Verify(x => x.GetRuleBuilder <StringValueRule>(context, It.IsAny <Action <IConfiguresRule <StringValueRule> > >()),
                    Times.Exactly(2));
        }
 public void GetManifestValueShouldNotMarkTheManifestValueWithAnExceptionBehaviourIfAccessorExceptionBehaviourWasNotCalled([Frozen, ManifestModel] ValidatorBuilderContext context,
                                                                                                                           ValueAccessorBuilder <ValidatedObject, string> sut)
 {
     ((ManifestValue)context.ManifestValue).AccessorExceptionBehaviour = null;
     Assert.That(() => sut.GetManifestValue(), Has.Property(nameof(ManifestValue.AccessorExceptionBehaviour)).Null);
 }
 public void AccessorExceptionBehaviourShouldMarkTheManifestValueWithThatBehaviour([Frozen, ManifestModel] ValidatorBuilderContext context,
                                                                                   ValueAccessorBuilder <ValidatedObject, string> sut,
                                                                                   ValueAccessExceptionBehaviour behaviour)
 {
     ((ManifestValue)context.ManifestValue).AccessorExceptionBehaviour = behaviour;
     sut.AccessorExceptionBehaviour(behaviour);
     Assert.That(() => sut.GetManifestValue(), Has.Property(nameof(ManifestValue.AccessorExceptionBehaviour)).EqualTo(behaviour));
 }