예제 #1
0
        public void DtoBuilder_ComplexEntityDto_Regenerated()
        {
            var code     = SampleCodeProvider.ComplexEntity;
            var metadata = EntityParser.FromString(code);

            metadata.DtoName = "ComplexEntityDTO";
            var otherEntityProp = metadata.Properties.Where(p => p.RelatedEntityName == "OtherEntity").Single();

            otherEntityProp.RelationMetadata = EntityParser.FromString(SampleCodeProvider.OtherEntity);

            var existingDtoTree = CSharpSyntaxTree.ParseText(SampleCodeProvider.ComplexEntityDto);

            var tree = DtoBuilder.BuildDto(metadata, existingDto: existingDtoTree);

            Assert.IsNotNull(tree);

            var codeText = tree.ToString();

            Assert.IsTrue(codeText.Contains("public string OtherNumber { get; set; }"));
            Assert.IsTrue(codeText.Contains("OtherNumber = p.Other != null ? p.Other.Number : default (string),"));

            Assert.IsTrue(codeText.Contains("public IEnumerable<SomethingDTO> List1 { get; set; }"));
            Assert.IsTrue(codeText.Contains("public IEnumerable<SomethingDTO> Enumerable2 { get; set; }"));
            Assert.IsTrue(codeText.Contains("public IEnumerable<SomethingDTO> Collection2 { get; set; }"));

            Assert.IsTrue(codeText.Contains("List1 = p.List1.AsQueryable().Select(this._somethingMapper.SelectorExpression),"));
            Assert.IsTrue(codeText.Contains("Enumerable2 = p.Enumerable2.AsQueryable().Select(this._somethingMapper.SelectorExpression),"));
            Assert.IsTrue(codeText.Contains("Collection2 = p.Collection2.AsQueryable().Select(this._somethingMapper.SelectorExpression),"));
        }
예제 #2
0
        public void DtoBuilder_SimpleEntity_PropertiesAdded()
        {
            var code     = SampleCodeProvider.EntityOnlySimpleProperties;
            var metadata = EntityParser.FromString(code);

            metadata.DtoName = "EntityOnlySimplePropertiesDTO";

            var tree = DtoBuilder.BuildDto(metadata, dtoNamespace: "Test.Namespace.Extra.Long");

            Assert.IsNotNull(tree);

            var codeText = tree.ToString();

            foreach (var prop in metadata.Properties.ToList())
            {
                Assert.IsTrue(codeText.Contains($"public {prop.Type} {prop.Name} {{ get; set; }}"));

                if (prop != metadata.Properties.Last())
                {
                    Assert.IsTrue(codeText.Contains($"{prop.Name} = p.{prop.Name},"));
                }
                else
                {
                    Assert.IsTrue(codeText.Contains($"{prop.Name} = p.{prop.Name}"));
                }

                Assert.IsFalse(codeText.Contains($",{prop.Name} = p.{prop.Name}"));

                Assert.IsTrue(codeText.Contains($"model.{prop.Name} = dto.{prop.Name};"));
            }

            Assert.IsTrue(codeText.Contains("using DtoGenerator.Tests.CodeSamples;"));
        }
예제 #3
0
        /// <summary>
        /// Generates all required classes and documents and returns modified solution.
        /// With that modified solution it is required to call Workspace.ApplyChanges()
        /// </summary>
        /// <param name="solution"></param>
        /// <param name="dtoLocation"></param>
        /// <param name="metadata"></param>
        /// <returns>Modified solution containing changes to apply to workspace</returns>
        public static async Task <Solution> WriteDto(this Solution solution, SolutionLocation dtoLocation, EntityMetadata metadata, bool generateMapper, bool addContractAttrs, bool addDataAnnotations)
        {
            var project = solution.Projects
                          .Where(p => p.Name.Contains(dtoLocation.Project))
                          .OrderBy(p => p.Name) // Due to .NET core project which have more complex project name, cannot use ==
                          .FirstOrDefault();

            var compilation = await project.GetCompilationAsync();

            var existingDtoDocument = compilation.GetDocumentForSymbol(project.Solution, metadata.DtoName);

            SyntaxTree existingSyntaxTree = null;

            if (existingDtoDocument != null)
            {
                existingSyntaxTree = await existingDtoDocument.GetSyntaxTreeAsync();
            }

            var dtoNamespace    = dtoLocation.ToNamespace(project.AssemblyName);
            var mapperNamespace = "unknown";

            var mapperDoc = compilation.GetDocumentForSymbol(project.Solution, "MapperBase");

            if (mapperDoc == null && generateMapper)
            {
                var mapperFolderStructure = dtoLocation.GetFolders().Concat(new[] { "Infrastructure" });
                mapperNamespace = dtoNamespace + ".Infrastructure";

                project = project.AddDocument("MapperBase.cs", DtoBuilder.BuildMapper(mapperNamespace), folders: mapperFolderStructure).Project;
            }
            else if (generateMapper)
            {
                var mapperSyntax = await mapperDoc.GetSyntaxRootAsync();

                mapperNamespace = mapperSyntax.DescendantNodesAndSelf(p => !p.IsKind(CSharp.SyntaxKind.NamespaceDeclaration))
                                  .OfType <NamespaceDeclarationSyntax>()
                                  .Select(p => p.Name.ToString())
                                  .FirstOrDefault();
            }

            var syntaxTree = DtoBuilder.BuildDto(metadata, dtoNamespace: dtoNamespace, existingDto: existingSyntaxTree, mapperNamespace: mapperNamespace, generateMapper: generateMapper, addContractAttrs: addContractAttrs, addDataAnnotations: addDataAnnotations);

            if (existingDtoDocument == null)
            {
                var formatted       = Formatter.Format(syntaxTree.GetRoot(), solution.Workspace);
                var folderStructure = dtoLocation.GetFolders();
                var newDoc          = project.AddDocument(metadata.DtoName + ".cs", formatted, folders: folderStructure);
                return(newDoc.Project.Solution);
            }
            else
            {
                var root = syntaxTree.GetRoot();
                root = Formatter.Format(root, solution.Workspace);

                var newDoc = existingDtoDocument.WithSyntaxRoot(root);
                return(newDoc.Project.Solution);
            }
        }
예제 #4
0
        public IEnumerable <TopicDTO> GetTopics()
        {
            var topics = new List <TopicDTO>();

            foreach (var topic in _context.Topics.ToList())
            {
                topics.Add(DtoBuilder.BuildDto(topic));
            }
            return(topics);
        }
예제 #5
0
        public IEnumerable <SubjectDTO> GetSubjects()
        {
            var subjects = new List <SubjectDTO>();

            foreach (var subject in _context.Subjects.ToList())
            {
                subjects.Add(DtoBuilder.BuildDto(subject));
            }
            return(subjects);
        }
예제 #6
0
        public async Task <IActionResult> GetTopic([FromRoute] int id)
        {
            var topic = await _context.Topics.SingleOrDefaultAsync(m => m.ID == id);

            if (topic == null)
            {
                return(NotFound());
            }

            return(Ok(DtoBuilder.BuildDto(topic)));
        }
예제 #7
0
        public async Task <IActionResult> GetSubject([FromRoute] int id)
        {
            var subject = await _context.Subjects.SingleOrDefaultAsync(m => m.ID == id);

            if (subject == null)
            {
                return(NotFound());
            }

            return(Ok(DtoBuilder.BuildDto(subject)));
        }
예제 #8
0
        public void DtoBuilder_EntityWithBase_DataAnnotations_MetadataType()
        {
            var code     = SampleCodeProvider.SampleTable3;
            var metadata = EntityParser.FromString(code);

            metadata.DtoName = "SampleTable3DTO";

            var tree = DtoBuilder.BuildDto(metadata, dtoNamespace: "Some.Namespace", addDataAnnotations: true);

            Assert.IsNotNull(tree);

            var codeText = tree.ToString();

            Assert.IsTrue(codeText.Contains("[MetadataType(typeof(SampleTable3MD))]"));
        }
예제 #9
0
        public IEnumerable <SemesterDTO> GetSemesters()
        {
            var semesters = new List <SemesterDTO>();

            foreach (var semester in _context.Semesters
                     .Include(s => s.SubGroup)
                     .ThenInclude(s => s.Group)
                     .ThenInclude(g => g.Specialty)
                     .ThenInclude(s => s.College)
                     .ToList())
            {
                semesters.Add(DtoBuilder.BuildDto(semester));
            }
            return(semesters);
        }
예제 #10
0
        public void DtoBuilder_SimpleEntityExistingDto_PropertiesAdded()
        {
            var code     = SampleCodeProvider.EntityOnlySimpleProperties;
            var metadata = EntityParser.FromString(code);

            metadata.DtoName = "EntityOnlySimplePropertiesDTO";

            var existingDtoTree = CSharpSyntaxTree.ParseText(SampleCodeProvider.EntityOnlySimplePropertiesDto);

            var tree = DtoBuilder.BuildDto(metadata, existingDto: existingDtoTree);

            Assert.IsNotNull(tree);

            var codeText = tree.ToString();

            foreach (var prop in metadata.Properties.ToList())
            {
                Assert.IsTrue(codeText.Contains($"public {prop.Type} {prop.Name} {{ get; set; }}"));
                if (prop != metadata.Properties.Last())
                {
                    Assert.IsTrue(codeText.Contains($"{prop.Name} = p.{prop.Name},"));
                }
                else
                {
                    Assert.IsTrue(codeText.Contains($"{prop.Name} = p.{prop.Name}"));
                }

                Assert.IsFalse(codeText.Contains($",{prop.Name} = p.{prop.Name}"));

                Assert.IsTrue(codeText.Contains($"model.{prop.Name} = dto.{prop.Name};"));
            }

            var customCodeBeginIdx = codeText.IndexOf("////BCC/");
            var customCodeEndIdx   = codeText.IndexOf("////ECC/");

            var customPropIdx = codeText.IndexOf("public int CustomProperty { get; set; }");
            var genPropIdx    = codeText.IndexOf("public DateTime? Date { get; set; }");

            Assert.AreNotEqual(-1, customPropIdx);
            Assert.AreNotEqual(-1, genPropIdx);
            Assert.AreNotEqual(-1, customCodeBeginIdx);
            Assert.AreNotEqual(-1, customCodeEndIdx);

            Assert.IsTrue(customPropIdx > customCodeBeginIdx && customPropIdx < customCodeEndIdx);
            Assert.IsTrue(genPropIdx > customCodeEndIdx || genPropIdx < customCodeBeginIdx);
        }
예제 #11
0
        public void DtoBuilder_EntityWithBase_DataAnnotations_And_DataContract()
        {
            var code     = SampleCodeProvider.SampleTable2;
            var metadata = EntityParser.FromString(code);

            metadata.DtoName = "SampleTable2DTO";

            var tree = DtoBuilder.BuildDto(metadata, dtoNamespace: "Some.Namespace", addContractAttrs: true, addDataAnnotations: true);

            Assert.IsNotNull(tree);

            var codeText = tree.ToString();

            Assert.IsTrue(codeText.Contains("[Required]"));
            Assert.IsTrue(codeText.Contains("[StringLength(10)]"));
            Assert.IsTrue(codeText.Contains("using System.ComponentModel.DataAnnotations;"));
            Assert.IsTrue(codeText.Contains("[DataContract]"));
            Assert.IsTrue(codeText.Contains("[DataMember]"));
            Assert.IsTrue(codeText.Contains("using System.Runtime.Serialization;"));
        }
예제 #12
0
        public void DtoBuilder_EntityWithBase_DataAnnotations()
        {
            var code     = SampleCodeProvider.SampleTable1;
            var metadata = EntityParser.FromString(code);

            metadata.DtoName = "SampleTable1DTO";

            var tree = DtoBuilder.BuildDto(metadata, dtoNamespace: "Some.Namespace", addDataAnnotations: true);

            Assert.IsNotNull(tree);

            var codeText = tree.ToString();

            Assert.IsTrue(codeText.Contains("[Required]"));
            Assert.IsTrue(codeText.Contains("[StringLength(10)]"));
            Assert.IsTrue(codeText.Contains("[StringLength(200),Required]"));
            Assert.IsTrue(codeText.Contains("[DisplayFormat(DataFormatString = \"{0:dd/MM/yyyy}\", ApplyFormatInEditMode = true)]"));
            Assert.IsTrue(codeText.Contains("using System.ComponentModel.DataAnnotations;"));
            Assert.IsFalse(codeText.Contains("SuppressMessage"));
        }
예제 #13
0
        public void DtoBuilder_ComplexEntityDto_Regenerated()
        {
            var code     = SampleCodeProvider.ComplexEntity;
            var metadata = EntityParser.FromString(code);

            metadata.DtoName = "ComplexEntityDTO";
            var otherEntityProp = metadata.Properties.Where(p => p.RelatedEntityName == "OtherEntity").Single();

            otherEntityProp.RelationMetadata = EntityParser.FromString(SampleCodeProvider.OtherEntity);

            var existingDtoTree = CSharpSyntaxTree.ParseText(SampleCodeProvider.ComplexEntityDto);

            var tree = DtoBuilder.BuildDto(metadata, existingDto: existingDtoTree);

            Assert.IsNotNull(tree);

            var codeText = tree.ToString();

            Assert.IsTrue(codeText.Contains("public string OtherNumber { get; set; }"));
            Assert.IsTrue(codeText.Contains("OtherNumber = p.Other != null ? p.Other.Number : default (string),"));

            Assert.IsTrue(codeText.Contains("public IEnumerable<SomethingDTO> List1 { get; set; }"));
            Assert.IsTrue(codeText.Contains("public IEnumerable<SomethingDTO> Enumerable2 { get; set; }"));
            Assert.IsTrue(codeText.Contains("public IEnumerable<SomethingDTO> Collection2 { get; set; }"));

            Assert.IsTrue(codeText.Contains("List1 = p.List1.AsQueryable().Select(this._somethingMapper.SelectorExpression),"));
            Assert.IsTrue(codeText.Contains("Enumerable2 = p.Enumerable2.AsQueryable().Select(this._somethingMapper.SelectorExpression),"));
            Assert.IsTrue(codeText.Contains("Collection2 = p.Collection2.AsQueryable().Select(this._somethingMapper.SelectorExpression)"));

            Assert.IsFalse(codeText.Contains("////BCC/ BEGIN CUSTOM CODE SECTION ////ECC/ END CUSTOM CODE SECTION"));
            Assert.IsFalse(codeText.Contains("////ECC/ END CUSTOM CODE SECTION private SomethingMapper"));
            Assert.AreEqual(codeText.IndexOf("MapToModel"), codeText.LastIndexOf("MapToModel"));

            Assert.IsTrue(codeText.Contains("// Some custom property leading comment - should not dissapear"));
            Assert.IsTrue(codeText.Contains("// Some custom property 2 leading comment - should not dissapear"));
        }
예제 #14
0
        public void DtoBuilder_EntityWithBase_BaseCallsGenerated()
        {
            var code     = SampleCodeProvider.EntityWithBase;
            var metadata = EntityParser.FromString(code);

            metadata.DtoName          = "EntityWithBaseDTO";
            metadata.BaseClassDtoName = "EntityBaseDTO";
            metadata.BaseClassName    = "EntityBase";

            var tree = DtoBuilder.BuildDto(metadata, dtoNamespace: "Some.Namespace");

            Assert.IsNotNull(tree);

            var codeText = tree.ToString();

            Assert.IsTrue(codeText.Contains("private EntityBaseMapper _entityBaseMapper = new EntityBaseMapper();"));
            Assert.IsTrue(codeText.Contains("})).MergeWith(this._entityBaseMapper.SelectorExpression);"));

            Assert.IsTrue(codeText.Contains("public class EntityWithBaseDTO : EntityBaseDTO"));
            Assert.IsFalse(codeText.Contains("EntityWithBaseDTO : EntityBaseDTO{"));
            Assert.IsFalse(codeText.Contains("EntityWithBaseDTO : EntityBaseDTO {"));

            Assert.IsTrue(codeText.Contains("this._entityBaseMapper.MapToModel(dto,model);"));
        }