docs: document default values for Filters properties in XML docs
Continues the work started for #5917 (already covered Targets, Layouts, LayoutRenderers and Target Wrappers), extending the same pattern to the NLog.Filters namespace so default values show up in IntelliSense and the generated API docs. Adds a regression test that scans all settable NLog.Filters properties against the generated XML documentation file and fails if any of them is missing a documented default value.
This commit is contained in:
1 parent
2154098b97
commit
44df43fabd
9 files changed
+114
No files matched your search
@@ -0,0 +1,95 @@
|
||||
//
|
||||
// Copyright (c) 2004-2024 Jaroslaw Kowalski <jaak@jkowalski.net>, Kim Christensen, Julian Verdurmen
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * Neither the name of Jaroslaw Kowalski nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from this
|
||||
// software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
// THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
namespace NLog.UnitTests.Filters
|
||||
{
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Xml.Linq;
|
||||
using Xunit;
|
||||
|
||||
/// <summary>
|
||||
/// Verifies that every settable property under the <see cref="NLog.Filters"/> namespace
|
||||
/// documents its default value in the generated XML docs, so it shows up in IntelliSense
|
||||
/// and the Sandcastle API docs. See https://github.com/NLog/NLog/issues/5917
|
||||
/// </summary>
|
||||
public class FilterDefaultValueDocsTests : NLogTestBase
|
||||
{
|
||||
// Properties that intentionally do not document a default value.
|
||||
private static readonly HashSet<string> ExcludedMembers = new HashSet<string>
|
||||
{
|
||||
// Obsolete since NLog 5.0, always returns true, no meaningful default to document.
|
||||
"P:NLog.Filters.WhenRepeatedFilter.OptimizeBufferReuse",
|
||||
};
|
||||
|
||||
[Fact]
|
||||
public void SettablePropertiesDocumentDefaultValue()
|
||||
{
|
||||
var nlogAssembly = typeof(LogManager).Assembly;
|
||||
var xmlDocPath = Path.ChangeExtension(nlogAssembly.Location, ".xml");
|
||||
Assert.True(File.Exists(xmlDocPath), $"Generated XML doc file not found at '{xmlDocPath}'. Build NLog.csproj with GenerateDocumentationFile enabled.");
|
||||
|
||||
var documentedMembers = XDocument.Load(xmlDocPath)
|
||||
.Descendants("member")
|
||||
.ToDictionary(member => (string)member.Attribute("name"), member => member.ToString());
|
||||
|
||||
var propertiesMissingDefaultValueDocs = new List<string>();
|
||||
|
||||
foreach (var type in nlogAssembly.GetTypes())
|
||||
{
|
||||
if (type.Namespace != "NLog.Filters" || !type.IsPublic)
|
||||
continue;
|
||||
|
||||
foreach (var property in type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly))
|
||||
{
|
||||
if (!property.CanWrite || property.GetCustomAttribute<ObsoleteAttribute>() != null)
|
||||
continue;
|
||||
|
||||
var memberName = $"P:{type.FullName}.{property.Name}";
|
||||
if (ExcludedMembers.Contains(memberName))
|
||||
continue;
|
||||
|
||||
if (!documentedMembers.TryGetValue(memberName, out var memberDocs) || !memberDocs.Contains("Default:"))
|
||||
{
|
||||
propertiesMissingDefaultValueDocs.Add(memberName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Assert.Empty(propertiesMissingDefaultValueDocs);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user