public static TemplateDomain ConvertToDomain(this TemplateDTO templateDTO)
        {
            var templateDomain = new TemplateDomain();

            //Map the template
            templateDomain.InjectFrom(templateDTO);
            templateDomain.InjectFrom <MapEnum>(new { TemplateType = templateDTO.TemplateType });

            //Map the version
            templateDomain.TemplateVersions.InjectFrom <TemplateVersionDTO, TemplateVersionDomain>(templateDTO.TemplateVersionsDTOs);

            //Map the sections
            templateDomain.TemplateVersions.ForEach(tv =>
            {
                //id is already mapped before, so we can get the matching dto for the domain.
                TemplateVersionDTO matchedTemplateVersionDTOs = templateDTO.TemplateVersionsDTOs.SingleOrDefault(x => x.Id == tv.Id);

                if (matchedTemplateVersionDTOs != null)
                {
                    var sectionDomains = tv.Sections.InjectFrom <SectionDTO, SectionDomain>(matchedTemplateVersionDTOs.Sections);

                    sectionDomains.ForEach(sd =>
                    {
                        SectionDTO sectionDTO = matchedTemplateVersionDTOs.Sections.SingleOrDefault(x => x.Id == sd.Id);

                        if (sectionDTO != null)
                        {
                            var sectionQuestion = (SectionQuestionDomain)sd.SectionQuestion.InjectFrom(sectionDTO.SectionQuestionDTO);
                            List <QuestionDomain> questionDomains = sectionQuestion.Questions.InjectFrom <QuestionDTO, QuestionDomain>(sectionDTO.SectionQuestionDTO.Questions);

                            questionDomains.ForEach(domain =>
                            {
                                QuestionDTO questionDTO = sectionDTO.SectionQuestionDTO.Questions.SingleOrDefault(x => x.Id == domain.Id);

                                if (questionDTO != null)
                                {
                                    domain.InjectFrom <MapEnum>(new { QuestionType = questionDTO.QuestionTypeDTO });
                                }
                            });
                        }
                    });
                }
            });

            return(templateDomain);
        }
        public void ResoveNestedCollections_MapToSameEntity()
        {
            var originalTemplateDTO = OriginalTemplate();
            var newTemplateDTO      = new TemplateDTO();

            newTemplateDTO.InjectFrom(originalTemplateDTO);

            Assert.AreEqual(originalTemplateDTO.Name, newTemplateDTO.Name);
            Assert.AreEqual(originalTemplateDTO.TemplateType, newTemplateDTO.TemplateType);

            Assert.AreEqual(originalTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Name, newTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Name);
            Assert.AreEqual(originalTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Number, newTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Number);

            Assert.AreEqual(originalTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Sections.ElementAt(0).Name, newTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Sections.ElementAt(0).Name);
            Assert.AreEqual(originalTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Sections.ElementAt(0).Id, newTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Sections.ElementAt(0).Id);

            Assert.AreEqual(originalTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Sections.ElementAt(0).SectionQuestionDTO.Name, newTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Sections.ElementAt(0).SectionQuestionDTO.Name);
            Assert.AreEqual(originalTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Sections.ElementAt(0).SectionQuestionDTO.Id, newTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Sections.ElementAt(0).SectionQuestionDTO.Id);

            Assert.AreEqual(originalTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Sections.ElementAt(0).SectionQuestionDTO.Questions.ElementAt(0).Text, newTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Sections.ElementAt(0).SectionQuestionDTO.Questions.ElementAt(0).Text);
            Assert.AreEqual(originalTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Sections.ElementAt(0).SectionQuestionDTO.Questions.ElementAt(0).Id, newTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Sections.ElementAt(0).SectionQuestionDTO.Questions.ElementAt(0).Id);
        }
        public void ResoveNestedCollections_MapToSameEntity()
        {
            var originalTemplateDTO = OriginalTemplate();
            var newTemplateDTO = new TemplateDTO();

            newTemplateDTO.InjectFrom(originalTemplateDTO);

            Assert.AreEqual(originalTemplateDTO.Name, newTemplateDTO.Name);
            Assert.AreEqual(originalTemplateDTO.TemplateType, newTemplateDTO.TemplateType);

            Assert.AreEqual(originalTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Name, newTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Name);
            Assert.AreEqual(originalTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Number, newTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Number);

            Assert.AreEqual(originalTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Sections.ElementAt(0).Name, newTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Sections.ElementAt(0).Name);
            Assert.AreEqual(originalTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Sections.ElementAt(0).Id, newTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Sections.ElementAt(0).Id);

            Assert.AreEqual(originalTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Sections.ElementAt(0).SectionQuestionDTO.Name, newTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Sections.ElementAt(0).SectionQuestionDTO.Name);
            Assert.AreEqual(originalTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Sections.ElementAt(0).SectionQuestionDTO.Id, newTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Sections.ElementAt(0).SectionQuestionDTO.Id);

            Assert.AreEqual(originalTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Sections.ElementAt(0).SectionQuestionDTO.Questions.ElementAt(0).Text, newTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Sections.ElementAt(0).SectionQuestionDTO.Questions.ElementAt(0).Text);
            Assert.AreEqual(originalTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Sections.ElementAt(0).SectionQuestionDTO.Questions.ElementAt(0).Id, newTemplateDTO.TemplateVersionsDTOs.ElementAt(0).Sections.ElementAt(0).SectionQuestionDTO.Questions.ElementAt(0).Id);
        }