public void ExceptionElementWithoutCref()
            {
                // Given
                string code = @"
                    namespace Foo
                    {
                        class Green
                        {
                            /// <exception>Throws when null</exception>
                            void Go()
                            {
                            }
                        }
                    }
                ";
                MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(code));
                IDocument document = Substitute.For<IDocument>();
                document.GetStream().Returns(stream);
                IExecutionContext context = Substitute.For<IExecutionContext>();
                context.InputFolder.Returns(TestContext.CurrentContext.TestDirectory);
                context.GetDocument(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<IEnumerable<KeyValuePair<string, object>>>())
                    .Returns(x => new TestDocument((IEnumerable<MetadataItem>)x[2]));
                IModule module = new AnalyzeCSharp();

                // When
                List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                Assert.AreEqual(string.Empty,
                    GetMember(results, "Green", "Go").List<ReferenceComment>("Exceptions")[0].Name);
                Assert.AreEqual("Throws when null",
                    GetMember(results, "Green", "Go").List<ReferenceComment>("Exceptions")[0].Html);
                stream.Dispose();
            }
Esempio n. 2
0
        public void ClassMembersContainsMethods()
        {
            // Given
            string code = @"
                namespace Foo
                {
                    public class Blue
                    {
                        void Green()
                        {
                        }

                        void Red()
                        {
                        }
                    }
                }
            ";
            MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(code));
            IDocument document = Substitute.For<IDocument>();
            document.GetStream().Returns(stream);
            IExecutionContext context = Substitute.For<IExecutionContext>();
            context.InputFolder.Returns(TestContext.CurrentContext.TestDirectory);
            context.GetNewDocument(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<IEnumerable<MetadataItem>>())
                .Returns(x => new TestDocument((IEnumerable<MetadataItem>)x[2]));
            IModule module = new AnalyzeCSharp();

            // When
            List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

            // Then
            CollectionAssert.AreEquivalent(new[] { "Green", "Red" }, 
                GetResult(results, "Blue").Get<IReadOnlyList<IDocument>>("Members").Select(x => x["Name"]));
            stream.Dispose();
        }
        public void TopLevelNamespaceContainsDirectlyNestedNamespaces()
        {
            // Given
            string code = @"
                namespace Foo
                {
                }

                namespace Foo.Baz
                {
                }

                namespace Bar
                {
                }
            ";
            MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(code));
            IDocument document = Substitute.For<IDocument>();
            document.GetStream().Returns(stream);
            IExecutionContext context = Substitute.For<IExecutionContext>();
            context.InputFolder.Returns(Environment.CurrentDirectory);
            context.GetNewDocument(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<IEnumerable<MetadataItem>>())
                .Returns(x => new TestDocument((IEnumerable<MetadataItem>)x[2]));
            IModule module = new AnalyzeCSharp();

            // When
            List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

            // Then
            CollectionAssert.AreEquivalent(new[] { string.Empty, "Foo", "Baz", "Bar" }, results.Select(x => x["Name"]));
            CollectionAssert.AreEquivalent(new [] { "Foo", "Bar" }, 
                results.Single(x => x["Name"].Equals(string.Empty)).Get<IEnumerable<IDocument>>("MemberNamespaces").Select(x => x["Name"]));
            stream.Dispose();
        }
        public void ContainingTypeIsCorrect()
        {
            // Given
            string code = @"
                namespace Foo
                {
                    public class Blue
                    {
                        void Green()
                        {
                        }
                    }
                }
            ";
            MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(code));
            IDocument document = Substitute.For<IDocument>();
            document.GetStream().Returns(stream);
            IExecutionContext context = Substitute.For<IExecutionContext>();
            context.InputFolder.Returns(Environment.CurrentDirectory);
            context.GetNewDocument(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<IEnumerable<MetadataItem>>())
                .Returns(x => new TestDocument((IEnumerable<MetadataItem>)x[2]));
            IModule module = new AnalyzeCSharp();

            // When
            List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

            // Then
            Assert.AreEqual("Blue", GetMember(results, "Blue", "Green").Get<IDocument>("ContainingType")["Name"]);
            stream.Dispose();
        }
        public void SingleLineSummary()
        {
            // Given
            string code = @"
                namespace Foo
                {
                    /// <summary>This is a summary.</summary>
                    class Green
                    {
                    }

                    /// <summary>This is another summary.</summary>
                    struct Red
                    {
                    }
                }
            ";
            MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(code));
            IDocument document = Substitute.For<IDocument>();
            document.GetStream().Returns(stream);
            IExecutionContext context = Substitute.For<IExecutionContext>();
            context.InputFolder.Returns(Environment.CurrentDirectory);
            context.GetNewDocument(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<IEnumerable<MetadataItem>>())
                .Returns(x => new TestDocument((IEnumerable<MetadataItem>)x[2]));
            IModule module = new AnalyzeCSharp();

            // When
            List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

            // Then
            Assert.AreEqual("This is a summary.", GetResult(results, "Green")["Summary"]);
            Assert.AreEqual("This is another summary.", GetResult(results, "Red")["Summary"]);
            stream.Dispose();
        }
            public void TopLevelNamespaceContainsDirectlyNestedNamespaces()
            {
                // Given
                string code = @"
                    namespace Foo
                    {
                    }

                    namespace Foo.Baz
                    {
                    }

                    namespace Bar
                    {
                    }
                ";
                IDocument document = GetDocument(code);
                IExecutionContext context = GetContext();
                IModule module = new AnalyzeCSharp();

                // When
                List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                CollectionAssert.AreEquivalent(new[] { string.Empty, "Foo", "Baz", "Bar" }, results.Select(x => x["Name"]));
                CollectionAssert.AreEquivalent(new [] { "Foo", "Bar" }, 
                    results.Single(x => x["Name"].Equals(string.Empty)).Get<IEnumerable<IDocument>>("MemberNamespaces").Select(x => x["Name"]));
            }
            public void MultiLineSummary()
            {
                // Given
                string code = @"
                    namespace Foo
                    {
                        /// <summary>
                        /// This is a summary.
                        /// </summary>
                        class Green
                        {
                        }

                        /// <summary>
                        /// This is
                        /// another summary.
                        /// </summary>
                        struct Red
                        {
                        }
                    }
                ";
                IDocument document = GetDocument(code);
                IExecutionContext context = GetContext();
                IModule module = new AnalyzeCSharp();

                // When
                List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                Assert.AreEqual("\n    This is a summary.\n    ", GetResult(results, "Green")["Summary"]);
                Assert.AreEqual("\n    This is\n    another summary.\n    ", GetResult(results, "Red")["Summary"]);
            }
        public void FullNameDoesNotContainFullHierarchy()
        {
            // Given
            string code = @"
                namespace Foo
                {
                }

                namespace Foo.Bar
                {
                }
            ";
            MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(code));
            IDocument document = Substitute.For<IDocument>();
            document.GetStream().Returns(stream);
            IExecutionContext context = Substitute.For<IExecutionContext>();
            context.GetNewDocument(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<IEnumerable<KeyValuePair<string, object>>>())
                .Returns(x => new TestDocument((IEnumerable<KeyValuePair<string, object>>)x[2]));
            IModule module = new AnalyzeCSharp();

            // When
            List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

            // Then
            CollectionAssert.AreEquivalent(new[] { string.Empty, "Foo", "Bar" }, results.Select(x => x["FullName"]));
            stream.Dispose();
        }
Esempio n. 9
0
        public void ImplicitMemberAccessibility()
        {
            // Given
            string code = @"
                namespace Foo
                {
                    class Green
                    {
                        void Blue()
                        {
                        }
                    }
                }
            ";
            MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(code));
            IDocument document = Substitute.For<IDocument>();
            document.GetStream().Returns(stream);
            IExecutionContext context = Substitute.For<IExecutionContext>();
            context.InputFolder.Returns(TestContext.CurrentContext.TestDirectory);
            context.GetNewDocument(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<IEnumerable<MetadataItem>>())
                .Returns(x => new TestDocument((IEnumerable<MetadataItem>)x[2]));
            IModule module = new AnalyzeCSharp();

            // When
            List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

            // Then
            Assert.AreEqual(@"private void Blue()", GetMember(results, "Green", "Blue")["Syntax"]);
            stream.Dispose();
        }
            public void AbstractClass()
            {
                // Given
                string code = @"
                    namespace Foo
                    {
                        abstract class Green
                        {
                        }
                    }
                ";
                MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(code));
                IDocument document = Substitute.For<IDocument>();
                document.GetStream().Returns(stream);
                IExecutionContext context = Substitute.For<IExecutionContext>();
                context.InputFolder.Returns(TestContext.CurrentContext.TestDirectory);
                context.GetDocument(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<IEnumerable<KeyValuePair<string, object>>>())
                    .Returns(x => new TestDocument((IEnumerable<MetadataItem>)x[2]));
                IModule module = new AnalyzeCSharp();

                // When
                List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                Assert.AreEqual(@"internal abstract class Green", GetResult(results, "Green")["Syntax"]);
                stream.Dispose();
            }
Esempio n. 11
0
            public void ClassMembersContainsMethods()
            {
                // Given
                string code = @"
                    namespace Foo
                    {
                        public class Blue
                        {
                            void Green()
                            {
                            }

                            void Red()
                            {
                            }
                        }
                    }
                ";
                IDocument document = GetDocument(code);
                IExecutionContext context = GetContext();
                IModule module = new AnalyzeCSharp();

                // When
                List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                CollectionAssert.AreEquivalent(new[] { "Green", "Red" }, 
                    GetResult(results, "Blue").Get<IReadOnlyList<IDocument>>("Members").Select(x => x["Name"]));
            }
Esempio n. 12
0
        public void AutoProperty()
        {
            // Given
            string code = @"
                namespace Foo
                {
                    class Green
                    {
                        public int Blue { get; set; }
                    }
                }
            ";
            MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(code));
            IDocument document = Substitute.For<IDocument>();
            document.GetStream().Returns(stream);
            IExecutionContext context = Substitute.For<IExecutionContext>();
            context.GetNewDocument(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<IEnumerable<KeyValuePair<string, object>>>())
                .Returns(x => new TestDocument((IEnumerable<KeyValuePair<string, object>>)x[2]));
            IModule module = new AnalyzeCSharp();

            // When
            List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

            // Then
            Assert.AreEqual(@"public int Blue { get; set; }", GetMember(results, "Green", "Blue")["Syntax"]);
            stream.Dispose();
        }
Esempio n. 13
0
            public void BaseTypeIsCorrect()
            {
                // Given
                string code = @"
                    namespace Foo
                    {
                        public class Red
                        {
                        }

                        public class Green : Red
                        {
                        }

                        struct Blue
                        {
                        }

                        interface Yellow
                        {
                        }

                        interface Purple : Yellow
                        {
                        }

                        enum Orange
                        {
                        }
                    }
                ";
                MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(code));
                IDocument document = Substitute.For<IDocument>();
                document.GetStream().Returns(stream);
                IExecutionContext context = Substitute.For<IExecutionContext>();
                context.InputFolder.Returns(TestContext.CurrentContext.TestDirectory);
                context.GetDocument(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<IEnumerable<KeyValuePair<string, object>>>())
                    .Returns(x => new TestDocument((IEnumerable<MetadataItem>)x[2]));
                IModule module = new AnalyzeCSharp();

                // When
                List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                Assert.AreEqual("Object", results.Single(x => x["Name"].Equals("Red")).Get<IDocument>("BaseType")["Name"]);
                Assert.AreEqual("Red", results.Single(x => x["Name"].Equals("Green")).Get<IDocument>("BaseType")["Name"]);
                Assert.AreEqual("ValueType", results.Single(x => x["Name"].Equals("Blue")).Get<IDocument>("BaseType")["Name"]);
                Assert.IsNull(results.Single(x => x["Name"].Equals("Yellow")).Get<IDocument>("BaseType"));
                Assert.IsNull(results.Single(x => x["Name"].Equals("Purple")).Get<IDocument>("BaseType"));
                Assert.AreEqual("Enum", results.Single(x => x["Name"].Equals("Orange")).Get<IDocument>("BaseType")["Name"]);
                stream.Dispose();
            }
Esempio n. 14
0
        public void ReturnsAllTypes()
        {
            // Given
            string code = @"
                namespace Foo
                {
                    public class Blue
                    {
                    }

                    class Green
                    {
                        class Red
                        {
                        }
                    }

                    internal struct Yellow
                    {
                    }

                    enum Orange
                    {
                    }
                }
            ";
            MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(code));
            IDocument document = Substitute.For<IDocument>();
            document.GetStream().Returns(stream);
            IExecutionContext context = Substitute.For<IExecutionContext>();
            context.InputFolder.Returns(TestContext.CurrentContext.TestDirectory);
            context.GetNewDocument(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<IEnumerable<MetadataItem>>())
                .Returns(x => new TestDocument((IEnumerable<MetadataItem>)x[2]));
            IModule module = new AnalyzeCSharp();

            // When
            List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

            // Then
            CollectionAssert.AreEquivalent(new[] { string.Empty, "Foo", "Blue", "Green", "Red", "Yellow", "Orange" }, results.Select(x => x["Name"]));
            stream.Dispose();
        }
Esempio n. 15
0
            public void ImplicitClassAccessibility()
            {
                // Given
                string code = @"
                    namespace Foo
                    {
                        class Green
                        {
                        }
                    }
                ";
                IDocument document = GetDocument(code);
                IExecutionContext context = GetContext();
                IModule module = new AnalyzeCSharp();

                // When
                List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                Assert.AreEqual(@"internal class Green", GetResult(results, "Green")["Syntax"]);
            }
            public void DisplayNameContainsFullHierarchy()
            {
                // Given
                string            code     = @"
                    namespace Foo
                    {
                    }

                    namespace Foo.Bar
                    {
                    }
                ";
                IDocument         document = GetDocument(code);
                IExecutionContext context  = GetContext();
                IModule           module   = new AnalyzeCSharp();

                // When
                List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                CollectionAssert.AreEquivalent(new[] { "global", "Foo", "Foo.Bar" }, results.Select(x => x["DisplayName"]));
            }
Esempio n. 17
0
            public void DisplayNameIsCorrect()
            {
                // Given
                string       code     = @"
                    class Yellow
                    {
                        public X()
                        {
                        }

                        void Y<T>(T a, int b)
                        {
                        }

                        Z(bool a)
                        {
                        }
                    }
                ";
                MemoryStream stream   = new MemoryStream(Encoding.UTF8.GetBytes(code));
                IDocument    document = Substitute.For <IDocument>();

                document.GetStream().Returns(stream);
                IExecutionContext context = Substitute.For <IExecutionContext>();

                context.InputFolder.Returns(TestContext.CurrentContext.TestDirectory);
                context.GetDocument(Arg.Any <string>(), Arg.Any <string>(), Arg.Any <IEnumerable <KeyValuePair <string, object> > >())
                .Returns(x => new TestDocument((IEnumerable <MetadataItem>)x[2]));
                IModule module = new AnalyzeCSharp();

                // When
                List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                Assert.AreEqual("X()", GetMember(results, "Yellow", "X")["DisplayName"]);
                Assert.AreEqual("Y<T>(T, int)", GetMember(results, "Yellow", "Y")["DisplayName"]);
                Assert.AreEqual("Z(bool)", GetMember(results, "Yellow", "Z")["DisplayName"]);
                stream.Dispose();
            }
Esempio n. 18
0
            public void AutoProperty()
            {
                // Given
                const string      code     = @"
                    namespace Foo
                    {
                        class Green
                        {
                            public int Blue { get; set; }
                        }
                    }
                ";
                IDocument         document = GetDocument(code);
                IExecutionContext context  = GetContext();
                IModule           module   = new AnalyzeCSharp();

                // When
                List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                GetMember(results, "Green", "Blue")["Syntax"].ShouldBe("public int Blue { get; set; }");
            }
            public void WritePathIsCorrect()
            {
                // Given
                string            code     = @"
                    namespace Foo
                    {
                        namespace Bar
                        {
                        }
                    }
                ";
                IDocument         document = GetDocument(code);
                IExecutionContext context  = GetContext();
                IModule           module   = new AnalyzeCSharp();

                // When
                List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                CollectionAssert.AreEquivalent(new[] { "global/index.html", "Foo/index.html", "Foo.Bar/index.html" },
                                               results.Where(x => x["Kind"].Equals("Namespace")).Select(x => ((FilePath)x[Keys.WritePath]).FullPath));
            }
            public void GetsTopLevelNamespaces()
            {
                // Given
                string            code     = @"
                    namespace Foo
                    {
                    }

                    namespace Bar
                    {
                    }
                ";
                IDocument         document = GetDocument(code);
                IExecutionContext context  = GetContext();
                IModule           module   = new AnalyzeCSharp();

                // When
                List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                CollectionAssert.AreEquivalent(new [] { string.Empty, "Foo", "Bar" }, results.Select(x => x["Name"]));
            }
            public void SummaryWithUnknownSeeElement()
            {
                // Given
                string            code     = @"
                    namespace Foo
                    {
                        /// <summary>Check <see cref=""Red""/> class</summary>
                        class Green
                        {
                        }
                    }
                ";
                IDocument         document = GetDocument(code);
                IExecutionContext context  = GetContext();
                IModule           module   = new AnalyzeCSharp();

                // When
                List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                Assert.AreEqual("Check Red class", GetResult(results, "Green")["Summary"]);
            }
            public void NamespaceSummary()
            {
                // Given
                string            code     = @"
                    /// <summary>This is a summary.</summary>
                    namespace Foo
                    {
                        class Green
                        {
                        }
                    }
                ";
                IDocument         document = GetDocument(code);
                IExecutionContext context  = GetContext();
                IModule           module   = new AnalyzeCSharp();

                // When
                List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                Assert.AreEqual("This is a summary.", GetResult(results, "Foo")["Summary"]);
            }
            public void ExternalInclude()
            {
                // Given
                string            code     = @"
                    namespace Foo
                    {
                        /// <include file=""Included.xml"" path=""//Test/*"" />
                        class Green
                        {
                        }
                    }
                ";
                IDocument         document = GetDocument(code);
                IExecutionContext context  = GetContext();
                IModule           module   = new AnalyzeCSharp();

                // When
                List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                Assert.AreEqual("This is a included summary.", GetResult(results, "Green")["Summary"]);
            }
Esempio n. 24
0
            public void GetsTopLevelNamespaces()
            {
                // Given
                string code = @"
                    namespace Foo
                    {
                    }

                    namespace Bar
                    {
                    }
                ";
                IDocument document = GetDocument(code);
                IExecutionContext context = GetContext();
                IModule module = new AnalyzeCSharp();

                // When
                List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                CollectionAssert.AreEquivalent(new [] { string.Empty, "Foo", "Bar" }, results.Select(x => x["Name"]));
            }
Esempio n. 25
0
            public void SpecificKindIsCorrect()
            {
                // Given
                string            code     = @"
                    namespace Foo
                    {
                        public class Green
                        {
                            private class Blue
                            {
                            }
                        }

                        struct Red
                        {
                        }
                    }

                    namespace Foo.Bar
                    {
                        enum Yellow
                        {
                        }
                    }
                ";
                IDocument         document = GetDocument(code);
                IExecutionContext context  = GetContext();
                IModule           module   = new AnalyzeCSharp();

                // When
                List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                Assert.AreEqual("Class", results.Single(x => x["Name"].Equals("Green"))["SpecificKind"]);
                Assert.AreEqual("Class", results.Single(x => x["Name"].Equals("Blue"))["SpecificKind"]);
                Assert.AreEqual("Struct", results.Single(x => x["Name"].Equals("Red"))["SpecificKind"]);
                Assert.AreEqual("Enum", results.Single(x => x["Name"].Equals("Yellow"))["SpecificKind"]);
            }
Esempio n. 26
0
            public void ContainingTypeIsCorrect()
            {
                // Given
                string            code     = @"
                    namespace Foo
                    {
                        class Green
                        {
                            class Blue
                            {
                            }
                        }

                        struct Red
                        {
                        }
                    }

                    namespace Foo.Bar
                    {
                        enum Yellow
                        {
                        }
                    }
                ";
                IDocument         document = GetDocument(code);
                IExecutionContext context  = GetContext();
                IModule           module   = new AnalyzeCSharp();

                // When
                List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                Assert.IsNull(results.Single(x => x["Name"].Equals("Green")).Get <IDocument>("ContainingType"));
                Assert.AreEqual("Green", results.Single(x => x["Name"].Equals("Blue")).Get <IDocument>("ContainingType")["Name"]);
                Assert.IsNull(results.Single(x => x["Name"].Equals("Red")).Get <IDocument>("ContainingType"));
                Assert.IsNull(results.Single(x => x["Name"].Equals("Yellow")).Get <IDocument>("ContainingType"));
            }
Esempio n. 27
0
            public void ClassMembersContainsMethods()
            {
                try
                {
                    // Given
                    string            code     = @"
                        namespace Foo
                        {
                            public class Blue
                            {
                                void Green()
                                {
                                }

                                void Red()
                                {
                                }
                            }
                        }
                    ";
                    IDocument         document = GetDocument(code);
                    IExecutionContext context  = GetContext();
                    IModule           module   = new AnalyzeCSharp();

                    // When
                    List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                    // Then
                    CollectionAssert.AreEquivalent(
                        new[] { "Green", "Red", "ToString", "Equals", "Equals", "ReferenceEquals", "GetHashCode", "GetType", "Finalize", "MemberwiseClone" },
                        GetResult(results, "Blue").Get <IReadOnlyList <IDocument> >("Members").Select(x => x["Name"]));
                }
                catch (ReflectionTypeLoadException ex)
                {
                    Console.WriteLine("Loader exceptions: " + Environment.NewLine + string.Join(Environment.NewLine, ex.LoaderExceptions.Select(x => x.Message)));
                    throw;
                }
            }
Esempio n. 28
0
            public void ClassWithGenericTypeParametersAndBaseAndConstraints()
            {
                // Given
                string       code     = @"
                    namespace Foo
                    {
                        class Green<out TKey, TValue> : Blue, 


                            IFoo 

                    where TValue : class
                        {
                        }

                        class Blue
                        {
                        }
                    }
                ";
                MemoryStream stream   = new MemoryStream(Encoding.UTF8.GetBytes(code));
                IDocument    document = Substitute.For <IDocument>();

                document.GetStream().Returns(stream);
                IExecutionContext context = Substitute.For <IExecutionContext>();

                context.InputFolder.Returns(TestContext.CurrentContext.TestDirectory);
                context.GetDocument(Arg.Any <string>(), Arg.Any <string>(), Arg.Any <IEnumerable <KeyValuePair <string, object> > >())
                .Returns(x => new TestDocument((IEnumerable <MetadataItem>)x[2]));
                IModule module = new AnalyzeCSharp();

                // When
                List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                Assert.AreEqual(@"internal class Green<out TKey, TValue> : Blue, IFoo where TValue : class", GetResult(results, "Green")["Syntax"]);
                stream.Dispose();
            }
Esempio n. 29
0
            public void ConstructorsIsPopulated()
            {
                // Given
                string            code     = @"
                    namespace Foo
                    {
                        public class Blue
                        {
                            public Blue()
                            {
                            }

                            protected Blue(int x)
                            {
                            }

                            void Green()
                            {
                            }

                            int Red { get; }

                            string _yellow;

                            event ChangedEventHandler Changed;
                        }
                    }
                ";
                IDocument         document = GetDocument(code);
                IExecutionContext context  = GetContext();
                IModule           module   = new AnalyzeCSharp();

                // When
                List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                Assert.AreEqual(2, GetResult(results, "Blue").Get <IReadOnlyList <IDocument> >("Constructors").Count);
            }
Esempio n. 30
0
            public void WrapsForLongClassSignature()
            {
                // Given
                string            code     = @"
                    namespace Foo
                    {
                        class Green<TKey, TValue> : IReallyLongInterface, INameToForceWrapping, IFoo, IBar, IFooBar, ICircle, ISquare, IRectangle where TKey : class
                        {
                        }
                    }
                ";
                IDocument         document = GetDocument(code);
                IExecutionContext context  = GetContext();
                IModule           module   = new AnalyzeCSharp();

                // When
                List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                Assert.AreEqual(@"internal class Green<TKey, TValue> : IReallyLongInterface, INameToForceWrapping, IFoo, IBar, 
    IFooBar, ICircle, ISquare, IRectangle
    where TKey : class", GetResult(results, "Green")["Syntax"]);
            }
            public void NestedNamespacesReferenceParents()
            {
                // Given
                const string      code     = @"
                    namespace Foo
                    {
                    }

                    namespace Foo.Bar
                    {
                    }
                ";
                IDocument         document = GetDocument(code);
                IExecutionContext context  = GetContext();
                IModule           module   = new AnalyzeCSharp();

                // When
                List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                Assert.AreEqual("Foo", results.Single(x => x["Name"].Equals("Bar")).Get <IDocument>("ContainingNamespace")["Name"]);
                Assert.AreEqual(string.Empty, results.Single(x => x["Name"].Equals("Foo")).Get <IDocument>("ContainingNamespace")["Name"]);
            }
Esempio n. 32
0
            public void Enum()
            {
                // Given
                const string      code     = @"
                    namespace Foo
                    {
                        enum Green
                        {
                            Foo = 3,
                            Bar = 5
                        }
                    }
                ";
                IDocument         document = GetDocument(code);
                IExecutionContext context  = GetContext();
                IModule           module   = new AnalyzeCSharp();

                // When
                List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                GetResult(results, "Green")["Syntax"].ShouldBe("internal enum Green");
            }
            public void EnumWithBase()
            {
                // Given
                string            code     = @"
                    namespace Foo
                    {
                        enum Green : long
                        {
                            Foo = 3,
                            Bar = 5
                        }
                    }
                ";
                IDocument         document = GetDocument(code);
                IExecutionContext context  = GetContext();
                IModule           module   = new AnalyzeCSharp();

                // When
                List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                Assert.AreEqual(@"internal enum Green", GetResult(results, "Green")["Syntax"]);
            }
Esempio n. 34
0
            public void WritePathIsCorrect()
            {
                // Given
                string            code     = @"
                    namespace Foo
                    {
                        class Red
                        {
                        }

                        enum Green
                        {
                        }

                        namespace Bar
                        {
                            struct Blue
                            {
                            }
                        }
                    }

                    class Yellow
                    {
                    }
                ";
                IDocument         document = GetDocument(code);
                IExecutionContext context  = GetContext();
                IModule           module   = new AnalyzeCSharp();

                // When
                List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                CollectionAssert.AreEquivalent(new[] { "Foo/414E2165/index.html", "Foo.Bar/92C5B5C5/index.html", "global/439037DE/index.html", "Foo/53AB53EF/index.html" },
                                               results.Where(x => x["Kind"].Equals("NamedType")).Select(x => ((FilePath)x[Keys.WritePath]).FullPath));
            }
Esempio n. 35
0
        public void ClassMembersContainsMethods()
        {
            // Given
            string       code     = @"
                namespace Foo
                {
                    public class Blue
                    {
                        void Green()
                        {
                        }

                        void Red()
                        {
                        }
                    }
                }
            ";
            MemoryStream stream   = new MemoryStream(Encoding.UTF8.GetBytes(code));
            IDocument    document = Substitute.For <IDocument>();

            document.GetStream().Returns(stream);
            IExecutionContext context = Substitute.For <IExecutionContext>();

            context.InputFolder.Returns(Environment.CurrentDirectory);
            context.GetNewDocument(Arg.Any <string>(), Arg.Any <string>(), Arg.Any <IEnumerable <MetadataItem> >())
            .Returns(x => new TestDocument((IEnumerable <MetadataItem>)x[2]));
            IModule module = new AnalyzeCSharp();

            // When
            List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

            // Then
            CollectionAssert.AreEquivalent(new[] { "Green", "Red" },
                                           GetResult(results, "Blue").Get <IReadOnlyList <IDocument> >("Members").Select(x => x["Name"]));
            stream.Dispose();
        }
Esempio n. 36
0
        public void ClassMemberExcludedByPredicate()
        {
            // Given
            string code = @"
                namespace Foo
                {
                    public class Blue
                    {
                        void Green()
                        {
                        }

                        void Red()
                        {
                        }
                    }
                }
            ";
            MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(code));
            IDocument document = Substitute.For<IDocument>();
            document.GetStream().Returns(stream);
            IExecutionContext context = Substitute.For<IExecutionContext>();
            context.GetNewDocument(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<IEnumerable<KeyValuePair<string, object>>>())
                .Returns(x => new TestDocument((IEnumerable<KeyValuePair<string, object>>)x[2]));
            IModule module = new AnalyzeCSharp().WhereSymbol(x => x.Name != "Green");

            // When
            List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

            // Then
            CollectionAssert.AreEquivalent(new[] { string.Empty, "Foo", "Blue", "Red" }, results.Select(x => x["Name"]));
            CollectionAssert.AreEquivalent(new[] { "Red" },
                GetResult(results, "Blue").Get<IReadOnlyList<IDocument>>("Members").Where(x => x.Get<bool>("IsResult")).Select(x => x["Name"]));
            CollectionAssert.AreEquivalent(new[] { "Red", "Green" },
                GetResult(results, "Blue").Get<IReadOnlyList<IDocument>>("Members").Select(x => x["Name"]));
            stream.Dispose();
        }
            public void NamespacesContainTypes()
            {
                // Given
                const string      code     = @"
                    namespace Foo
                    {
                        class Red
                        {
                        }
                    }

                    namespace Foo.Bar
                    {
                        class Blue
                        {
                        }

                        class Green
                        {
                        }
                    }
                ";
                IDocument         document = GetDocument(code);
                IExecutionContext context  = GetContext();
                IModule           module   = new AnalyzeCSharp();

                // When
                List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                CollectionAssert.AreEquivalent(
                    new[] { "Red" },
                    results.Single(x => x["Name"].Equals("Foo")).Get <IEnumerable <IDocument> >("MemberTypes").Select(x => x["Name"]));
                CollectionAssert.AreEquivalent(
                    new[] { "Blue", "Green" },
                    results.Single(x => x["Name"].Equals("Bar")).Get <IEnumerable <IDocument> >("MemberTypes").Select(x => x["Name"]));
            }
Esempio n. 38
0
            public void SummaryWithCElementAndInlineAndDeclaredCssClasses()
            {
                // Given
                string            code     = @"
                    namespace Foo
                    {
                        /// <summary>
                        /// This is <c class=""code"">some code</c> in a summary.
                        /// </summary>
                        class Green
                        {
                        }
                    }
                ";
                IDocument         document = GetDocument(code);
                IExecutionContext context  = GetContext();
                IModule           module   = new AnalyzeCSharp().WithCssClasses("code", "more-code");

                // When
                List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                Assert.AreEqual("\n    This is <code class=\"code more-code\">some code</code> in a summary.\n    ", GetResult(results, "Green")["Summary"]);
            }
Esempio n. 39
0
            public void ImplicitMemberAccessibility()
            {
                // Given
                const string      code     = @"
                    namespace Foo
                    {
                        class Green
                        {
                            void Blue()
                            {
                            }
                        }
                    }
                ";
                IDocument         document = GetDocument(code);
                IExecutionContext context  = GetContext();
                IModule           module   = new AnalyzeCSharp();

                // When
                List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                GetMember(results, "Green", "Blue")["Syntax"].ShouldBe("private void Blue()");
            }
Esempio n. 40
0
            public void ContainingTypeIsCorrect()
            {
                // Given
                string            code     = @"
                    namespace Foo
                    {
                        public class Blue
                        {
                            void Green()
                            {
                            }
                        }
                    }
                ";
                IDocument         document = GetDocument(code);
                IExecutionContext context  = GetContext();
                IModule           module   = new AnalyzeCSharp();

                // When
                List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                Assert.AreEqual("Blue", GetMember(results, "Blue", "Green").Get <IDocument>("ContainingType")["Name"]);
            }
Esempio n. 41
0
            public void ReturnsAllTypes()
            {
                // Given
                string code = @"
                    namespace Foo
                    {
                        public class Blue
                        {
                        }

                        class Green
                        {
                            class Red
                            {
                            }
                        }

                        internal struct Yellow
                        {
                        }

                        enum Orange
                        {
                        }
                    }
                ";
                IDocument document = GetDocument(code);
                IExecutionContext context = GetContext();
                IModule module = new AnalyzeCSharp();

                // When
                List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                CollectionAssert.AreEquivalent(new[] { string.Empty, "Foo", "Blue", "Green", "Red", "Yellow", "Orange" }, results.Select(x => x["Name"]));
            }
Esempio n. 42
0
            public void SummaryWithMultipleCElements()
            {
                // Given
                string            code     = @"
                    namespace Foo
                    {
                        /// <summary>
                        /// This is <c>some code</c> in <c>a</c> summary.
                        /// </summary>
                        class Green
                        {
                        }
                    }
                ";
                IDocument         document = GetDocument(code);
                IExecutionContext context  = GetContext();
                IModule           module   = new AnalyzeCSharp();

                // When
                List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                Assert.AreEqual("\n    This is <code>some code</code> in <code>a</code> summary.\n    ", GetResult(results, "Green")["Summary"]);
            }
Esempio n. 43
0
            public void NoDocsForImplicitSymbols()
            {
                // Given
                string            code     = @"
                    namespace Foo
                    {
                        class Green
                        {
                            /// <summary>This is a summary.</summary>
                            Green() {}
                        }
                    }
                ";
                IDocument         document = GetDocument(code);
                IExecutionContext context  = GetContext();
                IModule           module   = new AnalyzeCSharp()
                                             .WhereSymbol(x => x is INamedTypeSymbol);

                // When
                List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                Assert.IsFalse(GetResult(results, "Green").Get <IReadOnlyList <IDocument> >("Constructors")[0].ContainsKey("Summary"));
            }
Esempio n. 44
0
            public void MethodAttributes()
            {
                // Given
                string       code     = @"
                    namespace Foo
                    {
                        class Green
                        {
                            [  Foo]
                            [Bar  ]
                            int Blue()
                            {
                            }
                        }
                    }
                ";
                MemoryStream stream   = new MemoryStream(Encoding.UTF8.GetBytes(code));
                IDocument    document = Substitute.For <IDocument>();

                document.GetStream().Returns(stream);
                IExecutionContext context = Substitute.For <IExecutionContext>();

                context.InputFolder.Returns(TestContext.CurrentContext.TestDirectory);
                context.GetDocument(Arg.Any <string>(), Arg.Any <string>(), Arg.Any <IEnumerable <KeyValuePair <string, object> > >())
                .Returns(x => new TestDocument((IEnumerable <MetadataItem>)x[2]));
                IModule module = new AnalyzeCSharp();

                // When
                List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                Assert.AreEqual(@"[Foo]
[Bar]
private int Blue()", GetMember(results, "Green", "Blue")["Syntax"]);
                stream.Dispose();
            }
Esempio n. 45
0
            public void OtherCommentsWithAttributes()
            {
                // Given
                string            code     = @"
                    namespace Foo
                    {
                        /// <bar a='x'>Circle</bar>
                        /// <bar a='y' b='z'>Square</bar>
                        class Green
                        {
                        }

                        class Red
                        {
                        }
                    }
                ";
                IDocument         document = GetDocument(code);
                IExecutionContext context  = GetContext();
                IModule           module   = new AnalyzeCSharp();

                // When
                List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                Assert.AreEqual(1,
                                GetResult(results, "Green").List <OtherComment>("BarComments")[0].Attributes.Count);
                Assert.AreEqual("x",
                                GetResult(results, "Green").List <OtherComment>("BarComments")[0].Attributes["a"]);
                Assert.AreEqual(2,
                                GetResult(results, "Green").List <OtherComment>("BarComments")[1].Attributes.Count);
                Assert.AreEqual("y",
                                GetResult(results, "Green").List <OtherComment>("BarComments")[1].Attributes["a"]);
                Assert.AreEqual("z",
                                GetResult(results, "Green").List <OtherComment>("BarComments")[1].Attributes["b"]);
            }
Esempio n. 46
0
            public void ContainingTypeIsCorrect()
            {
                // Given
                string code = @"
                    namespace Foo
                    {
                        public class Blue
                        {
                            void Green()
                            {
                            }
                        }
                    }
                ";
                IDocument document = GetDocument(code);
                IExecutionContext context = GetContext();
                IModule module = new AnalyzeCSharp();

                // When
                List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                Assert.AreEqual("Blue", GetMember(results, "Blue", "Green").Get<IDocument>("ContainingType")["Name"]);
            }
            public void ExplicitMemberAccessibility()
            {
                // Given
                string            code     = @"
                    namespace Foo
                    {
                        class Green
                        {
                            internal void Blue()
                            {
                            }
                        }
                    }
                ";
                IDocument         document = GetDocument(code);
                IExecutionContext context  = GetContext();
                IModule           module   = new AnalyzeCSharp();

                // When
                List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                Assert.AreEqual(@"internal void Blue()", GetMember(results, "Green", "Blue")["Syntax"]);
            }
Esempio n. 48
0
            public void ReturnsAllTypes()
            {
                // Given
                string            code     = @"
                    namespace Foo
                    {
                        public class Blue
                        {
                        }

                        class Green
                        {
                            class Red
                            {
                            }
                        }

                        internal struct Yellow
                        {
                        }

                        enum Orange
                        {
                        }
                    }
                ";
                IDocument         document = GetDocument(code);
                IExecutionContext context  = GetContext();
                IModule           module   = new AnalyzeCSharp();

                // When
                List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                CollectionAssert.AreEquivalent(new[] { string.Empty, "Foo", "Blue", "Green", "Red", "Yellow", "Orange" }, results.Select(x => x["Name"]));
            }
Esempio n. 49
0
            public void TypesExcludedByPredicate()
            {
                // Given
                string            code     = @"
                    namespace Foo
                    {
                        public class Blue
                        {
                        }

                        class Green
                        {
                            class Red
                            {
                            }
                        }

                        internal struct Yellow
                        {
                        }

                        enum Orange
                        {
                        }
                    }
                ";
                IDocument         document = GetDocument(code);
                IExecutionContext context  = GetContext();
                IModule           module   = new AnalyzeCSharp().WhereSymbol(x => x is INamedTypeSymbol && ((INamedTypeSymbol)x).TypeKind == TypeKind.Class);

                // When
                List <IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

                // Then
                CollectionAssert.AreEquivalent(new[] { "Blue", "Green", "Red" }, results.Select(x => x["Name"]));
            }
        public void SummaryWithCElementAndInlineAndDeclaredCssClasses()
        {
            // Given
            string code = @"
                namespace Foo
                {
                    /// <summary>
                    /// This is <c class=""code"">some code</c> in a summary.
                    /// </summary>
                    class Green
                    {
                    }
                }
            ";
            MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(code));
            IDocument document = Substitute.For<IDocument>();
            document.GetStream().Returns(stream);
            IExecutionContext context = Substitute.For<IExecutionContext>();
            context.InputFolder.Returns(Environment.CurrentDirectory);
            context.GetNewDocument(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<IEnumerable<MetadataItem>>())
                .Returns(x => new TestDocument((IEnumerable<MetadataItem>)x[2]));
            IModule module = new AnalyzeCSharp().WithCssClasses("code", "more-code");

            // When
            List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

            // Then
            Assert.AreEqual("\n    This is <code class=\"code more-code\">some code</code> in a summary.\n    ", GetResult(results, "Green")["Summary"]);
            stream.Dispose();
        }
        public void OtherCommentsWithAttributes()
        {
            // Given
            string code = @"
                namespace Foo
                {
                    /// <bar a='x'>Circle</bar>
                    /// <bar a='y' b='z'>Square</bar>
                    class Green
                    {
                    }

                    class Red
                    {
                    }
                }
            ";
            MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(code));
            IDocument document = Substitute.For<IDocument>();
            document.GetStream().Returns(stream);
            IExecutionContext context = Substitute.For<IExecutionContext>();
            context.InputFolder.Returns(Environment.CurrentDirectory);
            context.GetNewDocument(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<IEnumerable<MetadataItem>>())
                .Returns(x => new TestDocument((IEnumerable<MetadataItem>)x[2]));
            IModule module = new AnalyzeCSharp();

            // When
            List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

            // Then
            Assert.AreEqual(1,
                GetResult(results, "Green").List<OtherComment>("BarComments")[0].Attributes.Count);
            Assert.AreEqual("x",
                GetResult(results, "Green").List<OtherComment>("BarComments")[0].Attributes["a"]);
            Assert.AreEqual(2,
                GetResult(results, "Green").List<OtherComment>("BarComments")[1].Attributes.Count);
            Assert.AreEqual("y",
                GetResult(results, "Green").List<OtherComment>("BarComments")[1].Attributes["a"]);
            Assert.AreEqual("z",
                GetResult(results, "Green").List<OtherComment>("BarComments")[1].Attributes["b"]);
            stream.Dispose();
        }
        public void WithDocsForImplicitSymbols()
        {
            // Given
            string code = @"
                namespace Foo
                {
                    class Green
                    {
                        /// <summary>This is a summary.</summary>
                        Green() {}
                    }
                }
            ";
            MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(code));
            IDocument document = Substitute.For<IDocument>();
            document.GetStream().Returns(stream);
            IExecutionContext context = Substitute.For<IExecutionContext>();
            context.InputFolder.Returns(Environment.CurrentDirectory);
            context.GetNewDocument(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<IEnumerable<MetadataItem>>())
                .Returns(x => new TestDocument((IEnumerable<MetadataItem>)x[2]));
            IModule module = new AnalyzeCSharp()
                .WhereSymbol(x => x is INamedTypeSymbol)
                .WithDocsForImplicitSymbols();

            // When
            List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

            // Then
            Assert.AreEqual("This is a summary.", GetResult(results, "Green").Get<IReadOnlyList<IDocument>>("Constructors")[0]["Summary"]);
            stream.Dispose();
        }
        public void WritePathIsCorrect()
        {
            // Given
            string code = @"
                namespace Foo
                {
                    namespace Bar
                    {
                    }
                }
            ";
            MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(code));
            IDocument document = Substitute.For<IDocument>();
            document.GetStream().Returns(stream);
            IExecutionContext context = Substitute.For<IExecutionContext>();
            context.GetNewDocument(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<IEnumerable<KeyValuePair<string, object>>>())
                .Returns(x => new TestDocument((IEnumerable<KeyValuePair<string, object>>)x[2]));
            IModule module = new AnalyzeCSharp();

            // When
            List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

            // Then
            CollectionAssert.AreEquivalent(new[] { "global\\index.html", "Foo\\index.html", "Foo.Bar\\index.html" },
                results.Where(x => x["Kind"].Equals("Namespace")).Select(x => x["WritePath"]));
            stream.Dispose();
        }
        public void NestedNamespacesReferenceParents()
        {
            // Given
            string code = @"
                namespace Foo
                {
                }

                namespace Foo.Bar
                {
                }
            ";
            MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(code));
            IDocument document = Substitute.For<IDocument>();
            document.GetStream().Returns(stream);
            IExecutionContext context = Substitute.For<IExecutionContext>();
            context.GetNewDocument(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<IEnumerable<KeyValuePair<string, object>>>())
                .Returns(x => new TestDocument((IEnumerable<KeyValuePair<string, object>>)x[2]));
            IModule module = new AnalyzeCSharp();

            // When
            List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

            // Then
            Assert.AreEqual("Foo", results.Single(x => x["Name"].Equals("Bar")).Get<IDocument>("ContainingNamespace")["Name"]);
            Assert.AreEqual(string.Empty, results.Single(x => x["Name"].Equals("Foo")).Get<IDocument>("ContainingNamespace")["Name"]);
            stream.Dispose();
        }
        public void NamespacesDoNotContainNestedTypes()
        {
            // Given
            string code = @"
                namespace Foo
                {
                    class Blue
                    {
                        class Green
                        {
                        }
                    }
                }
            ";
            MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(code));
            IDocument document = Substitute.For<IDocument>();
            document.GetStream().Returns(stream);
            IExecutionContext context = Substitute.For<IExecutionContext>();
            context.GetNewDocument(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<IEnumerable<KeyValuePair<string, object>>>())
                .Returns(x => new TestDocument((IEnumerable<KeyValuePair<string, object>>)x[2]));
            IModule module = new AnalyzeCSharp();

            // When
            List<IDocument> results = module.Execute(new[] { document },context).ToList();  // Make sure to materialize the result list

            // Then
            CollectionAssert.AreEquivalent(new[] { "Blue" },
                results.Single(x => x["Name"].Equals("Foo")).Get<IEnumerable<IDocument>>("MemberTypes").Select(x => x["Name"]));
            stream.Dispose();
        }
        public void MultipleExceptionElements()
        {
            // Given
            string code = @"
                namespace Foo
                {
                    class Green
                    {
                        /// <exception cref=""FooException"">Throws when null</exception>
                        /// <exception cref=""BarException"">Throws for another reason</exception>
                        void Go()
                        {
                        }
                    }

                    class FooException : Exception
                    {
                    }
                }
            ";
            MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(code));
            IDocument document = Substitute.For<IDocument>();
            document.GetStream().Returns(stream);
            IExecutionContext context = Substitute.For<IExecutionContext>();
            context.InputFolder.Returns(Environment.CurrentDirectory);
            context.GetNewDocument(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<IEnumerable<MetadataItem>>())
                .Returns(x => new TestDocument((IEnumerable<MetadataItem>)x[2]));
            IModule module = new AnalyzeCSharp();

            // When
            List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

            // Then
            Assert.AreEqual(2, GetMember(results, "Green", "Go").List<ReferenceComment>("Exceptions").Count);
            Assert.AreEqual("<a href=\"/Foo/6412642C\">FooException</a>",
                GetMember(results, "Green", "Go").List<ReferenceComment>("Exceptions")[0].Link);
            Assert.AreEqual("FooException",
                GetMember(results, "Green", "Go").List<ReferenceComment>("Exceptions")[0].Name);
            Assert.AreEqual("Throws when null",
                GetMember(results, "Green", "Go").List<ReferenceComment>("Exceptions")[0].Html);
            Assert.AreEqual("BarException",
                GetMember(results, "Green", "Go").List<ReferenceComment>("Exceptions")[1].Link);
            Assert.AreEqual("BarException",
                GetMember(results, "Green", "Go").List<ReferenceComment>("Exceptions")[1].Name);
            Assert.AreEqual("Throws for another reason",
                GetMember(results, "Green", "Go").List<ReferenceComment>("Exceptions")[1].Html);
            stream.Dispose();
        }
        public void SummaryWithTableListElement()
        {
            // Given
            string code = @"
                namespace Foo
                {
                    /// <summary>
                    /// This is a summary.
                    /// <list type=""table"">
                    /// <listheader>
                    /// <term>A</term>
                    /// <term>a</term>
                    /// </listheader>
                    /// <item>
                    /// <term>X</term>
                    /// <term>x</term>
                    /// </item>
                    /// <item>
                    /// <term>Y</term>
                    /// <term>y</term>
                    /// </item>
                    /// </list>
                    /// </summary>
                    class Green
                    {
                    }
                }
            ";
            MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(code));
            IDocument document = Substitute.For<IDocument>();
            document.GetStream().Returns(stream);
            IExecutionContext context = Substitute.For<IExecutionContext>();
            context.InputFolder.Returns(Environment.CurrentDirectory);
            context.GetNewDocument(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<IEnumerable<MetadataItem>>())
                .Returns(x => new TestDocument((IEnumerable<MetadataItem>)x[2]));
            IModule module = new AnalyzeCSharp();

            // When
            List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

            // Then
            Assert.AreEqual(@"
                This is a summary.
                <table class=""table"">
                <tr>
                <th>A</th>
                <th>a</th>
                </tr>
                <tr>
                <td>X</td>
                <td>x</td>
                </tr>
                <tr>
                <td>Y</td>
                <td>y</td>
                </tr>
                </table>
                ".Replace("\r\n", "\n").Replace("                ", "    "), GetResult(results, "Green")["Summary"]);
            stream.Dispose();
        }
        public void SummaryWithParaElementsAndNestedCElement()
        {
            // Given
            string code = @"
                namespace Foo
                {
                    /// <summary>
                    /// <para>ABC</para>
                    /// <para>X<c>Y</c>Z</para>
                    /// </summary>
                    class Green
                    {
                    }
                }
            ";
            MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(code));
            IDocument document = Substitute.For<IDocument>();
            document.GetStream().Returns(stream);
            IExecutionContext context = Substitute.For<IExecutionContext>();
            context.InputFolder.Returns(Environment.CurrentDirectory);
            context.GetNewDocument(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<IEnumerable<MetadataItem>>())
                .Returns(x => new TestDocument((IEnumerable<MetadataItem>)x[2]));
            IModule module = new AnalyzeCSharp();

            // When
            List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

            // Then
            Assert.AreEqual("\n    <p>ABC</p>\n    <p>X<code>Y</code>Z</p>\n    ", GetResult(results, "Green")["Summary"]);
            stream.Dispose();
        }
        public void SummaryWithSeeElementToMethod()
        {
            // Given
            string code = @"
                namespace Foo
                {
                    /// <summary>Check <see cref=""Red.Blue""/> method</summary>
                    class Green
                    {
                    }

                    class Red
                    {
                        void Blue()
                        {
                        }
                    }
                }
            ";
            MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(code));
            IDocument document = Substitute.For<IDocument>();
            document.GetStream().Returns(stream);
            IExecutionContext context = Substitute.For<IExecutionContext>();
            context.InputFolder.Returns(Environment.CurrentDirectory);
            context.GetNewDocument(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<IEnumerable<MetadataItem>>())
                .Returns(x => new TestDocument((IEnumerable<MetadataItem>)x[2]));
            IModule module = new AnalyzeCSharp();

            // When
            List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

            // Then
            Assert.AreEqual("Check <a href=\"/Foo/414E2165/00F22A50.html\">Blue()</a> method", GetResult(results, "Green")["Summary"]);
            stream.Dispose();
        }
        public void RootSeealsoElement()
        {
            // Given
            string code = @"
                namespace Foo
                {
                    /// <seealso cref=""Red""/>
                    class Green
                    {
                    }

                    class Red
                    {
                    }
                }
            ";
            MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(code));
            IDocument document = Substitute.For<IDocument>();
            document.GetStream().Returns(stream);
            IExecutionContext context = Substitute.For<IExecutionContext>();
            context.InputFolder.Returns(Environment.CurrentDirectory);
            context.GetNewDocument(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<IEnumerable<MetadataItem>>())
                .Returns(x => new TestDocument((IEnumerable<MetadataItem>)x[2]));
            IModule module = new AnalyzeCSharp();

            // When
            List<IDocument> results = module.Execute(new[] { document }, context).ToList();  // Make sure to materialize the result list

            // Then
            Assert.AreEqual("<a href=\"/Foo/414E2165\">Red</a>", GetResult(results, "Green").Get<IReadOnlyList<string>>("SeeAlso")[0]);
            stream.Dispose();
        }