public void MapProperty_Expression_Expression_Action_Action_GoodValues_ReturnsReversiveTypeMapPropertyConfiguration()
        {
            //Arrange
            var map = MapBuilder.Instance.CreateReversiveMap<MainEntity, MainEntityModel>().Map;
            var reversiveTypeMapPropertyConfiguration = new ReversiveTypeMapPropertyConfiguration<MainEntity, MainEntityModel>(map);

            //Act
            var reversiveTypeMapPropertyConfiguration2 = reversiveTypeMapPropertyConfiguration.MapProperty(
                (MainEntity o) => (object)o.Simple, (MainEntityModel o) => (object)o.Simple,
                delegate(MainEntity source, MainEntityModel dest, TypeMappingContext context)
                {
                },
                delegate(MainEntityModel source, MainEntity dest, TypeMappingContext context)
                {
                });

            //Assert
            Assert.AreEqual<ReversiveTypeMap>(map, reversiveTypeMapPropertyConfiguration2.Map);
            Assert.IsNull(reversiveTypeMapPropertyConfiguration2.Map.Mapper);
            Assert.IsNull(reversiveTypeMapPropertyConfiguration2.Map.UnMapper);
            Assert.AreEqual<System.Type>(map.SourceType, reversiveTypeMapPropertyConfiguration2.Map.SourceType);
            Assert.AreEqual<System.Type>(map.DestinationType, reversiveTypeMapPropertyConfiguration2.Map.DestinationType);
            Assert.AreEqual<int>(1, reversiveTypeMapPropertyConfiguration2.Map.PropertyMaps.Count);
            Assert.AreEqual<System.Reflection.MemberInfo>(ReflectionHelper.GetMemberInfo<MainEntity, int>((MainEntity o) => o.Simple), reversiveTypeMapPropertyConfiguration2.Map.PropertyMaps.Single<ReversivePropertyMap>().SourcePropertyInfo);
            Assert.IsNotNull(reversiveTypeMapPropertyConfiguration2.Map.PropertyMaps.Single<ReversivePropertyMap>().Mapper);
            Assert.IsNotNull(reversiveTypeMapPropertyConfiguration2.Map.PropertyMaps.Single<ReversivePropertyMap>().UnMapper);
            Assert.AreEqual<System.Reflection.MemberInfo>(ReflectionHelper.GetMemberInfo<MainEntityModel, int>((MainEntityModel o) => o.Simple), reversiveTypeMapPropertyConfiguration2.Map.PropertyMaps.Single<ReversivePropertyMap>().DestinationPropertyInfo);
            Assert.AreEqual<int>(0, reversiveTypeMapPropertyConfiguration2.Map.PropertyMaps.Single<ReversivePropertyMap>().InheritanceMaps.Count);
        }
        public void MapProperty_Expression_Expression_Action_Action_DestinationPropertyIsNull_ThrowsArgumentNullException()
        {
            //Arrange
            var map = MapBuilder.Instance.CreateReversiveMap<MainEntity, MainEntityModel>().Map;
            var reversiveTypeMapPropertyConfiguration = new ReversiveTypeMapPropertyConfiguration<MainEntity, MainEntityModel>(map);

            //Act
            //Assert
            reversiveTypeMapPropertyConfiguration.MapProperty(
                (MainEntity o) => (object)o.Simple, null, null, null);
        }
        public void MapProperty_Expression_Expression_Action_Action_DestinationPropertyIsNotOneLevelMemberExpression_ThrowsArgumentException()
        {
            //Arrange
            var map = MapBuilder.Instance.CreateReversiveMap<MainEntity, MainEntityModel>().Map;
            var reversiveTypeMapPropertyConfiguration = new ReversiveTypeMapPropertyConfiguration<MainEntity, MainEntityModel>(map);

            //Act
            //Assert
            reversiveTypeMapPropertyConfiguration.MapProperty((MainEntity o) => (object)o.Simple, (MainEntityModel o) => (object)o.SubEntity.Simple, delegate(MainEntity source, MainEntityModel dest, TypeMappingContext context)
            {
            }, delegate(MainEntityModel source, MainEntity dest, TypeMappingContext context)
            {
            });
        }
        public void ReversiveTypeMapPropertyConfiguration_GoodValues_Succeeds()
        {
            //Arrange
            var map = MapBuilder.Instance.CreateReversiveMap<MainEntity, MainEntityModel>().Map;

            //Act
            var reversiveTypeMapPropertyConfiguration = new ReversiveTypeMapPropertyConfiguration<MainEntity, MainEntityModel>(map);

            //Assert
            Assert.AreEqual<System.Type>(typeof(MainEntity), reversiveTypeMapPropertyConfiguration.Map.SourceType);
            Assert.AreEqual<System.Type>(typeof(MainEntityModel), reversiveTypeMapPropertyConfiguration.Map.DestinationType);
            Assert.AreEqual<int>(0, reversiveTypeMapPropertyConfiguration.Map.PropertyMaps.Count);
        }
        public void MapProperty_Expression_Expression_IEnumerable_SourcePropertyIsNull_ThrowsArgumentNullException()
        {
            //Arrange
            var map = MapBuilder.Instance.CreateReversiveMap<MainEntity, MainEntityModel>().Map;

            var reversiveTypeMapPropertyConfiguration = new ReversiveTypeMapPropertyConfiguration<MainEntity, MainEntityModel>(map);

            //Act
            //Assert
            reversiveTypeMapPropertyConfiguration.MapProperty(null, null, null);
        }
        public void MapProperty_Expression_Expression_IEnumerable_SourcePropertyIsNotOneLevelMemberExpression_ThrowsArgumentException()
        {
            //Arrange
            var map = MapBuilder.Instance.CreateReversiveMap<MainEntity, MainEntityModel>().Map;
            var reversiveTypeMapPropertyConfiguration = new ReversiveTypeMapPropertyConfiguration<MainEntity, MainEntityModel>(map);

            //Act
            //Assert
            reversiveTypeMapPropertyConfiguration.MapProperty((MainEntity o) => (object)o.SubEntity.Simple,
                (MainEntityModel o) => (object)o.Simple, new ReversiveTypeMap[]
            {
                MapBuilder.Instance.CreateReversiveMap<SubEntity, SubSubEntityModel>().Map
            });
        }
        public void MapProperty_Expression_Expression_IEnumerable_GoodValues_ReturnsReversiveTypeMapPropertyConfiguration()
        {
            //Arrange
            var map = MapBuilder.Instance.CreateReversiveMap<MainEntity, MainEntityModel>().Map;

            var reversiveTypeMapPropertyConfiguration = new ReversiveTypeMapPropertyConfiguration<MainEntity, MainEntityModel>(map);

            var map2 = MapBuilder.Instance.CreateReversiveMap<SubEntity, SubSubEntityModel>().Map;

            //Act
            var reversiveTypeMapPropertyConfiguration2 = reversiveTypeMapPropertyConfiguration.MapProperty(
                (MainEntity o) => o.SubEntity, (MainEntityModel o) => o.SubEntity, new ReversiveTypeMap[]
                {
                    map2
                });

            //Assert
            Assert.AreEqual<ReversiveTypeMap>(map, reversiveTypeMapPropertyConfiguration2.Map);
            Assert.IsNull(reversiveTypeMapPropertyConfiguration2.Map.Mapper);
            Assert.IsNull(reversiveTypeMapPropertyConfiguration2.Map.UnMapper);
            Assert.AreEqual<System.Type>(map.SourceType, reversiveTypeMapPropertyConfiguration2.Map.SourceType);
            Assert.AreEqual<System.Type>(map.DestinationType, reversiveTypeMapPropertyConfiguration2.Map.DestinationType);
            Assert.AreEqual<int>(1, reversiveTypeMapPropertyConfiguration2.Map.PropertyMaps.Count);
            Assert.AreEqual<System.Reflection.MemberInfo>(ReflectionHelper.GetMemberInfo<MainEntity, SubEntity>((MainEntity o) => o.SubEntity), reversiveTypeMapPropertyConfiguration2.Map.PropertyMaps.Single<ReversivePropertyMap>().SourcePropertyInfo);
            Assert.IsNull(reversiveTypeMapPropertyConfiguration2.Map.PropertyMaps.Single<ReversivePropertyMap>().Mapper);
            Assert.IsNull(reversiveTypeMapPropertyConfiguration2.Map.PropertyMaps.Single<ReversivePropertyMap>().UnMapper);
            Assert.AreEqual<System.Reflection.MemberInfo>(ReflectionHelper.GetMemberInfo<MainEntityModel, SubEntityModel>((MainEntityModel o) => o.SubEntity), reversiveTypeMapPropertyConfiguration2.Map.PropertyMaps.Single<ReversivePropertyMap>().DestinationPropertyInfo);
            Assert.IsNull(reversiveTypeMapPropertyConfiguration2.Map.PropertyMaps.Single<ReversivePropertyMap>().InheritanceMaps.Single<ReversiveTypeMap>().Mapper);
            Assert.IsNull(reversiveTypeMapPropertyConfiguration2.Map.PropertyMaps.Single<ReversivePropertyMap>().InheritanceMaps.Single<ReversiveTypeMap>().UnMapper);
            Assert.AreEqual<int>(0, reversiveTypeMapPropertyConfiguration2.Map.PropertyMaps.Single<ReversivePropertyMap>().InheritanceMaps.Single<ReversiveTypeMap>().PropertyMaps.Count);
            Assert.AreEqual<System.Type>(map2.SourceType, reversiveTypeMapPropertyConfiguration2.Map.PropertyMaps.Single<ReversivePropertyMap>().InheritanceMaps.Single<ReversiveTypeMap>().SourceType);
            Assert.AreEqual<System.Type>(map2.DestinationType, reversiveTypeMapPropertyConfiguration2.Map.PropertyMaps.Single<ReversivePropertyMap>().InheritanceMaps.Single<ReversiveTypeMap>().DestinationType);
        }
        public void MapProperty_Expression_Expression_Action_Action_UnMapperIsNull_ThrowsArgumentNullException()
        {
            //Arrange
            var map = MapBuilder.Instance.CreateReversiveMap<MainEntity, MainEntityModel>().Map;

            var reversiveTypeMapPropertyConfiguration = new ReversiveTypeMapPropertyConfiguration<MainEntity, MainEntityModel>(map);

            //Act
            //Assert
            reversiveTypeMapPropertyConfiguration.MapProperty((MainEntity o) => (object)o.Simple, (MainEntityModel o)
                => (object)o.Simple, delegate(MainEntity source, MainEntityModel dest, TypeMappingContext context)
                {
                }, null);
        }