コード例 #1
0
        public void When_method_is_inherited_from_generic_class_then_xml_docs_are_correct()
        {
            //// Arrange
            XmlDocs.ClearCache();

            //// Act
            var singleSummary = typeof(InheritedGenericClass2).GetMethod(nameof(InheritedGenericClass2.Single)).GetXmlDocsSummary();
            var multiSummary  = typeof(InheritedGenericClass2).GetMethod(nameof(InheritedGenericClass2.Multi)).GetXmlDocsSummary();
            var multiGenericParameterSummary       = typeof(InheritedGenericClass2).GetMethod(nameof(InheritedGenericClass2.MultiGenericParameter)).GetXmlDocsSummary();
            var nestedGenericParameterSummary      = typeof(InheritedGenericClass2).GetMethod(nameof(InheritedGenericClass2.NestedGenericParameter)).GetXmlDocsSummary();
            var singleAsyncSummary                 = typeof(InheritedGenericClass2).GetMethod(nameof(InheritedGenericClass2.SingleAsync)).GetXmlDocsSummary();
            var multiAsyncSummary                  = typeof(InheritedGenericClass2).GetMethod(nameof(InheritedGenericClass2.MultiAsync)).GetXmlDocsSummary();
            var multiGenericParameterAsyncSummary  = typeof(InheritedGenericClass2).GetMethod(nameof(InheritedGenericClass2.MultiGenericParameterAsync)).GetXmlDocsSummary();
            var nestedGenericParameterAsyncSummary = typeof(InheritedGenericClass2).GetMethod(nameof(InheritedGenericClass2.NestedGenericParameterAsync)).GetXmlDocsSummary();

            //// Assert
            Assert.Equal("Single", singleSummary);
            Assert.Equal("Multi", multiSummary);
            Assert.Equal("MultiGenericParameter", multiGenericParameterSummary);
            Assert.Equal("NestedGenericParameter", nestedGenericParameterSummary);
            Assert.Equal("SingleAsync", singleAsyncSummary);
            Assert.Equal("MultiAsync", multiAsyncSummary);
            Assert.Equal("MultiGenericParameterAsync", multiGenericParameterAsyncSummary);
            Assert.Equal("NestedGenericParameterAsync", nestedGenericParameterAsyncSummary);
        }
コード例 #2
0
ファイル: XmlTagProcessor.cs プロジェクト: seamys/squidex
        public void Process(DocumentProcessorContext context)
        {
            try
            {
                foreach (var controllerType in context.ControllerTypes)
                {
                    var attribute = controllerType.GetCustomAttribute <ApiExplorerSettingsAttribute>();

                    if (attribute != null)
                    {
                        var tag = context.Document.Tags.FirstOrDefault(x => x.Name == attribute.GroupName);

                        if (tag != null)
                        {
                            var description = controllerType.GetXmlDocsSummary();

                            if (description != null)
                            {
                                tag.Description ??= string.Empty;

                                if (!tag.Description.Contains(description))
                                {
                                    tag.Description += "\n\n" + description;
                                }
                            }
                        }
                    }
                }
            }
            finally
            {
                XmlDocs.ClearCache();
            }
        }
コード例 #3
0
        public void When_xml_doc_is_in_working_dir_then_it_is_found()
        {
            //// Arrange
            XmlDocs.ClearCache();

            _ = Directory.CreateDirectory("./wd");
            File.WriteAllText("./wd/System.Drawing.Primitives.xml", @"<?xml version=""1.0""?>
                <doc>
                    <assembly><name>System.Drawing.Primitives</name></assembly>
                    <members>
                        <member name=""T:System.Drawing.Point"">
                            <summary>A point.</summary>
                        </member>
                    </members>
                </doc>");
            Directory.SetCurrentDirectory("./wd");

            //// Act
            var summary = typeof(Point).GetXmlDocsSummary();

            //// Clean up
            Directory.SetCurrentDirectory("..");
            Directory.Delete("./wd", recursive: true);

            //// Assert
            Assert.Equal("A point.", summary);
        }
コード例 #4
0
ファイル: XmlDocGenerator.cs プロジェクト: asitti/qswag
        internal static XmlDocs GetXmlDocs(string xmlDocPath)
        {
            var collect = new XmlDocs();

            if (string.IsNullOrEmpty(xmlDocPath) || !File.Exists(xmlDocPath))
            {
                return(collect);
            }
            using (var fileStream = File.Open(xmlDocPath, FileMode.Open, FileAccess.Read))
            {
                using (var reader = XmlReader.Create(fileStream))
                {
                    while (!reader.EOF)
                    {
                        reader.Read();
                        if (reader.Name != "member" || !reader.IsStartElement())
                        {
                            continue;
                        }
                        var doc = GetDoc(reader);
                        collect.Add(doc.Name, doc);
                    }
                }
            }

            return(collect);
        }
コード例 #5
0
        public void When_xml_docs_is_read_for_cecil_type_then_it_works()
        {
            // Arranage
            var assemblyPath = typeof(XmlDocsExtensionsTests).Assembly.CodeBase.Replace("file:///", string.Empty);
            var xmlPath      = assemblyPath.Replace(".dll", ".xml");

            var assembly = AssemblyDefinition.ReadAssembly(assemblyPath);
            var module   = assembly.Modules.Last();
            var type     = module.GetTypes().Single(t => t.Name.Contains(nameof(MyTest)));
            var method   = type.Methods.First(m => m.Name == nameof(MyTest.MyMethod));
            var document = XmlDocs.LoadDocument(xmlPath);

            // Act
            var typeSummary        = type.GetXmlDocsTag("summary", document);
            var constructorSummary = type.Methods.First(m => m.IsConstructor).GetXmlDocsTag("summary", document);
            var property           = type.Properties.First().GetXmlDocsSummary(document);
            var methodSummary      = method.GetXmlDocsTag("summary", document);
            var parameter          = method.Parameters.Last().GetXmlDocs(document);
            var returnParameter    = method.MethodReturnType.GetXmlDocs(document);

            // Assert
            Assert.Equal("My class.", typeSummary);
            Assert.Equal("My constructor.", constructorSummary);
            Assert.Equal("My property.", property);
            Assert.Equal("My method.", methodSummary);
            Assert.Equal("My param.", parameter);
            Assert.Equal("My return.", returnParameter);
        }
コード例 #6
0
        /// <summary>Generates or gets the cached Swagger specification.</summary>
        /// <param name="context">The context.</param>
        /// <returns>The Swagger specification.</returns>
        protected virtual async Task <string> GetDocumentAsync(HttpContext context)
        {
            var documentKey = _settings.CreateDocumentCacheKey?.Invoke(context.Request) ?? string.Empty;

            Tuple <string, ExceptionDispatchInfo, DateTimeOffset> document;

            lock (_documentsCacheLock)
            {
                _documentsCache.TryGetValue(documentKey, out document);
            }

            if (document?.Item2 != null &&
                document.Item3 + _settings.ExceptionCacheTime > DateTimeOffset.UtcNow)
            {
                document.Item2.Throw();
            }

            var apiDescriptionGroups = _apiDescriptionGroupCollectionProvider.ApiDescriptionGroups;

            if (apiDescriptionGroups.Version == Volatile.Read(ref _version) &&
                document?.Item1 != null)
            {
                return(document.Item1);
            }

            try
            {
                var openApiDocument = await GenerateDocumentAsync(context);

                var data = _path.ToLowerInvariant().Contains(".yaml") ?
                           OpenApiYamlDocument.ToYaml(openApiDocument) :
                           openApiDocument.ToJson();

                XmlDocs.ClearCache();
                CachedType.ClearCache();

                _version = apiDescriptionGroups.Version;

                lock (_documentsCacheLock)
                {
                    _documentsCache[documentKey] = new Tuple <string, ExceptionDispatchInfo, DateTimeOffset>(
                        data, null, DateTimeOffset.UtcNow);
                }

                return(data);
            }
            catch (Exception exception)
            {
                lock (_documentsCacheLock)
                {
                    _documentsCache[documentKey] = new Tuple <string, ExceptionDispatchInfo, DateTimeOffset>(
                        null, ExceptionDispatchInfo.Capture(exception), DateTimeOffset.UtcNow);
                }

                throw;
            }
        }
コード例 #7
0
        public void When_summary_has_generic_tags_then_it_is_converted()
        {
            //// Arrange
            XmlDocs.ClearCache();

            //// Act
            var summary = typeof(WithGenericTagsInXmlDoc).GetProperty("Foo").GetXmlDocsSummary();

            //// Assert
            Assert.Equal("This are some tags.", summary);
        }
コード例 #8
0
        public void When_type_has_summary_then_it_is_read()
        {
            //// Arrange
            XmlDocs.ClearCache();

            //// Act
            var summary = typeof(Publisher).GetXmlDocsSummary();

            //// Assert
            Assert.False(string.IsNullOrWhiteSpace(summary));
        }
コード例 #9
0
        public void When_type_is_in_NuGet_then_xml_docs_should_be_found()
        {
            //// Arrange
            XmlDocs.ClearCache();

            //// Act
            var summary = typeof(JsonSchema).GetXmlDocsSummary();

            //// Assert
            Assert.False(string.IsNullOrWhiteSpace(summary));
        }
コード例 #10
0
        public void WhenTypeInheritsFromGenericType_ThenXmlDocsIsFound()
        {
            //// Arrange
            XmlDocs.ClearCache();

            //// Act
            var fooSummary = typeof(MyController).GetMethod(nameof(BaseController <string> .Test)).GetXmlDocsSummary();

            //// Assert
            Assert.Equal("Base method.", fooSummary);
        }
コード例 #11
0
        public void When_summary_has_paramref_tag_then_it_is_converted()
        {
            //// Arrange
            XmlDocs.ClearCache();

            //// Act
            var summary = typeof(WithParamrefTagInXmlDoc).GetMethod("Foo").GetXmlDocsSummary();

            //// Assert
            Assert.Equal("Returns name.", summary);
        }
コード例 #12
0
        public void When_property_has_inheritdoc_on_interface_then_it_is_resolved()
        {
            //// Arrange
            XmlDocs.ClearCache();

            //// Act
            var propertySummary = typeof(ClassWithInheritdocOnInterface).GetProperty("Foo").GetXmlDocsSummary();

            //// Assert
            Assert.Equal("Foo.", propertySummary);
        }
コード例 #13
0
        public void When_method_has_inheritdoc_then_on_interface_it_is_resolved()
        {
            //// Arrange
            XmlDocs.ClearCache();

            //// Act
            var methodSummary = typeof(ClassWithInheritdocOnInterface).GetMethod("Bar").GetXmlDocsSummary();

            //// Assert
            Assert.Equal("Bar.", methodSummary);
        }
コード例 #14
0
        public void When_summary_has_see_tag_then_it_is_converted()
        {
            //// Arrange
            XmlDocs.ClearCache();

            //// Act
            var summary = typeof(WithSeeTagInXmlDoc).GetProperty("Foo").GetXmlDocsSummary();

            //// Assert
            Assert.Equal("null for the default Record. See this and this at https://github.com/rsuter/njsonschema.", summary);
        }
コード例 #15
0
        public void When_type_is_in_AspNetCore_then_docs_should_be_found()
        {
            //// Arrange
            XmlDocs.ClearCache();

            //// Act
            var summary = typeof(ProblemDetails).GetXmlDocsSummary();

            //// Assert
            Assert.False(string.IsNullOrWhiteSpace(summary));
        }
コード例 #16
0
        public void When_xml_doc_is_missing_then_summary_is_missing()
        {
            //// Arrange
            XmlDocs.ClearCache();

            //// Act
            var summary  = typeof(Point).GetXmlDocsSummary();
            var summary2 = typeof(Point).GetXmlDocsSummary();

            //// Assert
            Assert.Empty(summary);
        }
コード例 #17
0
        public void When_parameter_has_inheritdoc_on_interface_then_it_is_resolved()
        {
            //// Arrange
            XmlDocs.ClearCache();

            //// Act
            var parameterXml = typeof(ClassWithInheritdocOnInterface).GetMethod("Bar").GetParameters()
                               .Single(p => p.Name == "baz").GetXmlDocs();

            //// Assert
            Assert.Equal("Baz.", parameterXml);
        }
コード例 #18
0
        public void WhenTypeInheritsFromGenericType_ThenMethodAndPropertyWithGenericParametersResolvesCorrectXml()
        {
            //// Arrange
            XmlDocs.ClearCache();

            //// Act
            var summaryMethod   = typeof(InheritedGenericClass).GetMethod("SingleAsync").GetXmlDocsSummary();
            var summaryProperty = typeof(InheritedGenericClass).GetProperty("Baz").GetXmlDocsSummary();

            //// Assert
            Assert.Equal("SingleAsync", summaryMethod);
            Assert.Equal("Baz", summaryProperty);
        }
コード例 #19
0
        public void When_record_has_param_properties_then_xml_docs_is_read()
        {
            //// Arrange
            XmlDocs.ClearCache();

            //// Act
            var listItemsSummary  = typeof(ListItems).GetXmlDocsSummary();
            var pageNumberSummary = typeof(ListItems).GetRuntimeProperty("PageNumber").GetXmlDocsSummary();

            //// Assert
            Assert.Equal("Returns a list of items.", listItemsSummary);
            Assert.Equal("The page number.", pageNumberSummary);
        }
コード例 #20
0
        public void When_method_is_inherited_then_xml_docs_are_correct()
        {
            //// Arrange
            XmlDocs.ClearCache();

            //// Act
            var fooSummary = typeof(MyClass).GetMethod(nameof(MyClass.Foo)).GetXmlDocsSummary();
            var barSummary = typeof(MyClass).GetMethod(nameof(MyClass.Bar)).GetXmlDocsSummary();

            //// Assert
            Assert.Equal("Foo", fooSummary);
            Assert.Equal("Bar", barSummary);
        }
コード例 #21
0
        public void When_xml_doc_with_multiple_breaks_is_read_then_they_are_not_stripped_away()
        {
            //// Arrange
            XmlDocs.ClearCache();

            //// Act
            var summary = typeof(WithComplexXmlDoc).GetProperty("Foo").GetXmlDocsSummary();

            //// Assert
            Assert.Contains("\n\n", summary);
            Assert.Contains("    * Users", summary);
            Assert.Equal(summary.Trim(), summary);
        }
コード例 #22
0
        public void When_inheritdocs_is_availble_in_inheritance_chain_then_it_is_resolved()
        {
            //// Arrange
            XmlDocs.ClearCache();

            //// Act
            var searchStringProperty            = typeof(BusinessProcessSearchResult).GetRuntimeProperty("SearchString").GetXmlDocsSummary();
            var isSearchStringRewrittenProperty = typeof(BusinessProcessSearchResult).GetRuntimeProperty("IsSearchStringRewritten").GetXmlDocsSummary();
            var pageTokenProperty = typeof(BusinessProcessSearchResult).GetRuntimeProperty("PageToken").GetXmlDocsSummary();

            //// Assert
            Assert.True(!string.IsNullOrWhiteSpace(searchStringProperty));
            Assert.True(!string.IsNullOrWhiteSpace(isSearchStringRewrittenProperty));
            Assert.True(!string.IsNullOrWhiteSpace(pageTokenProperty));
        }
コード例 #23
0
        /// <summary>
        /// Load an XML document.
        /// </summary>
        /// <param name="filename">The filename of the document to load.</param>
        /// <returns>The loaded document.</returns>
        public static XmlDocument GetXml(string filename)
        {
            ValidateFilename(filename);

            if (XmlDocs.ContainsKey(filename))
            {
                return(XmlDocs[filename]);
            }

            var xml = new XmlDocument();

            xml.Load(filename);
            XmlDocs.Add(filename, xml);
            return(xml);
        }
コード例 #24
0
        public void ReadXmlDocs()
        {
            //// Arrange
            XmlDocs.ClearCache();

            //// Act
            var singleSummary = typeof(InheritedGenericClass2).GetMethod(nameof(InheritedGenericClass2.Single)).GetXmlDocsSummary();
            var multiSummary = typeof(InheritedGenericClass2).GetMethod(nameof(InheritedGenericClass2.Multi)).GetXmlDocsSummary();
            var multiGenericParameterSummary = typeof(InheritedGenericClass2).GetMethod(nameof(InheritedGenericClass2.MultiGenericParameter)).GetXmlDocsSummary();
            var nestedGenericParameterSummary = typeof(InheritedGenericClass2).GetMethod(nameof(InheritedGenericClass2.NestedGenericParameter)).GetXmlDocsSummary();
            var singleAsyncSummary = typeof(InheritedGenericClass2).GetMethod(nameof(InheritedGenericClass2.SingleAsync)).GetXmlDocsSummary();
            var multiAsyncSummary = typeof(InheritedGenericClass2).GetMethod(nameof(InheritedGenericClass2.MultiAsync)).GetXmlDocsSummary();
            var multiGenericParameterAsyncSummary = typeof(InheritedGenericClass2).GetMethod(nameof(InheritedGenericClass2.MultiGenericParameterAsync)).GetXmlDocsSummary();
            var nestedGenericParameterAsyncSummary = typeof(InheritedGenericClass2).GetMethod(nameof(InheritedGenericClass2.NestedGenericParameterAsync)).GetXmlDocsSummary();

            //// Complete
            _counter.Increment();
        }
コード例 #25
0
        public void When_xml_doc_contains_xml_then_it_is_fully_read()
        {
            //// Arrange
            XmlDocs.ClearCache();

            //// Act
            var element   = typeof(WithTagsInXmlDoc).GetProperty("Foo").GetXmlDocsElement();
            var responses = element.Elements("response");

            //// Assert
            Assert.Equal(2, responses.Count());

            Assert.Equal("Account created", responses.First().Value);
            Assert.Equal("201", responses.First().Attribute("code").Value);

            Assert.Equal("Username already in use", responses.Last().Value);
            Assert.Equal("400", responses.Last().Attribute("code").Value);
        }
コード例 #26
0
        public void WhenTypeInheritsFromGenericType_ThenMethodAndPropertyWithGenericParametersResolvesCorrectXml()
        {
            // Arranage
            var assemblyPath = typeof(XmlDocsExtensionsTests).Assembly.CodeBase.Replace("file:///", string.Empty);
            var xmlPath      = assemblyPath.Replace(".dll", ".xml");

            var assembly = AssemblyDefinition.ReadAssembly(assemblyPath);
            var module   = assembly.Modules.Last();
            var type     = module.GetTypes().Single(t => t.Name.Contains("BaseGenericClass"));
            var method   = type.Methods.First(m => m.Name == nameof(InheritedGenericClass.SingleAsync));
            var method2  = type.Methods.First(m => m.Name == nameof(InheritedGenericClass.MultiAsync));
            var document = XmlDocs.LoadDocument(xmlPath);

            //// Act
            var summaryMethod   = method.GetXmlDocsTag("summary", document);
            var summaryMethod2  = method2.GetXmlDocsTag("summary", document);
            var summaryProperty = type.Properties.First().GetXmlDocsSummary(document);

            //// Assert
            Assert.Equal("SingleAsync", summaryMethod);
            Assert.Equal("MultiAsync", summaryMethod2);
            Assert.Equal("Baz", summaryProperty);
        }