docs: backfill XML documentation across 756 files
v2-ci / build (push) Failing after 1m43s
v2-ci / unit-tests (tests/Core/ZB.MOM.WW.OtOpcUa.Cluster.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.ControlPlane.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.Runtime.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.Security.Tests) (push) Has been skipped
v2-ci / integration (tests/Server/ZB.MOM.WW.OtOpcUa.Host.IntegrationTests) (push) Has been skipped
v2-ci / integration (tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests) (push) Has been skipped

Adds <summary>, <param>, <typeparam>, and <inheritdoc/> tags to public
members surfaced by commentchecker — resolves 5,847 of 5,869 issues
(99.6%) across three /fixdocs passes.
This commit is contained in:
Joseph Doherty
2026-05-28 08:10:17 -04:00
parent f9fc7dd2e1
commit 64e3fbe035
756 changed files with 9876 additions and 96 deletions
@@ -21,11 +21,18 @@ public sealed class ModbusDriverTests
public readonly ushort[] InputRegisters = new ushort[256];
public readonly bool[] Coils = new bool[256];
public readonly bool[] DiscreteInputs = new bool[256];
/// <summary>Gets or sets a value indicating whether connect operations should fail.</summary>
public bool ForceConnectFail { get; set; }
/// <summary>Initiates a connection to the Modbus server.</summary>
/// <param name="ct">Cancellation token.</param>
public Task ConnectAsync(CancellationToken ct)
=> ForceConnectFail ? Task.FromException(new InvalidOperationException("connect refused")) : Task.CompletedTask;
/// <summary>Sends a Modbus PDU and receives the response.</summary>
/// <param name="unitId">Modbus unit ID.</param>
/// <param name="pdu">Protocol data unit bytes to send.</param>
/// <param name="ct">Cancellation token.</param>
public Task<byte[]> SendAsync(byte unitId, byte[] pdu, CancellationToken ct)
{
var fc = pdu[0];
@@ -104,6 +111,7 @@ public sealed class ModbusDriverTests
return new byte[] { 0x0F, pdu[1], pdu[2], pdu[3], pdu[4] };
}
/// <summary>Disposes the transport asynchronously.</summary>
public ValueTask DisposeAsync() => ValueTask.CompletedTask;
}
@@ -115,6 +123,7 @@ public sealed class ModbusDriverTests
return (drv, fake);
}
/// <summary>Verifies that Initialize connects and populates the tag map.</summary>
[Fact]
public async Task Initialize_connects_and_populates_tag_map()
{
@@ -125,6 +134,7 @@ public sealed class ModbusDriverTests
drv.GetHealth().State.ShouldBe(DriverState.Healthy);
}
/// <summary>Verifies that reading Int16 holding registers returns big-endian values correctly.</summary>
[Fact]
public async Task Read_Int16_holding_register_returns_BigEndian_value()
{
@@ -137,6 +147,7 @@ public sealed class ModbusDriverTests
r[0].StatusCode.ShouldBe(0u);
}
/// <summary>Verifies that reading Float32 values spans two registers in big-endian format.</summary>
[Fact]
public async Task Read_Float32_spans_two_registers_BigEndian()
{
@@ -153,6 +164,7 @@ public sealed class ModbusDriverTests
r[0].Value.ShouldBe(25.5f);
}
/// <summary>Verifies that reading coils returns boolean values.</summary>
[Fact]
public async Task Read_Coil_returns_boolean()
{
@@ -164,6 +176,7 @@ public sealed class ModbusDriverTests
r[0].Value.ShouldBe(true);
}
/// <summary>Verifies that reading unknown tags returns BadNodeIdUnknown status instead of throwing.</summary>
[Fact]
public async Task Unknown_tag_returns_BadNodeIdUnknown_not_an_exception()
{
@@ -174,6 +187,7 @@ public sealed class ModbusDriverTests
r[0].StatusCode.ShouldBe(0x80340000u);
}
/// <summary>Verifies that writing UInt16 holding registers round-trips correctly.</summary>
[Fact]
public async Task Write_UInt16_holding_register_roundtrips()
{
@@ -185,6 +199,7 @@ public sealed class ModbusDriverTests
fake.HoldingRegisters[20].ShouldBe((ushort)42000);
}
/// <summary>Verifies that writing Float32 values uses function code 16 (WriteMultipleRegisters).</summary>
[Fact]
public async Task Write_Float32_uses_FC16_WriteMultipleRegisters()
{
@@ -202,6 +217,7 @@ public sealed class ModbusDriverTests
BinaryPrimitives.ReadSingleBigEndian(raw).ShouldBe(25.5f);
}
/// <summary>Verifies that writing to input registers returns BadNotWritable status.</summary>
[Fact]
public async Task Write_to_InputRegister_returns_BadNotWritable()
{
@@ -212,6 +228,7 @@ public sealed class ModbusDriverTests
r[0].StatusCode.ShouldBe(0x803B0000u);
}
/// <summary>Verifies that Discover streams one folder per driver with a variable per tag.</summary>
[Fact]
public async Task Discover_streams_one_folder_per_driver_with_a_variable_per_tag()
{
@@ -232,6 +249,7 @@ public sealed class ModbusDriverTests
builder.Variables.ShouldContain(v => v.BrowseName == "Run" && v.Info.DriverDataType == DriverDataType.Boolean);
}
/// <summary>Verifies that Discover propagates WriteIdempotent from tag to attribute info.</summary>
[Fact]
public async Task Discover_propagates_WriteIdempotent_from_tag_to_attribute_info()
{
@@ -251,22 +269,50 @@ public sealed class ModbusDriverTests
// --- helpers ---
/// <summary>Records discovered address space structure for testing.</summary>
private sealed class RecordingBuilder : IAddressSpaceBuilder
{
/// <summary>Gets the list of discovered folders.</summary>
public List<(string BrowseName, string DisplayName)> Folders { get; } = new();
/// <summary>Gets the list of discovered variables.</summary>
public List<(string BrowseName, DriverAttributeInfo Info)> Variables { get; } = new();
/// <summary>Records a folder in the address space.</summary>
/// <param name="browseName">Folder browse name.</param>
/// <param name="displayName">Folder display name.</param>
public IAddressSpaceBuilder Folder(string browseName, string displayName)
{ Folders.Add((browseName, displayName)); return this; }
/// <summary>Records a variable in the address space.</summary>
/// <param name="browseName">Variable browse name.</param>
/// <param name="displayName">Variable display name.</param>
/// <param name="info">Driver attribute information.</param>
public IVariableHandle Variable(string browseName, string displayName, DriverAttributeInfo info)
{ Variables.Add((browseName, info)); return new Handle(info.FullName); }
/// <summary>Adds a property (no-op for recording).</summary>
/// <param name="_">Property name (unused).</param>
/// <param name="__">Property data type (unused).</param>
/// <param name="___">Property value (unused).</param>
public void AddProperty(string _, DriverDataType __, object? ___) { }
/// <summary>Handle to a discovered variable.</summary>
private sealed class Handle(string fullRef) : IVariableHandle
{
/// <summary>Gets the full reference name.</summary>
public string FullReference => fullRef;
/// <summary>Marks this variable as an alarm condition.</summary>
/// <param name="info">Alarm condition information.</param>
public IAlarmConditionSink MarkAsAlarmCondition(AlarmConditionInfo info) => new NullSink();
}
/// <summary>No-op alarm condition sink for testing.</summary>
private sealed class NullSink : IAlarmConditionSink
{
/// <summary>Handles alarm transitions (no-op).</summary>
/// <param name="args">Alarm event arguments.</param>
public void OnTransition(AlarmEventArgs args) { }
}
}