public void ValidatorShouldValidateUsingDataAnnotationAttributesWithSystemMetadata()
        {
            var result       = new ValidationResult("error", new[] { DisplayName });
            var dictionary   = new Dictionary <object, object>();
            var propertyInfo = typeof(MetadataValidationClassSystem).GetPropertyEx(SpyPropertyName);

            DisplayNameProvider.GetNameDelegate = info =>
            {
                info.ShouldEqual(propertyInfo);
                return(DisplayName + propertyInfo.Name);
            };
            DataAnnotationValidatior.GetValidationElementsDelegate = null;
            DataAnnotationValidatior.ElementsCache.Clear();
            DataAnnotationValidatior.DisplayNameProvider = null;
            var validationClass = new MetadataValidationClassSystem {
                SpyProperty = "Test"
            };
            var validationContext = new DataAnnotationValidatior.ValidationContext(validationClass, IocContainer, dictionary);

            SpyValidationAttribute.IsValidDelegate = (o, context) =>
            {
                o.ShouldEqual(validationClass.SpyProperty);
                context.DisplayName.ShouldEqual(DisplayName + propertyInfo.Name);
                context.Items[DataAnnotationValidatior.ServiceProviderKey].ShouldEqual(IocContainer);
                context.MemberName.ShouldEqual(SpyPropertyName);
                return(result);
            };
            var validationElements = DataAnnotationValidatior.GetValidationElements(validationClass)[SpyPropertyName];

            validationElements.Count.ShouldEqual(2);

            var validationResults = validationElements
                                    .SelectMany(element => element.Validate(validationContext))
                                    .ToArray();

            validationResults.Length.ShouldEqual(1);
            var validationResult = validationResults.OfType <ValidationResult>().Single();

            validationResult.MemberNames.SequenceEqual(result.MemberNames).ShouldBeTrue();
            validationResult.ErrorMessage.ShouldEqual(result.ErrorMessage);
        }
        public void ValidatorShouldValidateUsingDataAnnotationAttributesWithSystemMetadata()
        {
            var result = new ValidationResult("error", new[] { DisplayName });
            var dictionary = new Dictionary<object, object>();
            var propertyInfo = typeof(MetadataValidationClassSystem).GetProperty(SpyPropertyName);
            DisplayNameProvider.GetNameDelegate = info =>
            {
                info.ShouldEqual(propertyInfo);
                return DisplayName + propertyInfo.Name;
            };
            DataAnnotationValidatior.GetValidationElementsDelegate = null;
            DataAnnotationValidatior.ElementsCache.Clear();
            DataAnnotationValidatior.DisplayNameProvider = null;
            var validationClass = new MetadataValidationClassSystem { SpyProperty = "Test" };
            var validationContext = new DataAnnotationValidatior.ValidationContext(validationClass, IocContainer, dictionary);
            SpyValidationAttribute.IsValidDelegate = (o, context) =>
            {
                o.ShouldEqual(validationClass.SpyProperty);
                context.DisplayName.ShouldEqual(DisplayName + propertyInfo.Name);
                context.Items[DataAnnotationValidatior.ServiceProviderKey].ShouldEqual(IocContainer);
                context.MemberName.ShouldEqual(SpyPropertyName);
                return result;
            };
            var validationElements = DataAnnotationValidatior.GetValidationElements(validationClass)[SpyPropertyName];
            validationElements.Count.ShouldEqual(2);

            var validationResults = validationElements
                .SelectMany(element => element.Validate(validationContext))
                .ToArray();
            validationResults.Length.ShouldEqual(1);
            var validationResult = validationResults.OfType<ValidationResult>().Single();
            validationResult.MemberNames.SequenceEqual(result.MemberNames).ShouldBeTrue();
            validationResult.ErrorMessage.ShouldEqual(result.ErrorMessage);
        }