Exemple #1
0
        private MarkdownFile GenerateTableOfContents(DotNetDocumentationFile xmlDocumentation, DotNetQualifiedClassNameTreeNode node)
        {
            List <DotNetType>     types      = xmlDocumentation.Types.Where(t => t.Name.FullNamespace == node.Value).ToList();
            List <DotNetDelegate> _delegates = xmlDocumentation.Delegates.Where(d => d.Name.FullNamespace == node.Value).ToList();

            MarkdownFile markdown = new MarkdownFile();
            string       header   = "Contents of " + node.Value.FullName;

            if (node.Parent != null)
            {
                header = String.Format("Contents of [{0}]({1}).{2}", node.Parent.Value.FullName, TableOfContentsFilename(node.Parent.Value), node.Value.LocalName);
            }

            MarkdownSection section = markdown.AddSection(header);

            if (node.Children.Count > 0)
            {
                MarkdownSection childNamespacesSection = section.AddSection("Namespaces");
                foreach (DotNetQualifiedClassNameTreeNode child in node.Children)
                {
                    section.AddInLine(new MarkdownInlineLink(MarkdownText.Bold(child.Value.FullName), TableOfContentsFilename(child.Value)));
                }
            }

            AddTableOfContentsSection(section, "Concrete Types", types.Where(t => t.Category == TypeCategory.Normal).ToList());
            AddTableOfContentsSection(section, "Static Types", types.Where(t => t.Category == TypeCategory.Static).ToList());
            AddTableOfContentsSection(section, "Abstract Types", types.Where(t => t.Category == TypeCategory.Abstract).ToList());
            AddTableOfContentsSection(section, "Interfaces", types.Where(t => t.Category == TypeCategory.Interface).ToList());
            AddTableOfContentsSection(section, "Enums", types.Where(t => t.Category == TypeCategory.Enum).ToList());
            AddTableOfContentsSection(section, "Structs", types.Where(t => t.Category == TypeCategory.Struct).ToList());
            AddTableOfContentsSection(section, "Delegates", _delegates);
            AddTableOfContentsSection(section, "Exceptions", types.Where(t => t.Category == TypeCategory.Exception).ToList());

            return(markdown);
        }
        public Program()
        {
            //Test DotNet namespace
            string outputFolder = Path.Combine(GetMainDirectory(), "DataFiles");

            outputFolder = Path.Combine(outputFolder, "bin");
            outputFolder = Path.Combine(outputFolder, "Release");
            outputFolder = Path.Combine(outputFolder, Properties.Settings.Default.NetVersion);
            string xmlFilename = Path.Combine(outputFolder, "WithoutHaste.DataFiles.XML");
            string dllFilename = Path.Combine(outputFolder, "WithoutHaste.DataFiles.dll");
            DotNetDocumentationFile docFile = new DotNetDocumentationFile(xmlFilename);

            docFile.AddAssemblyInfo(dllFilename);
            Console.WriteLine("Found {0} types in assembly", docFile.Types.Count);

            //Test Markdown namespace
            MarkdownFile mdFile = new MarkdownFile();

            mdFile.AddSection("A Header");
            string mdText = mdFile.ToMarkdownString();

            Console.WriteLine("Some markdown: {0}", mdText);

            Console.WriteLine("Done");
            Console.ReadLine();
        }
Exemple #3
0
        internal static DotNetDocumentationFile LoadXmlAndAssembly(string dllFilename, string xmlDocumentationFilename, string[] includeDlls)
        {
            DotNetDocumentationFile xmlDocumentation = new DotNetDocumentationFile(xmlDocumentationFilename);

            xmlDocumentation.AddAssemblyInfo(dllFilename, includeDlls);
            return(xmlDocumentation);
        }
        public void DotNetDocumentationFile_InheritComments_OneLevelDeep()
        {
            //arrange
            string xmlDocumentationFilename = Utilities.GetPathTo("data/DotNetDocumentationFile_InheritComments_OneLevelDeep.xml");
            //act
            DotNetDocumentationFile xmlDocumentation = new DotNetDocumentationFile(xmlDocumentationFilename);
            DotNetType inheritanceTypeA = xmlDocumentation.Types.First(t => t.Name.LocalName == "InheritanceClassA");

            inheritanceTypeA.AddAssemblyInfo(typeof(InheritanceClassA), inheritanceTypeA.Name);
            DotNetType inheritanceTypeB = xmlDocumentation.Types.First(t => t.Name.LocalName == "InheritanceClassB");

            inheritanceTypeB.AddAssemblyInfo(typeof(InheritanceClassB), inheritanceTypeB.Name);
            DotNetType inheritanceTypeC = xmlDocumentation.Types.First(t => t.Name.LocalName == "InheritanceInterfaceC");

            inheritanceTypeC.AddAssemblyInfo(typeof(InheritanceInterfaceC), inheritanceTypeC.Name);
            xmlDocumentation.ResolveInheritedComments();
            //assert
            Assert.AreEqual(inheritanceTypeA.SummaryComments[0], inheritanceTypeB.SummaryComments[0]);
            Assert.AreEqual(inheritanceTypeA.Fields[0].SummaryComments[0], inheritanceTypeB.Fields[0].SummaryComments[0]);
            Assert.AreEqual(inheritanceTypeA.Properties[0].SummaryComments[0], inheritanceTypeB.Properties.First(p => p.Name.LocalName == "PropertyA").SummaryComments[0]);
            Assert.AreEqual(inheritanceTypeA.Events[0].SummaryComments[0], inheritanceTypeB.Events[0].SummaryComments[0]);
            Assert.AreEqual(inheritanceTypeA.Methods[0].SummaryComments[0], inheritanceTypeB.Methods.First(p => p.Name.LocalName == "MethodA").SummaryComments[0]);
            Assert.AreEqual(inheritanceTypeC.Properties[0].SummaryComments[0], inheritanceTypeB.Properties.First(p => p.Name.LocalName == "PropertyC").SummaryComments[0]);
            Assert.AreEqual(inheritanceTypeC.Methods[0].SummaryComments[0], inheritanceTypeB.Methods.First(p => p.Name.LocalName == "MethodC").SummaryComments[0]);
        }
        public void DotNetDocumentationFile_DuplicateComments_OneLevelDeep()
        {
            //arrange
            string filename = Utilities.GetPathTo("data/DotNetDocumentationFile_DuplicateComments_OneLevelDeep.xml");
            //act
            DotNetDocumentationFile file = new DotNetDocumentationFile(filename);

            List <DotNetMember> members = new List <DotNetMember>();

            foreach (DotNetType type in file.Types)
            {
                members.Add(type);
                members.AddRange(type.Methods);
                members.AddRange(type.Fields);
                members.AddRange(type.Properties);
                members.AddRange(type.Events);
            }
            DotNetMember typeA     = members.OfType <DotNetType>().FirstOrDefault(m => m.Name.LocalName == "TypeA");
            DotNetMember methodA   = members.OfType <DotNetMethod>().FirstOrDefault(m => m.Name.LocalName == "MethodA");
            DotNetMember fieldA    = members.OfType <DotNetField>().FirstOrDefault(m => m.Name.LocalName == "FieldA");
            DotNetMember propertyA = members.OfType <DotNetProperty>().FirstOrDefault(m => m.Name.LocalName == "PropertyA");
            DotNetMember eventA    = members.OfType <DotNetEvent>().FirstOrDefault(m => m.Name.LocalName == "EventA");

            //assert
            int count = 0;

            foreach (DotNetMember member in members)
            {
                if (member.Name.LocalName.EndsWith("FromTypeA"))
                {
                    Assert.AreEqual(typeA.SummaryComments[0], member.SummaryComments[0]);
                }
                else if (member.Name.LocalName.EndsWith("FromMethodA"))
                {
                    Assert.AreEqual(methodA.SummaryComments[0], member.SummaryComments[0]);
                }
                else if (member.Name.LocalName.EndsWith("FromFieldA"))
                {
                    Assert.AreEqual(fieldA.SummaryComments[0], member.SummaryComments[0]);
                }
                else if (member.Name.LocalName.EndsWith("FromPropertyA"))
                {
                    Assert.AreEqual(propertyA.SummaryComments[0], member.SummaryComments[0]);
                }
                else if (member.Name.LocalName.EndsWith("FromEventA"))
                {
                    Assert.AreEqual(eventA.SummaryComments[0], member.SummaryComments[0]);
                }
                else
                {
                    continue;
                }
                count++;
            }
            Assert.AreEqual(25, count);
        }
        public void DotNetDocumentationFile_LoadFromFile()
        {
            //arrange
            string filename = Utilities.GetPathTo("data/DotNetDocumentationFile_Assembly.xml");
            //act
            DotNetDocumentationFile file = new DotNetDocumentationFile(filename);

            //assert
            Assert.AreEqual(ASSEMBLY_NAME, file.AssemblyName);
        }
        public void DotNetDocumentationFile_OrphanedMember_Ignore()
        {
            //arrange
            string filename = Utilities.GetPathTo("data/DotNetDocumentationFile_OrphanedMember.xml");
            //act
            DotNetDocumentationFile file = new DotNetDocumentationFile(filename);

            //assert
            Assert.AreEqual(0, file.Types.Count);
        }
        public void DotNetDocumentationFile_LoadFromXDocument()
        {
            //arrange
            XDocument document = XDocument.Load(Utilities.GetPathTo("data/DotNetDocumentationFile_Assembly.xml"), LoadOptions.PreserveWhitespace);
            //act
            DotNetDocumentationFile file = new DotNetDocumentationFile(document);

            //assert
            Assert.AreEqual(ASSEMBLY_NAME, file.AssemblyName);
        }
        public void DotNetDocumentationFile_AddAssemblyInfo_LaterTargetFramework()
        {
            //arrange
            XDocument document               = XDocument.Load(Utilities.GetPathTo("data/DotNetDocumentationFile_Assembly.xml"), LoadOptions.PreserveWhitespace);
            DotNetDocumentationFile file     = new DotNetDocumentationFile(document);
            string laterFrameworkDllFilename = Path.Combine(Utilities.GetProjectDirectory(), "../LaterFrameworkTest/bin/Debug/LaterFrameworkTest.dll");

            //act
            file.AddAssemblyInfo(laterFrameworkDllFilename);
            //assert exception
        }
Exemple #10
0
 private void GenerateAndSaveTableOfContents(DotNetDocumentationFile xmlDocumentation, DotNetQualifiedClassNameTreeNode node, string directory)
 {
     if (node.Value != null)
     {
         Save(GenerateTableOfContents(xmlDocumentation, node), directory, TableOfContentsFilename(node.Value));
     }
     foreach (DotNetQualifiedClassNameTreeNode child in node.Children)
     {
         GenerateAndSaveTableOfContents(xmlDocumentation, child, directory);
     }
 }
        public void DotNetDocumentationFile_SmokeTest_Windows_GUI()
        {
            //arrange
            string xmlDocumentationFilename = Path.Combine(Utilities.GetProjectDirectory(), "../../WithoutHaste.Windows.GUI/GUI/bin/Debug/WithoutHaste.Windows.GUI.XML");
            string dllFilename = Path.Combine(Utilities.GetProjectDirectory(), "../../WithoutHaste.Windows.GUI/GUI/bin/Debug/WithoutHaste.Windows.GUI.dll");
            //act
            DotNetDocumentationFile xmlDocumentation = new DotNetDocumentationFile(xmlDocumentationFilename);

            xmlDocumentation.AddAssemblyInfo(dllFilename);
            //assert
            Assert.IsTrue(xmlDocumentation.Types.Count(t => t.Category != TypeCategory.Unknown) > 0);
        }
        public void DotNetDocumentationFile_SmokeTest_EarlyDocsTest()
        {
            //arrange
            string xmlDocumentationFilename = Path.Combine(Utilities.GetProjectDirectory(), "../../EarlyDocs/Test/bin/Debug/Test.XML");
            string dllFilename = Path.Combine(Utilities.GetProjectDirectory(), "../../EarlyDocs/Test/bin/Debug/Test.dll");
            //act
            DotNetDocumentationFile xmlDocumentation = new DotNetDocumentationFile(xmlDocumentationFilename);

            xmlDocumentation.AddAssemblyInfo(dllFilename);
            //assert
            Assert.IsTrue(xmlDocumentation.Types.Count(t => t.Category != TypeCategory.Unknown) > 0);
        }
        public void DotNetDocumentationFile_AddAssemblyInfo_ThirdParty_LaterTargetFramework()
        {
            //arrange
            string xmlDocumentationFilename = Path.Combine(Utilities.GetProjectDirectory(), "../DataFiles/bin/Debug/WithoutHaste.DataFiles.XML");
            string dllFilename = Path.Combine(Utilities.GetProjectDirectory(), "../DataFiles/bin/Debug/WithoutHaste.DataFiles.dll");
            string laterFrameworkDllFilename = Path.Combine(Utilities.GetProjectDirectory(), "../LaterFrameworkTest/bin/Debug/LaterFrameworkTest.dll");
            //act
            DotNetDocumentationFile xmlDocumentation = new DotNetDocumentationFile(xmlDocumentationFilename);

            xmlDocumentation.AddAssemblyInfo(dllFilename, laterFrameworkDllFilename);
            //assert exception
        }
        public void DotNetDocumentationFile_SmokeTest_DataFiles()
        {
            //arrange
            string xmlDocumentationFilename = Path.Combine(Utilities.GetProjectDirectory(), "../DataFiles/bin/Debug/WithoutHaste.DataFiles.XML");
            string dllFilename = Path.Combine(Utilities.GetProjectDirectory(), "../DataFiles/bin/Debug/WithoutHaste.DataFiles.dll");
            //act
            DotNetDocumentationFile xmlDocumentation = new DotNetDocumentationFile(xmlDocumentationFilename);

            //xmlDocumentation.AddAssemblyForReference("System.Xml");
            xmlDocumentation.AddAssemblyInfo(dllFilename);
            //assert
            Assert.IsTrue(xmlDocumentation.Types.Count(t => t.Category != TypeCategory.Unknown) > 0);
        }
        public void DotNetDocumentationFile_InheritComments_NoBaseType()
        {
            //arrange
            string xmlDocumentationFilename = Utilities.GetPathTo("data/DotNetDocumentationFile_InheritComments_NoBaseType.xml");
            //act
            DotNetDocumentationFile xmlDocumentation = new DotNetDocumentationFile(xmlDocumentationFilename);
            DotNetType inheritanceTypeA = xmlDocumentation.Types.First(t => t.Name.LocalName == "InheritanceClassA");

            inheritanceTypeA.AddAssemblyInfo(typeof(InheritanceClassA), inheritanceTypeA.Name);
            xmlDocumentation.ResolveInheritedComments();
            //assert
            Assert.AreEqual(CommentTag.InheritDoc, inheritanceTypeA.FloatingComments[0].Tag);
        }
Exemple #16
0
        public void DotNetCommentInherit_FromAssembly_MethodFromBaseType()
        {
            //arrange
            string filename = Utilities.GetPathTo("data/DotNetCommentInherit_TypeFromBaseType.xml");
            //act
            DotNetDocumentationFile file = new DotNetDocumentationFile(filename);

            file.Types.First(t => t.Name.LocalName == "DerivedType").AddAssemblyInfo(typeof(DerivedType), new DotNetQualifiedName("DataFilesTest", "DotNetCommentInheritTests", "DerivedType"));
            file.ResolveInheritedComments();
            //assert
            Assert.AreEqual(2, file.Types.Count);
            Assert.AreEqual(file.Types[0].Methods.First(m => m.Name.LocalName == "MethodA" && m.MethodName.Parameters.Count == 0).SummaryComments.Comments[0], file.Types[1].Methods.First(m => m.Name.LocalName == "MethodA" && m.MethodName.Parameters.Count == 0).SummaryComments.Comments[0]);
        }
Exemple #17
0
        public void MiscTests_GenericParameters()
        {
            //arrange
            //act
            DotNetDocumentationFile file = EarlyDocs.ConvertXML.LoadXmlAndAssembly("../../../Test/bin/Debug/Test.dll", "../../../Test/bin/Debug/Test.XML", new string[] { });
            DotNetType genericType       = file.Types.First(t => t.Name.LocalName == "ClassExceptionGeneric<Apple>");
            string     markdown          = EarlyDocs.DotNetExtensions.ToMarkdownFile(genericType).ToMarkdownString();

            //assert
            Assert.IsTrue(markdown.Contains("Apple { public get; protected set; }"));
            Assert.IsTrue(markdown.Contains("ClassExceptionGeneric&lt;Apple&gt;(Apple value)"));
            Assert.IsTrue(markdown.Contains("MethodA(Apple value)"));
        }
Exemple #18
0
        internal ConvertXML(string dllFilename, string xmlDocumentationFilename, string outputDirectory, string[] includeDlls, bool emptyOutputDirectoryFirst)
        {
            DotNetDocumentationFile xmlDocumentation = LoadXmlAndAssembly(dllFilename, xmlDocumentationFilename, includeDlls);

            DotNetExtensions.TurnQualifiedNameConverterOn();

            PrepareOutputDirectory(outputDirectory, emptyOutputDirectoryFirst);
            BuildInternalFullNames(xmlDocumentation.Types);
            BuildInternalFullNames(xmlDocumentation.Delegates);
            BuildInterfaceImplementedByTypes(xmlDocumentation.Types);
            BuildTypeDerivedBy(xmlDocumentation.Types);
            GenerateTypePages(xmlDocumentation.Types, outputDirectory);
            GenerateDelegatePages(xmlDocumentation.Delegates, outputDirectory);
            GenerateTableOfContents(xmlDocumentation, outputDirectory);
        }
        public void DotNetDocumentationFile_DuplicateComments_Loop()
        {
            //arrange
            string filename = Utilities.GetPathTo("data/DotNetDocumentationFile_DuplicateComments_Loop.xml");
            //act
            DotNetDocumentationFile file = new DotNetDocumentationFile(filename);
            DotNetType typeA             = file.Types.FirstOrDefault(m => m.Name.LocalName == "TypeA");
            DotNetType typeB             = file.Types.FirstOrDefault(m => m.Name.LocalName == "TypeB");
            DotNetType typeC             = file.Types.FirstOrDefault(m => m.Name.LocalName == "TypeC");

            //assert
            Assert.AreNotEqual(typeA.FloatingComments[0], typeB.FloatingComments[0]);
            Assert.AreNotEqual(typeB.FloatingComments[0], typeC.FloatingComments[0]);
            Assert.AreNotEqual(typeC.FloatingComments[0], typeA.FloatingComments[0]);
        }
        public void DotNetDocumentationFile_InheritComments_DifferentGenericAliases()
        {
            //arrange
            string xmlDocumentationFilename = Utilities.GetPathTo("data/DotNetDocumentationFile_InheritComments_DifferentGenericAliases.xml");
            //act
            DotNetDocumentationFile xmlDocumentation = new DotNetDocumentationFile(xmlDocumentationFilename);
            DotNetType inheritanceTypeI = xmlDocumentation.Types.First(t => t.Name.LocalName == "InheritanceClassI");

            inheritanceTypeI.AddAssemblyInfo(typeof(InheritanceClassI), inheritanceTypeI.Name);
            DotNetType inheritanceTypeJ = xmlDocumentation.Types.First(t => t.Name.LocalName == "InheritanceClassJ");

            inheritanceTypeJ.AddAssemblyInfo(typeof(InheritanceClassJ), inheritanceTypeJ.Name);
            xmlDocumentation.ResolveInheritedComments();
            //assert
            Assert.AreEqual(inheritanceTypeI.Methods[0].SummaryComments[0], inheritanceTypeJ.Methods[0].SummaryComments[0]);
        }
        public void DotNetDocumentationFile_InheritComments_OrderOfInterfaces()
        {
            //arrange
            string xmlDocumentationFilename = Utilities.GetPathTo("data/DotNetDocumentationFile_InheritComments_OrderOfInterfaces.xml");
            //act
            DotNetDocumentationFile xmlDocumentation = new DotNetDocumentationFile(xmlDocumentationFilename);
            DotNetType inheritanceTypeF = xmlDocumentation.Types.First(t => t.Name.LocalName == "InheritanceInterfaceF");

            inheritanceTypeF.AddAssemblyInfo(typeof(InheritanceInterfaceF), inheritanceTypeF.Name);
            DotNetType inheritanceTypeG = xmlDocumentation.Types.First(t => t.Name.LocalName == "InheritanceInterfaceG");

            inheritanceTypeG.AddAssemblyInfo(typeof(InheritanceInterfaceG), inheritanceTypeG.Name);
            DotNetType inheritanceTypeH = xmlDocumentation.Types.First(t => t.Name.LocalName == "InheritanceClassH");

            inheritanceTypeH.AddAssemblyInfo(typeof(InheritanceClassH), inheritanceTypeH.Name);
            xmlDocumentation.ResolveInheritedComments();
            //assert
            Assert.AreEqual(inheritanceTypeG.Properties[0].SummaryComments[0], inheritanceTypeH.Properties.First(p => p.Name.LocalName == "PropertyA").SummaryComments[0]);
        }
        public void DotNetDocumentationFile_DuplicateComments_MultipleLevelsDeep()
        {
            //arrange
            string filename = Utilities.GetPathTo("data/DotNetDocumentationFile_DuplicateComments_MultipleLevelsDeep.xml");
            //act
            DotNetDocumentationFile file = new DotNetDocumentationFile(filename);
            DotNetType typeA             = file.Types.FirstOrDefault(m => m.Name.LocalName == "TypeA");
            //assert
            int count = 0;

            foreach (DotNetType type in file.Types)
            {
                if (type == typeA)
                {
                    continue;
                }
                Assert.AreEqual(typeA.SummaryComments[0], type.SummaryComments[0]);
                count++;
            }
            Assert.AreEqual(5, count);
        }
Exemple #23
0
        private MarkdownSection BuildMasterSummary(DotNetDocumentationFile xmlDocumentation, DotNetQualifiedClassNameTreeNode node)
        {
            string            header  = (new MarkdownInlineLink(node.Value, TableOfContentsFilename(node.Value))).ToMarkdownString(null);
            MarkdownSection   section = new MarkdownSection(header);
            List <DotNetType> types   = xmlDocumentation.Types.Where(t => t.Name.FullNamespace == node.Value).ToList();

            foreach (DotNetType type in types.OrderBy(t => t.Name))
            {
                section.Add(new MarkdownLine(new MarkdownInlineLink(type.Name, FormatFilename(type.Name + Ext.MD))));
            }
            List <DotNetDelegate> _delegates = xmlDocumentation.Delegates.Where(d => d.Name.FullNamespace == node.Value).ToList();

            foreach (DotNetDelegate _delegate in _delegates.OrderBy(d => d.Name))
            {
                section.Add(new MarkdownLine(new MarkdownInlineLink(_delegate.Name, FormatFilename(_delegate.Name + Ext.MD))));
            }
            foreach (DotNetQualifiedClassNameTreeNode child in node.Children.OrderBy(c => c.Value))
            {
                section.AddSection(BuildMasterSummary(xmlDocumentation, child));
            }
            return(section);
        }
Exemple #24
0
        private void GenerateTableOfContents(DotNetDocumentationFile xmlDocumentation, string directory)
        {
            List <DotNetQualifiedClassName> _namespaces = new List <DotNetQualifiedClassName>();

            foreach (DotNetType type in xmlDocumentation.Types)
            {
                _namespaces.Add(type.ClassName.FullClassNamespace);
            }
            foreach (DotNetDelegate _delegate in xmlDocumentation.Delegates)
            {
                _namespaces.Add(_delegate.MethodName.FullClassNamespace);
            }
            _namespaces = _namespaces.Distinct().ToList();
            DotNetQualifiedClassNameTreeNode root = DotNetQualifiedClassNameTreeNode.Generate(_namespaces);

            GenerateAndSaveTableOfContents(xmlDocumentation, root, directory);

            //master table of contents
            MarkdownFile    markdown = new MarkdownFile();
            MarkdownSection section  = markdown.AddSection("Table of Contents");

            if (root.Value == null)
            {
                foreach (DotNetQualifiedClassNameTreeNode node in root.Children)
                {
                    MarkdownSection subsection = BuildMasterSummary(xmlDocumentation, node);
                    section.AddSection(subsection);
                }
            }
            else
            {
                MarkdownSection subsection = BuildMasterSummary(xmlDocumentation, root);
                section.AddSection(subsection);
            }
            Save(markdown, directory, "TableOfContents" + Ext.MD);
        }
        public void DotNetDocumentationFile_CommentFromXml_Full()
        {
            //arrange
            XDocument document = XDocument.Load(Utilities.GetPathTo("data/DotNetDocumentationFile_Full.xml"), LoadOptions.PreserveWhitespace);
            //act
            DotNetDocumentationFile file = new DotNetDocumentationFile(document);

            //assert
            Assert.AreEqual(5, file.TypeCount);

            DotNetType typeA = file.Types[0];

            Assert.AreEqual(2, typeA.NestedTypeCount);
            Assert.AreEqual("Test.TypeA", typeA.Name.FullName);
            Assert.AreEqual(true, typeA.HasComments);
            Assert.AreEqual(1, typeA.Methods.Count);
            Assert.AreEqual(2, typeA.Fields.Count);
            Assert.AreEqual(3, typeA.Properties.Count);
            Assert.AreEqual(1, typeA.Events.Count);

            DotNetType typeB = typeA.NestedTypes[0];

            Assert.AreEqual(1, typeB.NestedTypeCount);
            Assert.AreEqual("Test.TypeA.NestedTypeB", typeB.Name.FullName);
            Assert.AreEqual(true, typeB.HasComments);
            Assert.AreEqual(1, typeB.Methods.Count);

            DotNetType typeC = typeB.NestedTypes[0];

            Assert.AreEqual(0, typeC.NestedTypeCount);
            Assert.AreEqual("Test.TypeA.NestedTypeB.SubNestedTypeC", typeC.Name.FullName);
            Assert.AreEqual(true, typeC.HasComments);
            Assert.AreEqual(2, typeC.Methods.Count);

            DotNetType typeD = file.Types[1];

            Assert.AreEqual("Test.SingleGenericTypeD<T>", typeD.Name.FullName);
            Assert.AreEqual(false, typeD.HasComments);
            Assert.AreEqual(1, typeD.Methods.Count);

            DotNetType typeE = file.Types[2];

            Assert.AreEqual("Test.DoubleGenericTypeE<T,U>", typeE.Name.FullName);
            Assert.AreEqual(false, typeE.HasComments);
            Assert.AreEqual(3, typeE.Methods.Count);

            DotNetMethod methodAA = typeA.Methods[0];

            Assert.AreEqual("Test.TypeA.MethodAA", methodAA.Name.FullName);
            Assert.AreEqual(true, methodAA.HasComments);
            Assert.AreEqual(false, methodAA is DotNetMethodConstructor);
            Assert.AreEqual(false, methodAA is DotNetMethodOperator);
            Assert.AreEqual(0, methodAA.MethodName.Parameters.Count);

            DotNetMethod methodBA = typeB.Methods[0];

            Assert.AreEqual("Test.TypeA.NestedTypeB.MethodBA", methodBA.Name.FullName);
            Assert.AreEqual(false, methodBA.HasComments);
            Assert.AreEqual(false, methodBA is DotNetMethodConstructor);
            Assert.AreEqual(false, methodBA is DotNetMethodOperator);
            Assert.AreEqual(2, methodBA.MethodName.Parameters.Count);

            DotNetMethod methodCA = typeC.Methods[0];

            Assert.AreEqual("Test.TypeA.NestedTypeB.SubNestedTypeC.MethodCA", methodCA.Name.FullName);
            Assert.AreEqual(false, methodCA.HasComments);
            Assert.AreEqual(false, methodCA is DotNetMethodConstructor);
            Assert.AreEqual(false, methodCA is DotNetMethodOperator);
            Assert.AreEqual(1, methodCA.MethodName.Parameters.Count);

            DotNetMethod methodCConstructor = typeC.Methods[1];

            Assert.AreEqual("Test.TypeA.NestedTypeB.SubNestedTypeC.#ctor", methodCConstructor.Name.FullName);
            Assert.AreEqual(false, methodCConstructor.HasComments);
            Assert.AreEqual(true, methodCConstructor is DotNetMethodConstructor);
            Assert.AreEqual(false, methodCConstructor is DotNetMethodOperator);
            Assert.AreEqual(0, methodCConstructor.MethodName.Parameters.Count);

            DotNetMethod methodDAddition = typeD.Methods[0];

            Assert.AreEqual("Test.SingleGenericTypeD<T>.op_Addition", methodDAddition.Name.FullName);
            Assert.AreEqual(false, methodDAddition.HasComments);
            Assert.AreEqual(false, methodDAddition is DotNetMethodConstructor);
            Assert.AreEqual(true, methodDAddition is DotNetMethodOperator);
            Assert.AreEqual(2, methodDAddition.MethodName.Parameters.Count);
            Assert.AreEqual("T", methodDAddition.MethodName.Parameters[0].FullTypeName);
            Assert.AreEqual("Test.SingleGenericTypeD<T>", methodDAddition.MethodName.Parameters[1].FullTypeName);

            DotNetMethod methodEConstructor = typeE.Methods[0];

            Assert.AreEqual("Test.DoubleGenericTypeE<T,U>.#ctor", methodEConstructor.Name.FullName);
            Assert.AreEqual(false, methodEConstructor.HasComments);
            Assert.AreEqual(true, methodEConstructor is DotNetMethodConstructor);
            Assert.AreEqual(false, methodEConstructor is DotNetMethodOperator);
            Assert.AreEqual(2, methodEConstructor.MethodName.Parameters.Count);
            Assert.AreEqual("U", methodEConstructor.MethodName.Parameters[0].FullTypeName);
            Assert.AreEqual("T", methodEConstructor.MethodName.Parameters[1].FullTypeName);

            DotNetMethod methodEA = typeE.Methods[1];

            Assert.AreEqual("Test.DoubleGenericTypeE<T,U>.MethodEA<A>", methodEA.Name.FullName);
            Assert.AreEqual(false, methodEA.HasComments);
            Assert.AreEqual(false, methodEA is DotNetMethodConstructor);
            Assert.AreEqual(false, methodEA is DotNetMethodOperator);
            Assert.AreEqual(3, methodEA.MethodName.Parameters.Count);
            Assert.AreEqual("System.String", methodEA.MethodName.Parameters[0].FullTypeName);
            Assert.AreEqual("A", methodEA.MethodName.Parameters[1].FullTypeName);
            Assert.AreEqual("U", methodEA.MethodName.Parameters[2].FullTypeName);

            DotNetMethod methodEB = typeE.Methods[2];

            Assert.AreEqual("Test.DoubleGenericTypeE<T,U>.MethodEB<A>", methodEB.Name.FullName);
            Assert.AreEqual(false, methodEB.HasComments);
            Assert.AreEqual(false, methodEB is DotNetMethodConstructor);
            Assert.AreEqual(false, methodEB is DotNetMethodOperator);
            Assert.AreEqual(1, methodEB.MethodName.Parameters.Count);
            Assert.AreEqual("System.Collections.Generic.List<Test.SingleGenericTypeD<T>>", methodEB.MethodName.Parameters[0].FullTypeName);
        }