/// <summary>
        /// Creates parameter validators.
        /// </summary>
        /// <param name="parameterInfo">The parameter info of the parameter for which to create the validator.</param>
        /// <param name="parameterValue">The parameter value.</param>
        /// <returns>The created validator.</returns>
        /// <remarks>
        /// The parameter validator must know the actual type of the parameter value.
        /// EL has a bug where they get the type of the parameter from the parameter info instead of the parameter itself -
        /// the parameter may be of a derived type of the formal parameter.
        /// </remarks>
        static Validator CreateParameterValidator(
            ParameterInfo parameterInfo,
            object parameterValue)
        {
            if (parameterInfo == null)
            {
                throw new ArgumentNullException(nameof(parameterInfo));
            }

            var parameterElement = new MetadataValidatedParameterElement();

            // gets the validators metadata
            parameterElement.UpdateFlyweight(parameterInfo);

            // compositions all validators
            var compositeBuilder = new CompositeValidatorBuilder(parameterElement);

            foreach (var descriptor in parameterElement.GetValidatorDescriptors())
            {
                // get the type of the parameter either from the parameter value or from the parameter info if the value is null
                compositeBuilder.AddValueValidator(
                    descriptor.CreateValidator(
                        parameterValue != null
                            ? parameterValue.GetType()
                            : parameterInfo.ParameterType,
                        null,
                        null,
                        ValidationFactory.DefaultCompositeValidatorFactory));
            }

            // returns all validators
            return(compositeBuilder.GetValidator());
        }
Example #2
0
        public void AddedValueValidatorIsIncludedInResultingValidatorForAndWithoutNulls()
        {
            MockValidator <object>    failingValueValidator = new MockValidator <object>(true);
            CompositeValidatorBuilder builder
                = new CompositeValidatorBuilder(new MockValidatedElement(false, null, null,
                                                                         CompositionType.And, null, null));

            builder.AddValueValidator(failingValueValidator);
            Validator validator = builder.GetValidator();

            Assert.IsNotNull(validator);

            // does it validate nonnullvalues?
            ValidationResults validationResults = validator.Validate(value);

            Assert.IsFalse(validationResults.IsValid);
            Assert.AreEqual(1, failingValueValidator.ValidatedTargets.Count);
            Assert.AreSame(value, failingValueValidator.ValidatedTargets[0]);

            // does it ignore nulls? it should not
            validationResults = validator.Validate(null);
            Assert.IsFalse(validationResults.IsValid);
            Assert.AreEqual(2, failingValueValidator.ValidatedTargets.Count);
            Assert.AreSame(null, failingValueValidator.ValidatedTargets[1]);
        }
Example #3
0
        public void CanCreateValidatorForTypeWithMultipleValidatorConfigurations()
        {
            ValidationRulesetData ruleData = new ValidationRulesetData("ruleset1");

            ruleData.Validators.Add(new MockValidatorData("validator1", false));
            ruleData.Validators.Get("validator1").MessageTemplate = "validator 1 message";
            ruleData.Validators.Add(new MockValidatorData("validator2", false));
            ruleData.Validators.Get("validator2").MessageTemplate = "validator 2 message";

            Validator validator = builder.CreateValidatorForType(typeof(TestClass), ruleData);

            Assert.IsNotNull(validator);

            CompositeValidatorBuilder compositeValidatorBuilder = mockFactory.requestedTypes["TestClass"];

            Assert.IsNotNull(compositeValidatorBuilder);
            Assert.AreSame(compositeValidatorBuilder.BuiltValidator, validator);
            Assert.AreEqual(false, compositeValidatorBuilder.IgnoreNulls);
            Assert.AreEqual(CompositionType.And, compositeValidatorBuilder.CompositionType);
            IDictionary <string, MockValidator <object> > valueValidators = ValidationTestHelper.CreateMockValidatorsMapping(compositeValidatorBuilder.ValueValidators);

            Assert.AreEqual(2, valueValidators.Count);
            Assert.IsTrue(valueValidators.ContainsKey("validator 1 message"));
            Assert.IsTrue(valueValidators.ContainsKey("validator 2 message"));
        }
Example #4
0
        public void IgnoreNullsAndOrCompositionCreatesOrValidatorWithIgnoreNullsMessageTemplateAndWrappedOrValidatorWithSuppliedMessageTemplate()
        {
            MockValidator <object>    valueValidator1 = new MockValidator <object>(false);
            MockValidator <object>    valueValidator2 = new MockValidator <object>(false);
            CompositeValidatorBuilder builder
                = new CompositeValidatorBuilder(new MockValidatedElement(true, "ignore nulls", null,
                                                                         CompositionType.Or, "composition template", "composition tag"));

            builder.AddValueValidator(valueValidator1);
            builder.AddValueValidator(valueValidator2);
            Validator validator = builder.GetValidator();

            Assert.IsNotNull(validator);
            Assert.AreSame(typeof(OrCompositeValidator), validator.GetType());
            Assert.AreEqual("ignore nulls", validator.MessageTemplate);
            Assert.AreEqual(null, validator.Tag);
            IEnumerator <Validator> validatorsEnumerator = ((OrCompositeValidator)validator).Validators.GetEnumerator();

            Assert.IsTrue(validatorsEnumerator.MoveNext());
            Assert.AreSame(typeof(NotNullValidator), validatorsEnumerator.Current.GetType());
            Assert.IsTrue(((NotNullValidator)validatorsEnumerator.Current).Negated);
            Assert.IsTrue(validatorsEnumerator.MoveNext());
            Assert.AreSame(typeof(OrCompositeValidator), validatorsEnumerator.Current.GetType());
            Assert.AreEqual("composition template", validatorsEnumerator.Current.MessageTemplate);
            Assert.AreEqual("composition tag", validatorsEnumerator.Current.Tag);
            IEnumerator <Validator> valueValidatorsEnumerator = ((OrCompositeValidator)validatorsEnumerator.Current).Validators.GetEnumerator();

            Assert.IsTrue(valueValidatorsEnumerator.MoveNext());
            Assert.AreSame(valueValidator1, valueValidatorsEnumerator.Current);
            Assert.IsTrue(valueValidatorsEnumerator.MoveNext());
            Assert.AreSame(valueValidator2, valueValidatorsEnumerator.Current);
            Assert.IsFalse(valueValidatorsEnumerator.MoveNext());
            Assert.IsFalse(validatorsEnumerator.MoveNext());
        }
Example #5
0
        public void IgnoreNullsWithNullMessageTemplateAndAndCompositionCreatesOrValidatorWithIgnoreNullsDefaultMessageTemplateAndWrappedAndValidator()
        {
            MockValidator <object>    valueValidator1 = new MockValidator <object>(false);
            MockValidator <object>    valueValidator2 = new MockValidator <object>(false);
            CompositeValidatorBuilder builder
                = new CompositeValidatorBuilder(new MockValidatedElement(true, null, "ignore nulls tag",
                                                                         CompositionType.And, null, null));

            builder.AddValueValidator(valueValidator1);
            builder.AddValueValidator(valueValidator2);
            Validator validator = builder.GetValidator();

            Assert.IsNotNull(validator);
            Assert.AreSame(typeof(OrCompositeValidator), validator.GetType());
            Assert.AreEqual(Resources.IgnoreNullsDefaultMessageTemplate, validator.MessageTemplate);
            Assert.AreEqual("ignore nulls tag", validator.Tag);
            IEnumerator <Validator> validatorsEnumerator = ((OrCompositeValidator)validator).Validators.GetEnumerator();

            Assert.IsTrue(validatorsEnumerator.MoveNext());
            Assert.AreSame(typeof(NotNullValidator), validatorsEnumerator.Current.GetType());
            Assert.IsTrue(((NotNullValidator)validatorsEnumerator.Current).Negated);
            Assert.IsTrue(validatorsEnumerator.MoveNext());
            Assert.AreSame(typeof(AndCompositeValidator), validatorsEnumerator.Current.GetType());
            IEnumerator <Validator> valueValidatorsEnumerator = ((AndCompositeValidator)validatorsEnumerator.Current).Validators.GetEnumerator();

            Assert.IsTrue(valueValidatorsEnumerator.MoveNext());
            Assert.AreSame(valueValidator1, valueValidatorsEnumerator.Current);
            Assert.IsTrue(valueValidatorsEnumerator.MoveNext());
            Assert.AreSame(valueValidator2, valueValidatorsEnumerator.Current);
            Assert.IsFalse(valueValidatorsEnumerator.MoveNext());
            Assert.IsFalse(validatorsEnumerator.MoveNext());
        }
Example #6
0
        public override CompositeValidatorBuilder GetTypeValidatorBuilder(Type type,
                                                                          IValidatedElement validatedElement)
        {
            CompositeValidatorBuilder validatorBuilder = base.GetTypeValidatorBuilder(type, validatedElement);

            this.requestedTypes.Add(type.Name, validatorBuilder);
            return(validatorBuilder);
        }
        public void CanGetValidatorFromNewBuilderInstanceForAndWithoutNulls()
        {
            CompositeValidatorBuilder builder
                = new CompositeValidatorBuilder(new MockValidatedElement(false, null, null,
                                                                         CompositionType.And, null, null));

            Validator validator = builder.GetValidator();

            Assert.IsNotNull(validator);
        }
Example #8
0
        public void CanGetValidatorFromNewBuilderInstanceForAndWithoutNulls()
        {
            CompositeValidatorBuilder builder
                = new CompositeValidatorBuilder(new MockValidatedElement(false, null, null,
                                                                         CompositionType.And, null, null));

            Validator validator = builder.GetValidator();

            Assert.IsNotNull(validator);
        }
Example #9
0
        public void CanCreateValidatorForTypeWithMultipleValidationConfigurationWithProvidedRulesetThroughTopLevelFactoryMethod()
        {
            ValidationSettings settings = new ValidationSettings();

            configurationSource.Add(ValidationSettings.SectionName, settings);
            ValidatedTypeReference typeReference = new ValidatedTypeReference(typeof(TestClass));

            settings.Types.Add(typeReference);
            typeReference.DefaultRuleset = "RuleB";
            ValidationRulesetData ruleDataA = new ValidationRulesetData("RuleA");

            typeReference.Rulesets.Add(ruleDataA);
            ruleDataA.Validators.Add(new MockValidatorData("validator1", false));
            ruleDataA.Validators.Get("validator1").MessageTemplate = "Message1-RuleA";
            ruleDataA.Validators.Add(new MockValidatorData("validator2", false));
            ruleDataA.Validators.Get("validator2").MessageTemplate = "Message2-RuleA";
            ruleDataA.Validators.Add(new MockValidatorData("validator3", false));
            ruleDataA.Validators.Get("validator3").MessageTemplate = "Message3-RuleA";
            ValidationRulesetData ruleDataB = new ValidationRulesetData("RuleB");

            typeReference.Rulesets.Add(ruleDataB);
            ruleDataB.Validators.Add(new MockValidatorData("validator1", false));
            ruleDataB.Validators.Get("validator1").MessageTemplate = "Message1-RuleB";
            ruleDataB.Validators.Add(new MockValidatorData("validator2", false));
            ruleDataB.Validators.Get("validator2").MessageTemplate = "Message1-RuleB";

            // Note: Use a local builder here since the assumption was made about how and when the
            //       the builder uses the configuration source....
            var localBuilder =
                ConfigurationValidatorBuilder.FromConfiguration(
                    configurationSource,
                    mockFactory,
                    ValidationFactory.DefaultCompositeValidatorFactory);
            Validator validator = localBuilder.CreateValidator(typeof(TestClass), "RuleA");

            Assert.IsNotNull(validator);
            CompositeValidatorBuilder compositeValidatorBuilder = mockFactory.requestedTypes["TestClass"];

            Assert.IsNotNull(compositeValidatorBuilder);
            Assert.AreEqual(false, compositeValidatorBuilder.IgnoreNulls);
            Assert.AreEqual(CompositionType.And, compositeValidatorBuilder.CompositionType);
            IDictionary <string, MockValidator <object> > valueValidators = ValidationTestHelper.CreateMockValidatorsMapping(compositeValidatorBuilder.ValueValidators);

            Assert.AreEqual(3, valueValidators.Count);
            Assert.IsTrue(valueValidators.ContainsKey("Message1-RuleA"));
            Assert.IsTrue(valueValidators.ContainsKey("Message2-RuleA"));
            Assert.IsTrue(valueValidators.ContainsKey("Message3-RuleA"));
        }
        public void NoIgnoreNullsAndAndCompositionCreatesSingleAndValidator()
        {
            MockValidator<object> valueValidator1 = new MockValidator<object>(false);
            MockValidator<object> valueValidator2 = new MockValidator<object>(false);
            CompositeValidatorBuilder builder
                = new CompositeValidatorBuilder(new MockValidatedElement(false, null, null,
                                                                         CompositionType.And, null, null));

            builder.AddValueValidator(valueValidator1);
            builder.AddValueValidator(valueValidator2);
            Validator validator = builder.GetValidator();

            Assert.IsNotNull(validator);
            Assert.AreSame(typeof(AndCompositeValidator), validator.GetType());
            Assert.AreEqual(null, validator.Tag);
            IEnumerator<Validator> valueValidatorsEnumerator = ((AndCompositeValidator)validator).Validators.GetEnumerator();
            Assert.IsTrue(valueValidatorsEnumerator.MoveNext());
            Assert.AreSame(valueValidator1, valueValidatorsEnumerator.Current);
            Assert.IsTrue(valueValidatorsEnumerator.MoveNext());
            Assert.AreSame(valueValidator2, valueValidatorsEnumerator.Current);
            Assert.IsFalse(valueValidatorsEnumerator.MoveNext());
        }
Example #11
0
        public void NoIgnoreNullsAndAndCompositionCreatesSingleAndValidator()
        {
            MockValidator <object>    valueValidator1 = new MockValidator <object>(false);
            MockValidator <object>    valueValidator2 = new MockValidator <object>(false);
            CompositeValidatorBuilder builder
                = new CompositeValidatorBuilder(new MockValidatedElement(false, null, null,
                                                                         CompositionType.And, null, null));

            builder.AddValueValidator(valueValidator1);
            builder.AddValueValidator(valueValidator2);
            Validator validator = builder.GetValidator();

            Assert.IsNotNull(validator);
            Assert.AreSame(typeof(AndCompositeValidator), validator.GetType());
            Assert.AreEqual(null, validator.Tag);
            IEnumerator <Validator> valueValidatorsEnumerator = ((AndCompositeValidator)validator).Validators.GetEnumerator();

            Assert.IsTrue(valueValidatorsEnumerator.MoveNext());
            Assert.AreSame(valueValidator1, valueValidatorsEnumerator.Current);
            Assert.IsTrue(valueValidatorsEnumerator.MoveNext());
            Assert.AreSame(valueValidator2, valueValidatorsEnumerator.Current);
            Assert.IsFalse(valueValidatorsEnumerator.MoveNext());
        }
Example #12
0
        public void IgnoreNullsAndAndCompositionCreatesIgnoreNullsWrapperAndWrappedAndValidator()
        {
            MockValidator <object>    valueValidator1 = new MockValidator <object>(false);
            MockValidator <object>    valueValidator2 = new MockValidator <object>(false);
            CompositeValidatorBuilder builder
                = new CompositeValidatorBuilder(new MockValidatedElement(true, "ignore nulls", "ignore nulls tag",
                                                                         CompositionType.And, null, null));

            builder.AddValueValidator(valueValidator1);
            builder.AddValueValidator(valueValidator2);
            Validator validator = builder.GetValidator();

            Assert.IsNotNull(validator);
            Assert.AreSame(typeof(NullIgnoringValidatorWrapper), validator.GetType());
            Assert.AreSame(typeof(AndCompositeValidator), ((NullIgnoringValidatorWrapper)validator).WrappedValidator.GetType());
            IEnumerator <Validator> valueValidatorsEnumerator = ((AndCompositeValidator)((NullIgnoringValidatorWrapper)validator).WrappedValidator).Validators.GetEnumerator();

            Assert.IsTrue(valueValidatorsEnumerator.MoveNext());
            Assert.AreSame(valueValidator1, valueValidatorsEnumerator.Current);
            Assert.IsTrue(valueValidatorsEnumerator.MoveNext());
            Assert.AreSame(valueValidator2, valueValidatorsEnumerator.Current);
            Assert.IsFalse(valueValidatorsEnumerator.MoveNext());
        }
        public void AddedValueValidatorIsIncludedInResultingValidatorForAndWithoutNulls()
        {
            MockValidator<object> failingValueValidator = new MockValidator<object>(true);
            CompositeValidatorBuilder builder
                = new CompositeValidatorBuilder(new MockValidatedElement(false, null, null,
                                                                         CompositionType.And, null, null));

            builder.AddValueValidator(failingValueValidator);
            Validator validator = builder.GetValidator();

            Assert.IsNotNull(validator);

            // does it validate nonnullvalues?
            ValidationResults validationResults = validator.Validate(value);
            Assert.IsFalse(validationResults.IsValid);
            Assert.AreEqual(1, failingValueValidator.ValidatedTargets.Count);
            Assert.AreSame(value, failingValueValidator.ValidatedTargets[0]);

            // does it ignore nulls? it should not
            validationResults = validator.Validate(null);
            Assert.IsFalse(validationResults.IsValid);
            Assert.AreEqual(2, failingValueValidator.ValidatedTargets.Count);
            Assert.AreSame(null, failingValueValidator.ValidatedTargets[1]);
        }
        public void IgnoreNullsAndOrCompositionCreatesIgnoreNullsWrapperAndWrappedOrValidatorWithSuppliedMessageTemplate()
        {
            MockValidator<object> valueValidator1 = new MockValidator<object>(false);
            MockValidator<object> valueValidator2 = new MockValidator<object>(false);
            CompositeValidatorBuilder builder
                = new CompositeValidatorBuilder(new MockValidatedElement(true, "ignore nulls", null,
                                                                         CompositionType.Or, "composition template", "composition tag"));

            builder.AddValueValidator(valueValidator1);
            builder.AddValueValidator(valueValidator2);
            Validator validator = builder.GetValidator();

            Assert.IsNotNull(validator);
            Assert.AreSame(typeof(NullIgnoringValidatorWrapper), validator.GetType());
            Assert.AreSame(typeof(OrCompositeValidator), ((NullIgnoringValidatorWrapper)validator).WrappedValidator.GetType());
            Assert.AreEqual("composition template", ((NullIgnoringValidatorWrapper)validator).WrappedValidator.MessageTemplate);
            Assert.AreEqual("composition tag", ((NullIgnoringValidatorWrapper)validator).WrappedValidator.Tag);
            IEnumerator<Validator> valueValidatorsEnumerator = ((OrCompositeValidator)((NullIgnoringValidatorWrapper)validator).WrappedValidator).Validators.GetEnumerator();
            Assert.IsTrue(valueValidatorsEnumerator.MoveNext());
            Assert.AreSame(valueValidator1, valueValidatorsEnumerator.Current);
            Assert.IsTrue(valueValidatorsEnumerator.MoveNext());
            Assert.AreSame(valueValidator2, valueValidatorsEnumerator.Current);
            Assert.IsFalse(valueValidatorsEnumerator.MoveNext());
        }
        public void IgnoreNullsAndAndCompositionCreatesIgnoreNullsWrapperAndWrappedAndValidator()
        {
            MockValidator<object> valueValidator1 = new MockValidator<object>(false);
            MockValidator<object> valueValidator2 = new MockValidator<object>(false);
            CompositeValidatorBuilder builder
                = new CompositeValidatorBuilder(new MockValidatedElement(true, "ignore nulls", "ignore nulls tag",
                                                                         CompositionType.And, null, null));

            builder.AddValueValidator(valueValidator1);
            builder.AddValueValidator(valueValidator2);
            Validator validator = builder.GetValidator();

            Assert.IsNotNull(validator);
            Assert.AreSame(typeof(NullIgnoringValidatorWrapper), validator.GetType());
            Assert.AreSame(typeof(AndCompositeValidator), ((NullIgnoringValidatorWrapper)validator).WrappedValidator.GetType());
            IEnumerator<Validator> valueValidatorsEnumerator = ((AndCompositeValidator)((NullIgnoringValidatorWrapper)validator).WrappedValidator).Validators.GetEnumerator();
            Assert.IsTrue(valueValidatorsEnumerator.MoveNext());
            Assert.AreSame(valueValidator1, valueValidatorsEnumerator.Current);
            Assert.IsTrue(valueValidatorsEnumerator.MoveNext());
            Assert.AreSame(valueValidator2, valueValidatorsEnumerator.Current);
            Assert.IsFalse(valueValidatorsEnumerator.MoveNext());
        }
Example #16
0
        /// <summary>
        /// Crée un validator de propriété.
        /// </summary>
        /// <param name="attribute">L'attribut de validation.</param>
        /// <param name="validatedElement">La propriété validée.</param>
        /// <param name="builder">Le constructeur de validation composite.</param>
        /// <param name="mainValidatorFactory">La brique à utiliser lors de la construction des validateurs imbriqués..</param>
        /// <returns>La validateur de propriété.</returns>
        protected Validator CreateValidatorForValidatedElement(IValidatorDescriptor attribute, IValidatedElement validatedElement, CompositeValidatorBuilder builder, ValidatorFactory mainValidatorFactory)
        {
            Validator valueValidator = attribute.CreateValidator(validatedElement.TargetType, validatedElement.MemberInfo.ReflectedType, new MemberAccessValidatorBuilderFactory().MemberValueAccessBuilder, mainValidatorFactory);

            builder.AddValueValidator(valueValidator);

            return(builder.GetValidator());
        }