public void ShouldMapNestedMultiplyRecursiveRelationships()
        {
            var recursorOne = new MultipleRecursor {
                Name = "One"
            };
            var recursorTwo = new MultipleRecursor {
                Name = "Two"
            };

            recursorOne.ChildRecursor = recursorTwo;
            recursorTwo.ChildRecursor = recursorOne;

            var source = new PublicField <MultipleRecursor[]>
            {
                Value = new[] { recursorOne, recursorTwo }
            };

            var result = Mapper.Map(source).ToANew <PublicField <ReadOnlyCollection <MultipleRecursor> > >();

            result.ShouldNotBeNull();
            result.Value.Count.ShouldBe(2);

            var resultOne = result.Value.First();

            resultOne.ShouldNotBeSameAs(recursorOne);
            resultOne.Name.ShouldBe("One");
            resultOne.ChildRecursor.ShouldNotBeNull();
            resultOne.ChildRecursor.ShouldNotBeSameAs(recursorTwo);

            var resultTwo = result.Value.Second();

            resultTwo.ShouldNotBeSameAs(recursorTwo);
            resultTwo.Name.ShouldBe("Two");
            resultTwo.ChildRecursor.ShouldNotBeNull();
            resultTwo.ChildRecursor.ShouldNotBeSameAs(recursorOne);

            resultOne.ChildRecursor.ShouldBeSameAs(resultTwo);
            resultTwo.ChildRecursor.ShouldBeSameAs(resultOne);
        }
        public void ShouldMapMultiplyRecursiveRelationships()
        {
            var recursorOne = new MultipleRecursor {
                Name = "One", Ints = new[] { 1, 0 }
            };
            var recursorTwo = new MultipleRecursor {
                Name = "Two"
            };

            var recursorThree = new MultipleRecursor
            {
                Name          = "Three",
                ChildRecursor = new MultipleRecursor
                {
                    Name = "Three.ChildRecursor",
                    ChildRecursorArray = new[] { recursorTwo }
                },
                Ints = new[] { 3, 3, 3 }
            };

            var source = new MultipleRecursor
            {
                Name          = "Root",
                ChildRecursor = new MultipleRecursor
                {
                    Name          = "Root.ChildRecursor",
                    ChildRecursor = recursorOne,
                    Ints          = new[] { 1, 2 }
                },
                ChildRecursorArray = new[]
                {
                    new MultipleRecursor {
                        Name = "Root.ChildRecursorArray[0]"
                    },
                    recursorOne,
                    new MultipleRecursor
                    {
                        Name          = "Root.ChildRecursorArray[2]",
                        ChildRecursor = recursorThree,
                        Ints          = new[] { 1, 2, 3 }
                    }
                },
                ChildRecursors = new List <MultipleRecursor>
                {
                    recursorTwo,
                    new MultipleRecursor
                    {
                        Name = "Root.ChildRecursors[1]",
                        Ints = new[] { 1, 2, 3, 4 }
                    },
                    recursorThree
                },
                Ints = new[] { 1, 1 }
            };

            var result = Mapper.Map(source).ToANew <MultipleRecursor>();

            result.ShouldNotBeNull();
            result.ShouldNotBeSameAs(source);

            result.Name.ShouldBe("Root");

            result.ChildRecursor.ShouldNotBeNull();
            result.ChildRecursor.Name.ShouldBe("Root.ChildRecursor");
            result.ChildRecursor.Ints.ShouldBe(1, 2);

            var clonedRecursorOne = result.ChildRecursor.ChildRecursor;

            clonedRecursorOne.ShouldNotBeNull();
            clonedRecursorOne.ShouldNotBeSameAs(recursorOne);
            clonedRecursorOne.Name.ShouldBe("One");
            clonedRecursorOne.Ints.ShouldBe(1, 0);

            result.ChildRecursorArray.ShouldNotBeNull();
            result.ChildRecursorArray.Length.ShouldBe(3);
            result.ChildRecursorArray.First().Name.ShouldBe("Root.ChildRecursorArray[0]");
            result.ChildRecursorArray.First().Ints.ShouldBeEmpty();
            result.ChildRecursorArray.Second().ShouldBeSameAs(clonedRecursorOne);
            result.ChildRecursorArray.Second().Ints.ShouldBe(1, 0);
            result.ChildRecursorArray.Third().Name.ShouldBe("Root.ChildRecursorArray[2]");
            result.ChildRecursorArray.Third().Ints.ShouldBe(1, 2, 3);

            var clonedRecursorThree = result.ChildRecursorArray.Third().ChildRecursor;

            clonedRecursorThree.ShouldNotBeNull();
            clonedRecursorThree.ShouldNotBeSameAs(recursorThree);
            clonedRecursorThree.Name.ShouldBe("Three");
            clonedRecursorThree.ChildRecursor.ShouldNotBeNull();
            clonedRecursorThree.ChildRecursor.Name.ShouldBe("Three.ChildRecursor");
            clonedRecursorThree.ChildRecursor.ChildRecursorArray.ShouldNotBeNull();
            clonedRecursorThree.ChildRecursor.ChildRecursorArray.Length.ShouldBe(1);

            var clonedRecursorTwo = clonedRecursorThree.ChildRecursor.ChildRecursorArray.First();

            clonedRecursorTwo.ShouldNotBeNull();
            clonedRecursorTwo.ShouldNotBeSameAs(recursorTwo);
            clonedRecursorTwo.Name.ShouldBe("Two");

            result.ChildRecursors.ShouldNotBeNull();
            result.ChildRecursors.Count.ShouldBe(3);
            result.ChildRecursors.First().ShouldBeSameAs(clonedRecursorTwo);
            result.ChildRecursors.First().Ints.ShouldBeEmpty();
            result.ChildRecursors.Second().Name.ShouldBe("Root.ChildRecursors[1]");
            result.ChildRecursors.Second().Ints.ShouldBe(1, 2, 3, 4);
            result.ChildRecursors.Third().ShouldBeSameAs(clonedRecursorThree);
            result.ChildRecursors.Third().Ints.ShouldBe(3, 3, 3);

            result.Ints.ShouldBe(1, 1);
        }
예제 #3
0
        public void ShouldMapMultiplyRecursiveRelationships()
        {
            using (var mapper = Mapper.CreateNew())
            {
                mapper.WhenMapping.TrackMappedObjects();

                var recursorOne = new MultipleRecursor {
                    Name = "One"
                };
                var recursorTwo = new MultipleRecursor {
                    Name = "Two"
                };

                var recursorThree = new MultipleRecursor
                {
                    Name          = "Three",
                    ChildRecursor = new MultipleRecursor
                    {
                        Name = "Three.ChildRecursor",
                        ChildRecursorArray = new[] { recursorTwo }
                    }
                };

                var source = new MultipleRecursor
                {
                    Name          = "Root",
                    ChildRecursor = new MultipleRecursor
                    {
                        Name          = "Root.ChildRecursor",
                        ChildRecursor = recursorOne
                    },
                    ChildRecursorArray = new[]
                    {
                        new MultipleRecursor {
                            Name = "Root.ChildRecursorArray[0]"
                        },
                        recursorOne,
                        new MultipleRecursor
                        {
                            Name          = "Root.ChildRecursorArray[2]",
                            ChildRecursor = recursorThree
                        }
                    },
                    ChildRecursors = new List <MultipleRecursor>
                    {
                        recursorTwo,
                        new MultipleRecursor {
                            Name = "Root.ChildRecursors[1]"
                        },
                        recursorThree
                    }
                };

                var result = mapper.Map(source).ToANew <MultipleRecursor>();

                result.ShouldNotBeNull();
                result.ShouldNotBeSameAs(source);

                result.Name.ShouldBe("Root");

                result.ChildRecursor.ShouldNotBeNull();
                result.ChildRecursor.Name.ShouldBe("Root.ChildRecursor");

                var clonedRecursorOne = result.ChildRecursor.ChildRecursor;
                clonedRecursorOne.ShouldNotBeNull();
                clonedRecursorOne.ShouldNotBeSameAs(recursorOne);
                clonedRecursorOne.Name.ShouldBe("One");

                result.ChildRecursorArray.ShouldNotBeNull();
                result.ChildRecursorArray.Length.ShouldBe(3);
                result.ChildRecursorArray.First().Name.ShouldBe("Root.ChildRecursorArray[0]");
                result.ChildRecursorArray.Second().ShouldBeSameAs(clonedRecursorOne);
                result.ChildRecursorArray.Third().Name.ShouldBe("Root.ChildRecursorArray[2]");

                var clonedRecursorThree = result.ChildRecursorArray.Third().ChildRecursor;
                clonedRecursorThree.ShouldNotBeNull();
                clonedRecursorThree.ShouldNotBeSameAs(recursorThree);
                clonedRecursorThree.Name.ShouldBe("Three");
                clonedRecursorThree.ChildRecursor.ShouldNotBeNull();
                clonedRecursorThree.ChildRecursor.Name.ShouldBe("Three.ChildRecursor");
                clonedRecursorThree.ChildRecursor.ChildRecursorArray.ShouldNotBeNull();
                clonedRecursorThree.ChildRecursor.ChildRecursorArray.Length.ShouldBe(1);

                var clonedRecursorTwo = clonedRecursorThree.ChildRecursor.ChildRecursorArray.First();
                clonedRecursorTwo.ShouldNotBeNull();
                clonedRecursorTwo.ShouldNotBeSameAs(recursorTwo);
                clonedRecursorTwo.Name.ShouldBe("Two");

                result.ChildRecursors.ShouldNotBeNull();
                result.ChildRecursors.Count.ShouldBe(3);
                result.ChildRecursors.First().ShouldBeSameAs(clonedRecursorTwo);
                result.ChildRecursors.Second().Name.ShouldBe("Root.ChildRecursors[1]");
                result.ChildRecursors.Third().ShouldBeSameAs(clonedRecursorThree);
            }
        }