示例#1
0
 private static void Diff(string caption, SlashdocDictionary left, SlashdocDictionary right)
 {
     foreach (var key in left.Keys)
     {
         if (!right.ContainsKey(key))
         {
             Console.WriteLine(string.Format("{0}: {1}", caption, key));
         }
     }
 }
        private static Stream DescribeType(Type type, SlashdocDictionary slashdoc)
        {
            var stream   = new MemoryStream();
            var language = new CSharpSignatureProvider();

            using (var writer = new ApiReferenceHtmlWriter(stream, false, "Xyz", slashdoc, language, new Mock <ILog>().Object))
            {
                writer.DescribeType(type, new SlashdocSummaryHtmlFormatter(DummyAssembly, language));
            }
            stream.Seek(0, SeekOrigin.Begin);
            return(stream);
        }
        public void ShouldDescribeAGenericClass_CSharp()
        {
            var slashdoc = new SlashdocDictionary();

            var stream = DescribeType(typeof(TestData.Xyz.Foo.TestGeneric <,>), slashdoc);

            var xmlReader = XmlReader.Create(stream, new XmlReaderSettings {
                DtdProcessing = DtdProcessing.Ignore
            });
            var resolver  = CreateHtmlNamespaceResolver(xmlReader);
            var navigator = CreateXPathNavigator(xmlReader);

            var node    = navigator.SelectSingleNode("//html:div[@id='TestData.Xyz.Foo.TestGeneric<T, G>']", resolver);
            var content = GetNodeContent(node);

            Assert.That(content.Contains("<h2>TestGeneric&lt;T, G&gt; class</h2>"), "header");
        }
        public void ShouldDescribeANestedClass_CSharp()
        {
            var slashdoc = new SlashdocDictionary();

            var stream = DescribeType(typeof(TestData.Xyz.Foo.TestClass.NestedClass), slashdoc);

            var xmlReader = XmlReader.Create(stream, new XmlReaderSettings {
                DtdProcessing = DtdProcessing.Ignore
            });
            var resolver  = CreateHtmlNamespaceResolver(xmlReader);
            var navigator = CreateXPathNavigator(xmlReader);

            var content = GetSingleNodeContent("//html:div[@id='TestData.Xyz.Foo.TestClass.NestedClass']", navigator, resolver);

            Assert.That(content.Contains("<h2>TestClass.NestedClass class</h2>"), "header");
            Assert.That(content.Contains("TestData.Xyz.Foo"), "namespace");
            Assert.That(content.Contains("class TestClass.NestedClass"), "NestedClass signature");
        }
        public void ShouldXmlEscapeSlashdocSummaries()
        {
            var slashdoc = new SlashdocDictionary();

            slashdoc.SetXmlDescription("T:TestData.Xyz.Foo.ITest", "<summary>&lt;&lt;Hello&gt;&gt;</summary>");

            var stream = DescribeType(typeof(TestData.Xyz.Foo.ITest), slashdoc);

            var xmlReader = XmlReader.Create(stream, new XmlReaderSettings {
                DtdProcessing = DtdProcessing.Ignore
            });
            var resolver  = CreateHtmlNamespaceResolver(xmlReader);
            var navigator = CreateXPathNavigator(xmlReader);

            var content = GetSingleNodeContent("//html:div[@id='TestData.Xyz.Foo.ITest']", navigator, resolver);

            Assert.That(content.Contains("&lt;&lt;Hello&gt;&gt;"), "slashdoc summary");
        }
        public void ShouldDescribeAStruct_CSharp()
        {
            var slashdoc = new SlashdocDictionary();

            var stream = DescribeType(typeof(TestData.Xyz.Foo.TestStruct), slashdoc);

            var xmlReader = XmlReader.Create(stream, new XmlReaderSettings {
                DtdProcessing = DtdProcessing.Ignore
            });
            var resolver  = CreateHtmlNamespaceResolver(xmlReader);
            var navigator = CreateXPathNavigator(xmlReader);

            var node    = navigator.SelectSingleNode("//html:div[@id='TestData.Xyz.Foo.TestStruct']", resolver);
            var content = GetNodeContent(node);

            Assert.That(content.Contains("<h2>TestStruct struct</h2>"), "header");
            content = GetSingleNodeContent(".//html:table[.//html:th/text()='Events']", node, resolver);
            Assert.That(content.Contains("<td>event System.EventHandler PublicEvent</td>"), "event signature");
        }
        public void ShouldDescribeAnInterface_CSharp()
        {
            var slashdoc = new SlashdocDictionary();

            slashdoc.SetXmlDescription("T:TestData.Xyz.Foo.ITest", "<summary>Slashdoc summary for the ITest interface.</summary>");

            var stream = DescribeType(typeof(TestData.Xyz.Foo.ITest), slashdoc);

            var xmlReader = XmlReader.Create(stream, new XmlReaderSettings {
                DtdProcessing = DtdProcessing.Ignore
            });
            var resolver  = CreateHtmlNamespaceResolver(xmlReader);
            var navigator = CreateXPathNavigator(xmlReader);

            var content = GetSingleNodeContent("//html:div[@id='TestData.Xyz.Foo.ITest']", navigator, resolver);

            Assert.That(content.Contains("<h2>ITest interface</h2>"), "header");
            Assert.That(content.Contains("Slashdoc summary for the ITest interface."), "slashdoc summary");
        }
        public void ShouldNotIncludeTrivialMethods()
        {
            var slashdoc = new SlashdocDictionary();

            var stream = DescribeType(typeof(TestData.Xyz.Foo.PublicTestClass), slashdoc);

            var xmlReader = XmlReader.Create(stream, new XmlReaderSettings {
                DtdProcessing = DtdProcessing.Ignore
            });
            var resolver  = CreateHtmlNamespaceResolver(xmlReader);
            var navigator = CreateXPathNavigator(xmlReader);

            var node    = navigator.SelectSingleNode("//html:div[@id='TestData.Xyz.Foo.PublicTestClass']", resolver);
            var content = GetNodeContent(node);

            Assert.That(!content.Contains("ToString()"), "the 'trivial' ToString method shouldn't be listed in the API reference.");
            Assert.That(!content.Contains("Equals(object"), "the 'trivial' ToString method shouldn't be listed in the API reference.");
            Assert.That(!content.Contains("GetHashCode()"), "the 'trivial' ToString method shouldn't be listed in the API reference.");
            Assert.That(content.Contains("ToString(int x)"), "the non-trivial ToString(int) method should be listed in the API reference.");
            Assert.That(content.Contains("Equals(PublicTestClass"), "the non-trivial Equals(PublicTestClass) method should be listed in the API reference.");
        }
        public void ShouldDescribeAnEnum_CSharp()
        {
            var slashdoc = new SlashdocDictionary();

            slashdoc.SetXmlDescription("F:TestData.Xyz.Foo.TestEnum.One", "<summary>[enum One]</summary>");

            var stream = DescribeType(typeof(TestData.Xyz.Foo.TestEnum), slashdoc);

            var xmlReader = XmlReader.Create(stream, new XmlReaderSettings {
                DtdProcessing = DtdProcessing.Ignore
            });
            var resolver  = CreateHtmlNamespaceResolver(xmlReader);
            var navigator = CreateXPathNavigator(xmlReader);

            var node    = navigator.SelectSingleNode("//html:div[@id='TestData.Xyz.Foo.TestEnum']", resolver);
            var content = GetNodeContent(node);

            Assert.That(content.Contains("<h2>TestEnum enum</h2>"), "header");
            content = GetSingleNodeContent(".//html:table[.//html:th/text()='Members']", node, resolver);
            Assert.That(content.Contains("<td>One</td>"), "member signature");
            Assert.That(content.Contains("<td>[enum One]</td>"), "member slashdoc");
        }
        public void ShouldDescribeAClassAndItsMembers_CSharp()
        {
            var slashdoc = new SlashdocDictionary();

            slashdoc.SetXmlDescription("T:TestData.Xyz.Foo.TestClass", "<summary>Slashdoc summary for the TestClass class.</summary>");
            slashdoc.SetXmlDescription("M:TestData.Xyz.Foo.TestClass.#ctor(System.String)", "<summary>[string ctor]</summary>");
            slashdoc.SetXmlDescription("M:TestData.Xyz.Foo.TestClass.MethodReturningVoid", "<summary>[void method]</summary>");
            slashdoc.SetXmlDescription("F:TestData.Xyz.Foo.TestClass.x", "<summary>[field]</summary>");
            slashdoc.SetXmlDescription("E:TestData.Xyz.Foo.TestClass.AnEvent", "<summary>[event]</summary>");

            var stream = DescribeType(typeof(TestData.Xyz.Foo.TestClass), slashdoc);

            //var reader = new StreamReader(stream);
            //Console.WriteLine(reader.ReadToEnd());
            //stream.Seek(0, SeekOrigin.Begin);

            var xmlReader = XmlReader.Create(stream, new XmlReaderSettings {
                DtdProcessing = DtdProcessing.Ignore
            });
            var resolver  = CreateHtmlNamespaceResolver(xmlReader);
            var navigator = CreateXPathNavigator(xmlReader);

            // check type info
            var node    = navigator.SelectSingleNode("//html:div[@id='TestData.Xyz.Foo.TestClass']", resolver);
            var content = GetNodeContent(node);

            Assert.That(content.Contains("<h2>TestClass class</h2>"), "header");
            Assert.That(content.Contains("Slashdoc summary for the TestClass class."), "slashdoc summary");
            Assert.That(content.Contains("TestData.Xyz.Foo"), "namespace");
            Assert.That(content.Contains("class TestClass : System.ICloneable"));

            // constructors
            content = GetSingleNodeContent(".//html:table[.//html:th/text()='Constructors']", node, resolver);
            Assert.That(content.Contains("<td>TestClass(string xyz)</td>"), "constructor signature");
            Assert.That(content.Contains("[string ctor]"), "constructor slashdoc");

            Assert.That(!content.Contains("public"), "The public access modifier is assumed and therefore not included");

            // properties
            content = GetSingleNodeContent(".//html:table[.//html:th/text()='Properties']", node, resolver);
            Assert.That(content.Contains("<td>int ReadOnlyProperty { get; }</td>"), "read-only property");
            Assert.That(content.Contains("<td>int ReadWriteProperty { get; set; }</td>"), "read/write property");

            Assert.That(!content.Contains("InternalProperty"), "Non-public property isn't included.");

            // methods
            content = GetSingleNodeContent(".//html:table[.//html:th/text()='Methods']", node, resolver);
            Assert.That(content.Contains("<td>object Clone()</td>"), "method signature");
            Assert.That(content.Contains("<td>void MethodReturningVoid()</td>"), "MethodReturningVoid");
            Assert.That(content.Contains("[void method]"), "method slashdoc");

            Assert.That(!content.Contains("~TestClass") && !content.Contains("Finalize()"), "The finalizer shall not appear as a method.");
            Assert.That(!content.Contains("GetType()"), "Trivial methods shall be removed.");

            // operators
            content = GetSingleNodeContent(".//html:table[.//html:th/text()='Operators']", node, resolver);
            Assert.That(content.Contains("<td>static TestClass operator !(TestClass t)</td>"), "method signature");

            // fields (including constants)
            content = GetSingleNodeContent(".//html:table[.//html:th/text()='Fields']", node, resolver);
            Assert.That(content.Contains("<td>int x</td>"), "field signature, x");
            Assert.That(content.Contains("<td>const bool y</td>"), "field signature, y");
            Assert.That(content.Contains("[field]"), "field slashdoc");

            // events
            content = GetSingleNodeContent(".//html:table[.//html:th/text()='Events']", node, resolver);
            Assert.That(content.Contains("<td>static event System.EventHandler AnEvent</td>"), "event signature");
            Assert.That(content.Contains("[event]"), "event slashdoc");
        }