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
@@ -28,37 +28,93 @@ public sealed class PipeRoundTripTests
private sealed class FakeHistorian : IHistorianDataSource
{
/// <summary>Gets or sets the raw samples to return from reads.</summary>
public List<HistorianSample> RawSamples { get; set; } = new();
/// <summary>Gets or sets the aggregate samples to return from reads.</summary>
public List<HistorianAggregateSample> AggregateSamples { get; set; } = new();
/// <summary>Gets or sets the at-time samples to return from reads.</summary>
public List<HistorianSample> AtTimeSamples { get; set; } = new();
/// <summary>Gets or sets the events to return from reads.</summary>
public List<BackendHistorianEventDto> Events { get; set; } = new();
/// <summary>Gets or sets an exception to throw from read operations.</summary>
public Exception? ThrowFromRead { get; set; }
/// <summary>
/// Reads raw samples from the fake historian or throws if configured.
/// </summary>
/// <param name="tagName">The tag name.</param>
/// <param name="startTime">The start time.</param>
/// <param name="endTime">The end time.</param>
/// <param name="maxValues">The maximum number of values to return.</param>
/// <param name="ct">Cancellation token.</param>
/// <returns>The raw samples.</returns>
public Task<List<HistorianSample>> ReadRawAsync(string tagName, DateTime startTime, DateTime endTime, int maxValues, CancellationToken ct = default)
{
if (ThrowFromRead is not null) throw ThrowFromRead;
return Task.FromResult(RawSamples);
}
/// <summary>
/// Reads aggregate samples from the fake historian.
/// </summary>
/// <param name="tagName">The tag name.</param>
/// <param name="startTime">The start time.</param>
/// <param name="endTime">The end time.</param>
/// <param name="intervalMs">The interval in milliseconds.</param>
/// <param name="aggregateColumn">The aggregate column name.</param>
/// <param name="ct">Cancellation token.</param>
/// <returns>The aggregate samples.</returns>
public Task<List<HistorianAggregateSample>> ReadAggregateAsync(string tagName, DateTime startTime, DateTime endTime, double intervalMs, string aggregateColumn, CancellationToken ct = default)
=> Task.FromResult(AggregateSamples);
/// <summary>
/// Reads at-time samples from the fake historian.
/// </summary>
/// <param name="tagName">The tag name.</param>
/// <param name="timestamps">The timestamps to read at.</param>
/// <param name="ct">Cancellation token.</param>
/// <returns>The at-time samples.</returns>
public Task<List<HistorianSample>> ReadAtTimeAsync(string tagName, DateTime[] timestamps, CancellationToken ct = default)
=> Task.FromResult(AtTimeSamples);
/// <summary>
/// Reads events from the fake historian.
/// </summary>
/// <param name="sourceName">The event source name.</param>
/// <param name="startTime">The start time.</param>
/// <param name="endTime">The end time.</param>
/// <param name="maxEvents">The maximum number of events to return.</param>
/// <param name="ct">Cancellation token.</param>
/// <returns>The events.</returns>
public Task<List<BackendHistorianEventDto>> ReadEventsAsync(string? sourceName, DateTime startTime, DateTime endTime, int maxEvents, CancellationToken ct = default)
=> Task.FromResult(Events);
/// <summary>Gets a health snapshot of the fake historian.</summary>
/// <returns>A health snapshot.</returns>
public HistorianHealthSnapshot GetHealthSnapshot() => new();
/// <summary>Disposes the fake historian.</summary>
public void Dispose() { }
}
private sealed class FakeAlarmWriter : IAlarmEventWriter
{
/// <summary>Gets the events received by this writer.</summary>
public List<AlarmHistorianEventDto> Received { get; } = new();
/// <summary>Gets or sets a delegate that decides whether each event should be marked as successfully written.</summary>
public Func<AlarmHistorianEventDto, bool> Decide { get; set; } = _ => true;
/// <summary>
/// Writes alarm events to the fake writer and returns per-event status based on the <see cref="Decide"/> delegate.
/// </summary>
/// <param name="events">The events to write.</param>
/// <param name="cancellationToken">Cancellation token.</param>
/// <returns>An array of booleans indicating success for each event.</returns>
public Task<bool[]> WriteAsync(AlarmHistorianEventDto[] events, CancellationToken cancellationToken)
{
Received.AddRange(events);
@@ -96,6 +152,7 @@ public sealed class PipeRoundTripTests
return MessagePackSerializer.Deserialize<TReply>(frame.Value.Body);
}
/// <summary>Verifies that raw historian samples round-trip correctly through the frame handler.</summary>
[Fact]
public async Task ReadRaw_RoundTripsSamples()
{
@@ -125,6 +182,7 @@ public sealed class PipeRoundTripTests
MessagePackSerializer.Deserialize<double>(reply.Samples[0].ValueBytes!).ShouldBe(42.0);
}
/// <summary>Verifies that read failures are properly surfaced as error replies.</summary>
[Fact]
public async Task ReadRaw_FailureSurfacesAsErrorReply()
{
@@ -140,6 +198,7 @@ public sealed class PipeRoundTripTests
reply.Samples.ShouldBeEmpty();
}
/// <summary>Verifies that processed (aggregate) historian samples round-trip correctly through the frame handler.</summary>
[Fact]
public async Task ReadProcessed_RoundTripsBuckets()
{
@@ -159,6 +218,7 @@ public sealed class PipeRoundTripTests
reply.Buckets[1].Value.ShouldBeNull(); // unavailable bucket
}
/// <summary>Verifies that at-time historian samples round-trip correctly through the frame handler.</summary>
[Fact]
public async Task ReadAtTime_RoundTripsSamples()
{
@@ -179,6 +239,7 @@ public sealed class PipeRoundTripTests
reply.Samples.Length.ShouldBe(1);
}
/// <summary>Verifies that historian events round-trip correctly through the frame handler.</summary>
[Fact]
public async Task ReadEvents_RoundTripsEvents()
{
@@ -208,6 +269,7 @@ public sealed class PipeRoundTripTests
reply.Events[0].Severity.ShouldBe((ushort)800);
}
/// <summary>Verifies that alarm events are routed to the writer and per-event status is returned.</summary>
[Fact]
public async Task WriteAlarmEvents_RoutesToWriter_AndReturnsPerEventStatus()
{
@@ -240,6 +302,7 @@ public sealed class PipeRoundTripTests
alarmWriter.Received.Count.ShouldBe(2);
}
/// <summary>Verifies that writing alarm events fails cleanly when no writer is configured.</summary>
[Fact]
public async Task WriteAlarmEvents_FailsCleanly_WhenNoWriterConfigured()
{
@@ -260,6 +323,7 @@ public sealed class PipeRoundTripTests
reply.PerEventOk[0].ShouldBeFalse();
}
/// <summary>Verifies that frame reader and writer preserve message kind and body through a round trip.</summary>
[Fact]
public async Task FrameReader_FrameWriter_RoundTripPreservesKindAndBody()
{