public TeamTreeNode ConstructFromRoot(User user)
        {
            var result = new TeamTreeNode
            {
                This     = user,
                Children = FindAndGenerateChildren(user.UserId)
            };

            return(result);
        }
        private bool TreesAreEqual(TeamTreeNode tree1, TeamTreeNode tree2)
        {
            if (tree1 == tree2)
            {
                return(true);
            }

            if (!UsersAreEqual(tree1.This, tree2.This))
            {
                return(false);
            }

            if (tree1.Children == null && tree2.Children == null)
            {
                return(true);
            }

            if ((tree1.Children == null && tree2.Children != null) ||
                tree1.Children != null && tree2.Children == null)
            {
                return(false);
            }

            if (tree1.Children.Count() != tree2.Children.Count())
            {
                return(false);
            }

            for (int i = 0; i < tree1.Children.Count(); i++)
            {
                if (!TreesAreEqual(tree1.Children.ElementAt(i), tree2.Children.ElementAt(i)))
                {
                    return(false);
                }
            }

            return(true);
        }
        public void ConstructFromRoot_ShouldHaveCorrectStructure()
        {
            var rootUserId = 1;
            var expected   = new TeamTreeNode
            {
                This = new User {
                    UserId = 1
                },
                Children = new List <TeamTreeNode>()
                {
                    new TeamTreeNode
                    {
                        This = new User {
                            UserId = 7
                        },
                        Children = new List <TeamTreeNode>()
                        {
                            new TeamTreeNode
                            {
                                This = new User {
                                    UserId = 6
                                },
                                Children = new List <TeamTreeNode>()
                                {
                                    new TeamTreeNode
                                    {
                                        This = new User {
                                            UserId = 4
                                        }
                                    },
                                    new TeamTreeNode
                                    {
                                        This = new User {
                                            UserId = 5
                                        }
                                    },
                                    new TeamTreeNode
                                    {
                                        This = new User {
                                            UserId = 8
                                        }
                                    },
                                    new TeamTreeNode
                                    {
                                        This = new User {
                                            UserId = 10
                                        },
                                        Children = new List <TeamTreeNode>()
                                        {
                                            new TeamTreeNode
                                            {
                                                This = new User {
                                                    UserId = 9
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    new TeamTreeNode
                    {
                        This = new User {
                            UserId = 11
                        },
                        Children = new List <TeamTreeNode>()
                        {
                            new TeamTreeNode
                            {
                                This = new User {
                                    UserId = 2
                                }
                            },
                            new TeamTreeNode
                            {
                                This = new User {
                                    UserId = 3
                                },
                                Children = new List <TeamTreeNode>()
                                {
                                    new TeamTreeNode
                                    {
                                        This = new User {
                                            UserId = 12
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            };

            var daoMock = new Mock <IUsersDao>(MockBehavior.Strict);

            daoMock.Setup(x => x.SelectByID(It.IsAny <int>()))
            .Returns <int>(param => GetUserById(param));
            daoMock.Setup(x => x.SelectSubordinates(It.IsAny <int>()))
            .Returns <int>(param => GetSubordinates(param));

            var sut    = new UserLogic(daoMock.Object, new TeamTreeNodeFactory(daoMock.Object), null);
            var actual = sut.GetTeamTree(rootUserId);

            Assert.IsTrue(TreesAreEqual(expected, actual));
        }