public void When_No_From_Definition_Then_Invalid()
        {
            // Arrange
            var memberInfo = typeof(SimpleTo).GetMember("StringProp").Single();
            var mapper = new Mapper();
            var sut = new Binding(memberInfo, BindingType.Explicit, mapper);

            // Act
            var res = BindingValidator.Validate(sut, new Mapper());

            // Assert
            Assert.AreEqual("Binding definition does not define a 'from' source.", res[0].Reason);
        }
        public void When_Bound_From_Definition_Then_Valid()
        {
            // Arrange
            var memberInfo = typeof(SimpleTo).GetMember("StringProp").Single();
            var mapper = new Mapper();
            var sut = new Binding(memberInfo, BindingType.Explicit, mapper);
            sut.FromDefinition = new FromMemberDefinition("StringProp", typeof(string),
                ReflectionHelpers.CreateSafeWeakMemberChainGetter(new[] {memberInfo}));

            // Act
            var res = BindingValidator.Validate(sut, new Mapper());

            // Assert
            Assert.AreEqual(0, res.Count);
        }
        public void When_Explicit_From_Definition_Then_Valid()
        {
            // Arrange
            var memberInfo = typeof(SimpleTo).GetMember("StringProp").Single();
            var mapper = new Mapper();
            var sut = new Binding(memberInfo, BindingType.Explicit, mapper)
            {
                FromDefinition = new FromCustomDefinition(context => "Wow", typeof(string))
            };

            // Act
            var res = BindingValidator.Validate(sut, new Mapper());

            // Assert
            Assert.AreEqual(0, res.Count);
        }
Example #4
0
        public static ReadOnlyCollection<MemberDefinitionError> Validate(Binding definition, Mapper mapper)
        {
            var memberDefinitionErrors = new List<MemberDefinitionError>();

            if (definition.IsIgnore)
                return new ReadOnlyCollection<MemberDefinitionError>(memberDefinitionErrors);

            if (definition.FromDefinition == FromUndefinedDefinition.Default)
                memberDefinitionErrors.Add(MemberDefinitionError.Create(definition.ToDefinition, "Binding definition does not define a 'from' source."));

            //            if (definition.FromDefinition != null && definition.ConvertUsing == null)
            //            {
            //                var fromMemberType = definition.FromDefinition.MemberType;
            //                var toMemberType = definition.toToMemberDefinition.MemberType;
            //
            //                if (!mapper.HasProjection(fromMemberType, toMemberType))
            //                {
            //                    memberDefinitionErrors.Add(
            //                        MemberDefinitionError.Create(definition.toToMemberDefinition, "Mapped from '{0}' but no {1} defined between '{2}'->'{3}'.",
            //                            definition.FromDefinition.memberPath,
            //                            toMemberType.IsClass ? "ClassMap" : "conversion",
            //                            fromMemberType.Name, toMemberType.Name));
            //                }
            //            }
            //
            //            if (definition.FromDefinition != null && definition.ConvertUsing != null)
            //            {
            //                // TODO validate conversion or make it so instantiation implies validity.
            //
            //                if (definition.toToMemberDefinition.MemberType != definition.ConvertUsing.ProjectionType.ToType)
            //                    memberDefinitionErrors.Add(MemberDefinitionError.Create(definition.toToMemberDefinition,
            //                        "To member type {0} does not match the defined conversion output type ({1})", definition.FromDefinition.MemberType,
            //                        definition.ConvertUsing));
            //
            //                if (definition.FromDefinition.MemberType != definition.ConvertUsing.ProjectionType.FromType)
            //                    memberDefinitionErrors.Add(MemberDefinitionError.Create(definition.toToMemberDefinition,
            //                        "From member type {0} does not match the defined conversion input type ({1})", definition.FromDefinition.MemberType,
            //                        definition.ConvertUsing));
            //            }

            return new ReadOnlyCollection<MemberDefinitionError>(memberDefinitionErrors);
        }
Example #5
0
        private Tuple<ReadOnlyCollection<Binding>, ReadOnlyCollection<MemberDefinitionError>> GenerateAutoMemberBindings(
            IEnumerable<Binding> excludedBindings)
        {
            var autoMemberBindings = new List<Binding>();
            var memberDefinitionErrors = new List<MemberDefinitionError>();

            // Discover which 'to' class members do not already have definitions, so that they may be automapped.
            var undefinedToMemberInfos = ReflectionHelpers.GetMemberInfos(ProjectionType.ToType)
                                                          .Where(m => excludedBindings.All(b => b.ToDefinition.MemberName != m.Name));

            // Iterate these the undefined members and try to automatically create matches from inspecting members on the 'from' class.
            foreach (var toMemberInfo in undefinedToMemberInfos)
            {
                var unflattenedMemberInfos = ExpressionHelpers.UnflattenMemberNamesToMemberInfos(ProjectionType.FromType, toMemberInfo.Name);

                if (unflattenedMemberInfos.Any())
                {
                    var fromMemberType = unflattenedMemberInfos.Last().GetMemberType();
                    var fromMemberPath = String.Join(".", unflattenedMemberInfos.GetMemberNames());
                    var fromMemberGetter = ReflectionHelpers.CreateSafeWeakMemberChainGetter(unflattenedMemberInfos);

                    var memberGetterDefinition = new FromMemberDefinition(fromMemberPath, fromMemberType, fromMemberGetter);

                    var memberBindingDefinition = new Binding(toMemberInfo, BindingType.Auto, Mapper)
                    {
                        FromDefinition = memberGetterDefinition
                    };

                    autoMemberBindings.Add(memberBindingDefinition);
                }
                else
                {
                    memberDefinitionErrors.Add(MemberDefinitionError.Create(toMemberInfo, "No binding defined and unable to auto-match."));
                }
            }

            return Tuple.Create(new ReadOnlyCollection<Binding>(autoMemberBindings),
                new ReadOnlyCollection<MemberDefinitionError>(memberDefinitionErrors));
        }
Example #6
0
        public Binding GetMemberBindingDefinition(MemberInfo toMemberInfo)
        {
            Binding binding;
            if (!explicitBindings.TryGetValue(toMemberInfo.Name, out binding))
            {
                binding = new Binding(toMemberInfo, BindingType.Explicit, Mapper);
                explicitBindings[toMemberInfo.Name] = binding;
            }

            // Reset the cache as we have mutated the bindings.
            cachedBindings = null;

            return binding;
        }