private Validator <object> GetValidator()
        {
            var builder = new ValidatorBuilder <object>();

            builder.AddPropertyFilter(_ => true);
            builder.AddKnownType <TestClass>();
            builder.AddEmptyConstraint();

            return(builder.Build());
        }
        /// <summary>
        /// Add a property filter to <see cref="ValidatorBuilder{TOptions}"/> for <typeparamref name="TProperty"/>.
        /// </summary>
        /// <typeparam name="TProperty">Property to add a filter for.</typeparam>
        /// <param name="memberExpression">Expression to identify the property.</param>
        /// <returns>The current <see cref="ValidatorPropertyBuilder{TType, TState}"/>.</returns>
        public ValidatorPropertyBuilder <TType, TState> AddProperty <TProperty>(Expression <Func <TType, TProperty> > memberExpression)
        {
            if (memberExpression.Body is MemberExpression member && member.Member is PropertyInfo property)
            {
                _builder.AddPropertyFilter(p => p == property);
                return(this);
            }

            throw new InvalidOperationException(SR.ExpressionPropertyRequired);
        }
Exemple #3
0
        public async Task AsyncValidation()
        {
            const int ParallelCount = 2;

            var list    = new HashSet <int>();
            var cts     = new CancellationTokenSource();
            var builder = new ValidatorBuilder <object>();

            builder.AddKnownType <RecursiveClass>();
            builder.AddPropertyFilter <RecursiveClass>();
            builder.AddConstraint(_ => new DelegateConstraint(instanceValue =>
            {
                lock (list)
                {
                    if (Task.CurrentId.HasValue)
                    {
                        list.Add(Task.CurrentId.Value);
                    }
                }

                return(true);
            }));
            var validator = builder.Build();

            var instance = new RecursiveClass
            {
                Entry1 = new RecursiveClass
                {
                    Entry1 = new RecursiveClass
                    {
                    },
                    Entry2 = new RecursiveClass
                    {
                    },
                },
                Entry2 = new RecursiveClass
                {
                    Entry1 = new RecursiveClass
                    {
                    },
                    Entry2 = new RecursiveClass
                    {
                    },
                },
            };

            var context = new TestValidationContext();

            context.Context.MaxDegreeOfParallelism = ParallelCount;
            await validator.ValidateAsync(instance, context.Context).ConfigureAwait(false);

            Assert.Equal(ParallelCount, list.Count);
        }
Exemple #4
0
        public void TestStruct()
        {
            var count   = 0;
            var builder = new ValidatorBuilder <object>();

            builder.AddKnownType <CustomStruct>();
            builder.AddPropertyFilter(_ => true);
            builder.AddConstraint(_ => new DelegateConstraint(() =>
            {
                count++;
                return(true);
            }));
            var validator = builder.Build();

            validator.Validate(default(CustomStruct), null);

            Assert.Equal(1, count);
        }
Exemple #5
0
        public void AbstractPropertyTest()
        {
            var count   = 0;
            var builder = new ValidatorBuilder <object>();

            builder.AddKnownType <TestWithAbstractProperty>();
            builder.AddPropertyFilter <TestWithAbstractProperty>();
            builder.AddConstraint(_ => new DelegateConstraint(instanceValue =>
            {
                var value = Assert.IsType <string>(instanceValue);
                Assert.Equal(nameof(TestWithDerivedAbstractProperty), value);
                count++;
                return(true);
            }));
            var validator = builder.Build();

            validator.Validate(new TestWithDerivedAbstractProperty(), null);

            Assert.Equal(1, count);
        }
        public void RecursiveDescentBySubtype()
        {
            var instance1 = new TestClass();
            var instance  = new TestClass
            {
                Value = instance1,
            };

            instance1.Value = instance;

            var builder = new ValidatorBuilder <object>();

            builder.AddKnownType <TestClass>();
            builder.AddPropertyFilter <TestClassBase>();
            builder.AddEmptyConstraint();
            var validator = builder.Build();
            var context   = new TestValidationContext();

            validator.Validate(instance, context.Context);

            Assert.Empty(context.Errors);
            Assert.Equal(2, context.Items.Count);
        }