docs: complete XML doc comments via fixdocs (2757 to 131 findings)

Add missing <returns>/<param>/<summary>/<typeparam> tags and clean up
misused inheritdoc across 481 files so the documented API surface is
complete. Documentation-only (zero code lines changed). The 131 remaining
findings are inheritdoc-style warnings deliberately left to preserve
hand-written implementation rationale (plan-decision notes, race-condition
explanations).
This commit is contained in:
Joseph Doherty
2026-06-03 12:34:34 -04:00
parent c6d9b20d9f
commit bd6c0b4d3d
481 changed files with 2550 additions and 1668 deletions
@@ -18,14 +18,10 @@ public sealed class ModbusSubscriptionTests
private sealed class FakeTransport : IModbusTransport
{
public readonly ushort[] HoldingRegisters = new ushort[256];
/// <summary>Simulates connecting to the Modbus device.</summary>
/// <param name="ct">The cancellation token.</param>
/// <inheritdoc />
public Task ConnectAsync(CancellationToken ct) => Task.CompletedTask;
/// <summary>Simulates sending a Modbus PDU.</summary>
/// <param name="unitId">The Modbus unit ID.</param>
/// <param name="pdu">The protocol data unit.</param>
/// <param name="ct">The cancellation token.</param>
/// <inheritdoc />
public Task<byte[]> SendAsync(byte unitId, byte[] pdu, CancellationToken ct)
{
if (pdu[0] != 0x03) return Task.FromException<byte[]>(new NotSupportedException("FC not supported"));
@@ -41,7 +37,8 @@ public sealed class ModbusSubscriptionTests
}
return Task.FromResult(resp);
}
/// <summary>Disposes the transport asynchronously.</summary>
/// <summary>Disposes the fake transport. No-op in this test double.</summary>
/// <returns>A completed value task.</returns>
public ValueTask DisposeAsync() => ValueTask.CompletedTask;
}
@@ -53,6 +50,7 @@ public sealed class ModbusSubscriptionTests
}
/// <summary>Verifies initial poll raises OnDataChange for every subscribed tag.</summary>
/// <returns>A task that represents the asynchronous operation.</returns>
[Fact]
public async Task Initial_poll_raises_OnDataChange_for_every_subscribed_tag()
{
@@ -75,6 +73,7 @@ public sealed class ModbusSubscriptionTests
}
/// <summary>Verifies unchanged values do not raise after initial poll.</summary>
/// <returns>A task that represents the asynchronous operation.</returns>
[Fact]
public async Task Unchanged_values_do_not_raise_after_initial_poll()
{
@@ -93,6 +92,7 @@ public sealed class ModbusSubscriptionTests
}
/// <summary>Verifies value change between polls raises OnDataChange.</summary>
/// <returns>A task that represents the asynchronous operation.</returns>
[Fact]
public async Task Value_change_between_polls_raises_OnDataChange()
{
@@ -114,6 +114,7 @@ public sealed class ModbusSubscriptionTests
}
/// <summary>Verifies unsubscribe stops the polling loop.</summary>
/// <returns>A task that represents the asynchronous operation.</returns>
[Fact]
public async Task Unsubscribe_stops_the_polling_loop()
{
@@ -134,6 +135,7 @@ public sealed class ModbusSubscriptionTests
}
/// <summary>Verifies SubscribeAsync floors intervals below 100ms.</summary>
/// <returns>A task that represents the asynchronous operation.</returns>
[Fact]
public async Task SubscribeAsync_floors_intervals_below_100ms()
{
@@ -154,6 +156,7 @@ public sealed class ModbusSubscriptionTests
}
/// <summary>Verifies multiple subscriptions fire independently.</summary>
/// <returns>A task that represents the asynchronous operation.</returns>
[Fact]
public async Task Multiple_subscriptions_fire_independently()
{
@@ -196,6 +199,7 @@ public sealed class ModbusSubscriptionTests
/// value steps up by 5 every poll (well over the deadband of 2) so every poll publishes,
/// maximising contention on the cache.
/// </summary>
/// <returns>A task that represents the asynchronous operation.</returns>
[Fact]
public async Task Concurrent_deadband_subscriptions_do_not_corrupt_the_publish_cache()
{