public void Validate_TypeWithArrayOfCustomNestedTypesWithArrayPropertyIsSetupPartially_Fails()
        {
            var instance = new TypeWithArrayOfCustomNestedTypes
            {
                NestedTypeArray = new[]
                {
                    null, // Should fail coz collection element is required.
                    new NestedType {
                        NestedProperty = "Some value"
                    },
                    new NestedType() // Should fail coz there is no setup required property.
                }
            };

            var result = RecursiveValidator.Validate(instance);

            result.Should().BeOfType <FailedResult>()
            .Which.Code.Should().Be(CoreErrorCodes.ValidationFailed.Code);

            var errorDetails = ((FailedResult)result).Details.ToArray();

            errorDetails.Length.Should().Be(3);
            errorDetails[0].Source.Should().Be($"{nameof(TypeWithArrayOfCustomNestedTypes)}.{nameof(TypeWithArrayOfCustomNestedTypes.Property)}");
            errorDetails[0].CodeInfo.Code.Should().BeEquivalentTo(AnnotationErrorCodes.Required.Code);
            errorDetails[1].Source.Should().Be($"{nameof(TypeWithArrayOfCustomNestedTypes)}.{nameof(TypeWithArrayOfCustomNestedTypes.NestedTypeArray)}.0");
            errorDetails[1].CodeInfo.Code.Should().BeEquivalentTo(AnnotationErrorCodes.Required.Code);
            errorDetails[2].Source.Should().Be($"{nameof(TypeWithArrayOfCustomNestedTypes)}.{nameof(TypeWithArrayOfCustomNestedTypes.NestedTypeArray)}.2.{nameof(NestedType.NestedProperty)}");
            errorDetails[2].CodeInfo.Code.Should().BeEquivalentTo(AnnotationErrorCodes.Required.Code);
        }
        public void Validate_TypeWithArrayOfCustomNestedTypesWithArrayPropertyHasUkrainianLetters_Fails()
        {
            var instance = new TypeWithArrayOfCustomNestedTypes
            {
                Property        = "Some property",
                NestedTypeArray = new[]
                {
                    new NestedType {
                        NestedProperty = "Some value"
                    },
                    new NestedType {
                        NestedProperty = "я люблю українську мову"
                    }                                                             // Should fail coz of regular expression verification.
                }
            };

            var result = RecursiveValidator.Validate(instance);

            result.Should().BeOfType <FailedResult>()
            .Which.Code.Should().Be(CoreErrorCodes.ValidationFailed.Code);

            var errorDetails = ((FailedResult)result).Details.ToArray();

            errorDetails.Length.Should().Be(1);
            errorDetails[0].Source.Should().Be($"{nameof(TypeWithArrayOfCustomNestedTypes)}.{nameof(TypeWithArrayOfCustomNestedTypes.NestedTypeArray)}.1.{nameof(NestedType.NestedProperty)}");
            errorDetails[0].CodeInfo.Code.Should().BeEquivalentTo(AnnotationErrorCodes.RegularExpression.Code);
        }
        public void Validate_TypeWithArrayOfCustomNestedTypesIsNotSetup_Fails()
        {
            var instance = new TypeWithArrayOfCustomNestedTypes();

            var result = RecursiveValidator.Validate(instance);

            result.Should().BeOfType <FailedResult>();

            var errorDetails = ((FailedResult)result).Details.ToArray();

            errorDetails[0].Source.Should().Be($"{nameof(TypeWithArrayOfCustomNestedTypes)}.{nameof(TypeWithArrayOfCustomNestedTypes.Property)}");
            errorDetails[0].CodeInfo.Code.Should().BeEquivalentTo(AnnotationErrorCodes.Required.Code);
            errorDetails[1].Source.Should().Be($"{nameof(TypeWithArrayOfCustomNestedTypes)}.{nameof(TypeWithArrayOfCustomNestedTypes.NestedTypeArray)}");
            errorDetails[1].CodeInfo.Code.Should().BeEquivalentTo(AnnotationErrorCodes.NotEmpty.Code);
        }
        public void Validate_TypeWithArrayOfCustomNestedTypes_SuccessTest()
        {
            var instance = new TypeWithArrayOfCustomNestedTypes
            {
                Property        = "Some property",
                NestedTypeArray = new[]
                {
                    new NestedType {
                        NestedProperty = "Some value"
                    },
                    new NestedType {
                        NestedProperty = "Some another value"
                    }                                                        // Should fail coz of regular expression verification.
                }
            };

            var result = RecursiveValidator.Validate(instance);

            result.Success.Should().BeTrue();
        }
        public void Validate_TypeWithArrayOfCustomNestedTypesWithStringsArrayIsInvalid_Fails()
        {
            var instance = new TypeWithArrayOfCustomNestedTypes
            {
                Property        = "Some property",
                NestedTypeArray = new[]
                {
                    new NestedType {
                        NestedProperty = "Some value"
                    },
                    new NestedType
                    {
                        NestedProperty = "Some another value",
                        StringsArray   = new[]
                        {
                            "123",                    // String is too short.
                            "some valid value",
                            "я люблю українську мову" // String contsins not English letters.
                        }
                    },
                }
            };

            var result = RecursiveValidator.Validate(instance);

            result.Should().BeOfType <FailedResult>()
            .Which.Code.Should().Be(CoreErrorCodes.ValidationFailed.Code);

            var errorDetails = ((FailedResult)result).Details.ToArray();

            errorDetails.Length.Should().Be(2);
            errorDetails[0].Source.Should().Be($"{nameof(TypeWithArrayOfCustomNestedTypes)}.{nameof(TypeWithArrayOfCustomNestedTypes.NestedTypeArray)}.1.{nameof(NestedType.StringsArray)}.0");
            errorDetails[0].CodeInfo.Code.Should().BeEquivalentTo(AnnotationErrorCodes.MinLength.Code);
            errorDetails[1].Source.Should().Be($"{nameof(TypeWithArrayOfCustomNestedTypes)}.{nameof(TypeWithArrayOfCustomNestedTypes.NestedTypeArray)}.1.{nameof(NestedType.StringsArray)}.2");
            errorDetails[1].CodeInfo.Code.Should().BeEquivalentTo(AnnotationErrorCodes.RegularExpression.Code);
        }