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));
        }
        /// <inheritdoc/>
        public IManifestItem GetManifestItem(ModelToManifestConversionContext context)
        {
            if (context.ConversionType != ModelToManifestConversionType.CollectionItem)
            {
                return(next.GetManifestItem(context));
            }

            var collectionItem = new ManifestCollectionItem
            {
                Parent        = context.ParentManifestValue.Parent,
                ValidatedType = context.ValidatedType,
            };

            if (context.ParentManifestValue is ManifestValueBase mvb)
            {
                mvb.CollectionItemValue = collectionItem;
            }

            return(collectionItem);
        }
        public void GetContextForMemberThatAlreadyExistsAsCollectionItemShouldReturnSameManifestValue([Frozen] IStaticallyReflects reflect,
                                                                                                      [ManifestModel] ValidatorBuilderContext validationContext,
                                                                                                      ValidatorBuilderContextFactory sut,
                                                                                                      [ManifestModel] ManifestCollectionItem collectionValue)
        {
            Mock.Get(reflect)
            .Setup(x => x.Member(It.IsAny <Expression <Func <ValidatedObject, string> > >()))
            .Returns((Expression <Func <ValidatedObject, string> > accessor) => Reflect.Member(accessor));
            validationContext.ManifestValue.CollectionItemValue = collectionValue;

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

            Assert.That(result.ManifestValue, Is.SameAs(collectionValue));
        }