public void When_PolymorphicFor_To_Type_Not_Subtype_Of_Map_To_Type_Then_Throws()
        {
            // Arrange
            var mapper = new Mapper();
            var sut = new PolymorphicMap(ProjectionType.Create<VehicleFrom, VehicleTo>(), mapper);

            // Act
            KKAssert.Throws<Exception>(() => sut.AddPolymorph(ProjectionType.Create<CarFrom, SimpleTo>()),
                "Cannot be polymorphic for a Projection whose 'to' type 'SimpleTo' is not a subtype of this maps 'to' type 'VehicleTo'.");
        }
        public void When_PolymorphicFor_From_Type_Then_Throws()
        {
            // Arrange
            var mapper = new Mapper();
            var sut = new PolymorphicMap(ProjectionType.Create<VehicleFrom, VehicleTo>(), mapper);
            sut.AddPolymorph(ProjectionType.Create<CarFrom, CarTo>());

            // Act
            KKAssert.Throws<Exception>(() => sut.AddPolymorph(ProjectionType.Create<CarFrom, VehicleTo>()),
                "Illegal polymorph defintion. A definition has already been registered for the 'from' type 'CarFrom' and would be made ambiguous by this one.");
        }
        public void When_AddPolymorphicFor_Then_Is_Added_To_Map()
        {
            // Arrange
            var mapper = new Mapper();
            var sut = new PolymorphicMap(ProjectionType.Create<VehicleFrom, VehicleTo>(), mapper);
            var expected = ProjectionType.Create<CarFrom, CarTo>();

            // Act
            sut.AddPolymorph(expected);

            // Assert
            Assert.NotNull(sut.Polymorphs.Single(x => x.ProjectionType == expected));
        }
        public void When_AfterMapping_Then_Is_Set_On_Map()
        {
            // Arrange
            var map = new PolymorphicMap(ProjectionType.Create<VehicleFrom, VehicleTo>(), new Mapper());
            var sut = new PolymorphicMapBuilder<VehicleFrom, VehicleTo>(map);
            var flag = false;
            var postMapStep = (Action<VehicleFrom, VehicleTo>)((_, __) => flag = true);

            // Act
            sut.AfterMapping(postMapStep);
            map.AfterMapping(null, null);

            // Assert
            Assert.IsTrue(flag);
        }