Apply code style formatting and restore partial modifiers on Avalonia views

Linter/formatter pass across the full codebase. Restores required partial
keyword on AXAML code-behind classes that the formatter incorrectly removed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Joseph Doherty
2026-03-31 07:58:13 -04:00
parent 55ef854612
commit 41a6b66943
221 changed files with 4274 additions and 3823 deletions

View File

@@ -12,18 +12,19 @@ using ZB.MOM.WW.LmxOpcUa.Tests.Helpers;
namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
{
/// <summary>
/// Verifies MXAccess client connection lifecycle behavior, including transitions, registration, and reconnect handling.
/// Verifies MXAccess client connection lifecycle behavior, including transitions, registration, and reconnect
/// handling.
/// </summary>
public class MxAccessClientConnectionTests : IDisposable
{
private readonly StaComThread _staThread;
private readonly FakeMxProxy _proxy;
private readonly PerformanceMetrics _metrics;
private readonly MxAccessClient _client;
private readonly PerformanceMetrics _metrics;
private readonly FakeMxProxy _proxy;
private readonly List<(ConnectionState Previous, ConnectionState Current)> _stateChanges = new();
private readonly StaComThread _staThread;
/// <summary>
/// Initializes the connection test fixture with a fake runtime proxy and state-change recorder.
/// Initializes the connection test fixture with a fake runtime proxy and state-change recorder.
/// </summary>
public MxAccessClientConnectionTests()
{
@@ -37,7 +38,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Disposes the connection test fixture and its supporting resources.
/// Disposes the connection test fixture and its supporting resources.
/// </summary>
public void Dispose()
{
@@ -47,7 +48,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that a newly created MXAccess client starts in the disconnected state.
/// Confirms that a newly created MXAccess client starts in the disconnected state.
/// </summary>
[Fact]
public void InitialState_IsDisconnected()
@@ -56,7 +57,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that connecting drives the expected disconnected-to-connecting-to-connected transitions.
/// Confirms that connecting drives the expected disconnected-to-connecting-to-connected transitions.
/// </summary>
[Fact]
public async Task Connect_TransitionsToConnected()
@@ -64,12 +65,14 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
await _client.ConnectAsync();
_client.State.ShouldBe(ConnectionState.Connected);
_stateChanges.ShouldContain(s => s.Previous == ConnectionState.Disconnected && s.Current == ConnectionState.Connecting);
_stateChanges.ShouldContain(s => s.Previous == ConnectionState.Connecting && s.Current == ConnectionState.Connected);
_stateChanges.ShouldContain(s =>
s.Previous == ConnectionState.Disconnected && s.Current == ConnectionState.Connecting);
_stateChanges.ShouldContain(s =>
s.Previous == ConnectionState.Connecting && s.Current == ConnectionState.Connected);
}
/// <summary>
/// Confirms that a successful connect registers exactly once with the runtime proxy.
/// Confirms that a successful connect registers exactly once with the runtime proxy.
/// </summary>
[Fact]
public async Task Connect_RegistersCalled()
@@ -79,7 +82,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that disconnecting drives the expected shutdown transitions back to disconnected.
/// Confirms that disconnecting drives the expected shutdown transitions back to disconnected.
/// </summary>
[Fact]
public async Task Disconnect_TransitionsToDisconnected()
@@ -93,7 +96,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that disconnecting unregisters the runtime proxy session.
/// Confirms that disconnecting unregisters the runtime proxy session.
/// </summary>
[Fact]
public async Task Disconnect_UnregistersCalled()
@@ -104,7 +107,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that registration failures move the client into the error state.
/// Confirms that registration failures move the client into the error state.
/// </summary>
[Fact]
public async Task ConnectFails_TransitionsToError()
@@ -116,7 +119,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that repeated connect calls do not perform duplicate runtime registrations.
/// Confirms that repeated connect calls do not perform duplicate runtime registrations.
/// </summary>
[Fact]
public async Task DoubleConnect_NoOp()
@@ -127,7 +130,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that reconnect increments the reconnect counter and restores the connected state.
/// Confirms that reconnect increments the reconnect counter and restores the connected state.
/// </summary>
[Fact]
public async Task Reconnect_IncrementsCount()
@@ -140,4 +143,4 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
_client.State.ShouldBe(ConnectionState.Connected);
}
}
}
}

View File

@@ -11,16 +11,16 @@ using ZB.MOM.WW.LmxOpcUa.Tests.Helpers;
namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
{
/// <summary>
/// Verifies the background connectivity monitor used to reconnect the MXAccess bridge after faults or stale probes.
/// Verifies the background connectivity monitor used to reconnect the MXAccess bridge after faults or stale probes.
/// </summary>
public class MxAccessClientMonitorTests : IDisposable
{
private readonly StaComThread _staThread;
private readonly FakeMxProxy _proxy;
private readonly PerformanceMetrics _metrics;
private readonly FakeMxProxy _proxy;
private readonly StaComThread _staThread;
/// <summary>
/// Initializes the monitor test fixture with a shared STA thread, fake proxy, and metrics collector.
/// Initializes the monitor test fixture with a shared STA thread, fake proxy, and metrics collector.
/// </summary>
public MxAccessClientMonitorTests()
{
@@ -31,7 +31,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Disposes the monitor test fixture resources.
/// Disposes the monitor test fixture resources.
/// </summary>
public void Dispose()
{
@@ -40,7 +40,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that the monitor reconnects the client after an observed disconnect.
/// Confirms that the monitor reconnects the client after an observed disconnect.
/// </summary>
[Fact]
public async Task Monitor_ReconnectsOnDisconnect()
@@ -67,7 +67,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that the monitor can be started and stopped without throwing.
/// Confirms that the monitor can be started and stopped without throwing.
/// </summary>
[Fact]
public async Task Monitor_StopsOnCancel()
@@ -85,7 +85,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that a stale probe tag triggers a reconnect when monitoring is enabled.
/// Confirms that a stale probe tag triggers a reconnect when monitoring is enabled.
/// </summary>
[Fact]
public async Task Monitor_ProbeStale_ForcesReconnect()
@@ -112,7 +112,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that fresh probe updates prevent unnecessary reconnects.
/// Confirms that fresh probe updates prevent unnecessary reconnects.
/// </summary>
[Fact]
public async Task Monitor_ProbeDataChange_PreventsStaleReconnect()
@@ -130,10 +130,10 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
client.StartMonitor();
// Continuously simulate probe data changes to keep it fresh
for (int i = 0; i < 8; i++)
for (var i = 0; i < 8; i++)
{
await Task.Delay(500);
_proxy.SimulateDataChangeByAddress("TestProbe", i, 192);
_proxy.SimulateDataChangeByAddress("TestProbe", i);
}
client.StopMonitor();
@@ -144,7 +144,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that enabling the monitor without a probe tag does not trigger false reconnects.
/// Confirms that enabling the monitor without a probe tag does not trigger false reconnects.
/// </summary>
[Fact]
public async Task Monitor_NoProbeConfigured_NoFalseReconnect()
@@ -169,4 +169,4 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
client.Dispose();
}
}
}
}

View File

@@ -1,5 +1,4 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using Shouldly;
using Xunit;
@@ -12,17 +11,17 @@ using ZB.MOM.WW.LmxOpcUa.Tests.Helpers;
namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
{
/// <summary>
/// Verifies MXAccess client read and write behavior against the fake runtime proxy used by the bridge.
/// Verifies MXAccess client read and write behavior against the fake runtime proxy used by the bridge.
/// </summary>
public class MxAccessClientReadWriteTests : IDisposable
{
private readonly StaComThread _staThread;
private readonly FakeMxProxy _proxy;
private readonly PerformanceMetrics _metrics;
private readonly MxAccessClient _client;
private readonly PerformanceMetrics _metrics;
private readonly FakeMxProxy _proxy;
private readonly StaComThread _staThread;
/// <summary>
/// Initializes the COM-threaded MXAccess test fixture with a fake runtime proxy and metrics collector.
/// Initializes the COM-threaded MXAccess test fixture with a fake runtime proxy and metrics collector.
/// </summary>
public MxAccessClientReadWriteTests()
{
@@ -35,7 +34,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Disposes the MXAccess client fixture and its supporting STA thread and metrics collector.
/// Disposes the MXAccess client fixture and its supporting STA thread and metrics collector.
/// </summary>
public void Dispose()
{
@@ -45,7 +44,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that reads fail with bad-not-connected quality when the runtime session is offline.
/// Confirms that reads fail with bad-not-connected quality when the runtime session is offline.
/// </summary>
[Fact]
public async Task Read_NotConnected_ReturnsBad()
@@ -55,7 +54,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that a runtime data-change callback completes a pending read with the published value.
/// Confirms that a runtime data-change callback completes a pending read with the published value.
/// </summary>
[Fact]
public async Task Read_ReturnsValueOnDataChange()
@@ -67,7 +66,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
// Give it a moment to set up subscription, then simulate data change
await Task.Delay(50);
_proxy.SimulateDataChangeByAddress("TestTag.Attr", 42, 192);
_proxy.SimulateDataChangeByAddress("TestTag.Attr", 42);
var result = await readTask;
result.Value.ShouldBe(42);
@@ -75,7 +74,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that reads time out with bad communication-failure quality when the runtime never responds.
/// Confirms that reads time out with bad communication-failure quality when the runtime never responds.
/// </summary>
[Fact]
public async Task Read_Timeout_ReturnsBadCommFailure()
@@ -88,7 +87,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that timed-out reads are recorded as failed read operations in the metrics collector.
/// Confirms that timed-out reads are recorded as failed read operations in the metrics collector.
/// </summary>
[Fact]
public async Task Read_Timeout_RecordsFailedMetrics()
@@ -105,7 +104,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that writes are rejected when the runtime session is not connected.
/// Confirms that writes are rejected when the runtime session is not connected.
/// </summary>
[Fact]
public async Task Write_NotConnected_ReturnsFalse()
@@ -115,7 +114,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that successful runtime write acknowledgments return success and record the written payload.
/// Confirms that successful runtime write acknowledgments return success and record the written payload.
/// </summary>
[Fact]
public async Task Write_Success_ReturnsTrue()
@@ -129,7 +128,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that MXAccess error codes on write completion are surfaced as failed writes.
/// Confirms that MXAccess error codes on write completion are surfaced as failed writes.
/// </summary>
[Fact]
public async Task Write_ErrorCode_ReturnsFalse()
@@ -142,7 +141,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that write timeouts are recorded as failed write operations in the metrics collector.
/// Confirms that write timeouts are recorded as failed write operations in the metrics collector.
/// </summary>
[Fact]
public async Task Write_Timeout_ReturnsFalse_AndRecordsFailedMetrics()
@@ -160,7 +159,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that successful reads contribute a read entry to the metrics collector.
/// Confirms that successful reads contribute a read entry to the metrics collector.
/// </summary>
[Fact]
public async Task Read_RecordsMetrics()
@@ -169,7 +168,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
var readTask = _client.ReadAsync("TestTag.Attr");
await Task.Delay(50);
_proxy.SimulateDataChangeByAddress("TestTag.Attr", 1, 192);
_proxy.SimulateDataChangeByAddress("TestTag.Attr", 1);
await readTask;
var stats = _metrics.GetStatistics();
@@ -178,7 +177,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that writes contribute a write entry to the metrics collector.
/// Confirms that writes contribute a write entry to the metrics collector.
/// </summary>
[Fact]
public async Task Write_RecordsMetrics()
@@ -191,4 +190,4 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
stats["Write"].TotalCount.ShouldBe(1);
}
}
}
}

View File

@@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Shouldly;
@@ -13,17 +12,17 @@ using ZB.MOM.WW.LmxOpcUa.Tests.Helpers;
namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
{
/// <summary>
/// Verifies how the MXAccess client manages persistent subscriptions, reconnect replay, and probe-tag behavior.
/// Verifies how the MXAccess client manages persistent subscriptions, reconnect replay, and probe-tag behavior.
/// </summary>
public class MxAccessClientSubscriptionTests : IDisposable
{
private readonly StaComThread _staThread;
private readonly FakeMxProxy _proxy;
private readonly PerformanceMetrics _metrics;
private readonly MxAccessClient _client;
private readonly PerformanceMetrics _metrics;
private readonly FakeMxProxy _proxy;
private readonly StaComThread _staThread;
/// <summary>
/// Initializes the subscription test fixture with a fake runtime proxy and STA thread.
/// Initializes the subscription test fixture with a fake runtime proxy and STA thread.
/// </summary>
public MxAccessClientSubscriptionTests()
{
@@ -35,7 +34,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Disposes the subscription test fixture and its supporting resources.
/// Disposes the subscription test fixture and its supporting resources.
/// </summary>
public void Dispose()
{
@@ -45,7 +44,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that subscribing creates a runtime item, advises it, and increments the active subscription count.
/// Confirms that subscribing creates a runtime item, advises it, and increments the active subscription count.
/// </summary>
[Fact]
public async Task Subscribe_CreatesItemAndAdvises()
@@ -59,7 +58,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that subscribing to the same address twice reuses the existing runtime item.
/// Confirms that subscribing to the same address twice reuses the existing runtime item.
/// </summary>
[Fact]
public async Task Subscribe_SameAddressTwice_ReusesExistingRuntimeItem()
@@ -78,7 +77,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that unsubscribing clears the active subscription count after a tag was previously monitored.
/// Confirms that unsubscribing clears the active subscription count after a tag was previously monitored.
/// </summary>
[Fact]
public async Task Unsubscribe_RemovesItemAndUnadvises()
@@ -91,7 +90,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that runtime data changes are delivered to the per-subscription callback.
/// Confirms that runtime data changes are delivered to the per-subscription callback.
/// </summary>
[Fact]
public async Task OnDataChange_InvokesCallback()
@@ -101,7 +100,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
Vtq? received = null;
await _client.SubscribeAsync("TestTag.Attr", (addr, vtq) => received = vtq);
_proxy.SimulateDataChangeByAddress("TestTag.Attr", 42, 192);
_proxy.SimulateDataChangeByAddress("TestTag.Attr", 42);
received.ShouldNotBeNull();
received.Value.Value.ShouldBe(42);
@@ -109,7 +108,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that runtime data changes are also delivered to the client's global tag-change event.
/// Confirms that runtime data changes are also delivered to the client's global tag-change event.
/// </summary>
[Fact]
public async Task OnDataChange_InvokesGlobalHandler()
@@ -120,13 +119,13 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
_client.OnTagValueChanged += (addr, vtq) => globalAddr = addr;
await _client.SubscribeAsync("TestTag.Attr", (_, _) => { });
_proxy.SimulateDataChangeByAddress("TestTag.Attr", "hello", 192);
_proxy.SimulateDataChangeByAddress("TestTag.Attr", "hello");
globalAddr.ShouldBe("TestTag.Attr");
}
/// <summary>
/// Confirms that stored subscriptions are replayed after reconnect so live updates resume automatically.
/// Confirms that stored subscriptions are replayed after reconnect so live updates resume automatically.
/// </summary>
[Fact]
public async Task StoredSubscriptions_ReplayedAfterReconnect()
@@ -142,12 +141,12 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
_client.ActiveSubscriptionCount.ShouldBe(1);
// Simulate data change on the re-subscribed item
_proxy.SimulateDataChangeByAddress("TestTag.Attr", "value", 192);
_proxy.SimulateDataChangeByAddress("TestTag.Attr", "value");
callbackInvoked.ShouldBe(true);
}
/// <summary>
/// Confirms that one-shot reads do not remove persistent subscriptions when the client reconnects.
/// Confirms that one-shot reads do not remove persistent subscriptions when the client reconnects.
/// </summary>
[Fact]
public async Task OneShotRead_DoesNotRemovePersistentSubscription_OnReconnect()
@@ -158,19 +157,19 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
var readTask = _client.ReadAsync("TestTag.Attr");
await Task.Delay(50);
_proxy.SimulateDataChangeByAddress("TestTag.Attr", 42, 192);
_proxy.SimulateDataChangeByAddress("TestTag.Attr", 42);
(await readTask).Value.ShouldBe(42);
callbackInvoked = false;
await _client.ReconnectAsync();
_proxy.SimulateDataChangeByAddress("TestTag.Attr", "after_reconnect", 192);
_proxy.SimulateDataChangeByAddress("TestTag.Attr", "after_reconnect");
callbackInvoked.ShouldBe(true);
_client.ActiveSubscriptionCount.ShouldBe(1);
}
/// <summary>
/// Confirms that transient writes do not prevent later removal of a persistent subscription.
/// Confirms that transient writes do not prevent later removal of a persistent subscription.
/// </summary>
[Fact]
public async Task OneShotWrite_DoesNotBreakPersistentUnsubscribe()
@@ -189,7 +188,8 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that the configured probe tag is subscribed during connect so connectivity monitoring can start immediately.
/// Confirms that the configured probe tag is subscribed during connect so connectivity monitoring can start
/// immediately.
/// </summary>
[Fact]
public async Task ProbeTag_SubscribedOnConnect()
@@ -206,7 +206,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that the probe tag cannot be unsubscribed accidentally because it is reserved for connection monitoring.
/// Confirms that the probe tag cannot be unsubscribed accidentally because it is reserved for connection monitoring.
/// </summary>
[Fact]
public async Task ProbeTag_ProtectedFromUnsubscribe()
@@ -226,4 +226,4 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
client.Dispose();
}
}
}
}

View File

@@ -1,4 +1,5 @@
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
using Shouldly;
@@ -8,14 +9,14 @@ using ZB.MOM.WW.LmxOpcUa.Host.MxAccess;
namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
{
/// <summary>
/// Verifies the single-threaded apartment worker used to marshal COM calls for the MXAccess bridge.
/// Verifies the single-threaded apartment worker used to marshal COM calls for the MXAccess bridge.
/// </summary>
public class StaComThreadTests : IDisposable
{
private readonly StaComThread _thread;
/// <summary>
/// Starts a fresh STA thread instance for each test.
/// Starts a fresh STA thread instance for each test.
/// </summary>
public StaComThreadTests()
{
@@ -24,12 +25,15 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Disposes the STA thread after each test.
/// Disposes the STA thread after each test.
/// </summary>
public void Dispose() => _thread.Dispose();
public void Dispose()
{
_thread.Dispose();
}
/// <summary>
/// Confirms that queued work runs on a thread configured for STA apartment state.
/// Confirms that queued work runs on a thread configured for STA apartment state.
/// </summary>
[Fact]
public async Task RunAsync_ExecutesOnStaThread()
@@ -39,7 +43,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that action delegates run to completion on the STA thread.
/// Confirms that action delegates run to completion on the STA thread.
/// </summary>
[Fact]
public async Task RunAsync_Action_Completes()
@@ -50,7 +54,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that function delegates can return results from the STA thread.
/// Confirms that function delegates can return results from the STA thread.
/// </summary>
[Fact]
public async Task RunAsync_Func_ReturnsResult()
@@ -60,7 +64,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that exceptions thrown on the STA thread propagate back to the caller.
/// Confirms that exceptions thrown on the STA thread propagate back to the caller.
/// </summary>
[Fact]
public async Task RunAsync_PropagatesException()
@@ -70,7 +74,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that disposing the STA thread stops it from accepting additional work.
/// Confirms that disposing the STA thread stops it from accepting additional work.
/// </summary>
[Fact]
public void Dispose_Stops_Thread()
@@ -84,12 +88,12 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
}
/// <summary>
/// Confirms that multiple queued work items all execute successfully on the STA thread.
/// Confirms that multiple queued work items all execute successfully on the STA thread.
/// </summary>
[Fact]
public async Task MultipleWorkItems_ExecuteInOrder()
{
var results = new System.Collections.Concurrent.ConcurrentBag<int>();
var results = new ConcurrentBag<int>();
await Task.WhenAll(
_thread.RunAsync(() => results.Add(1)),
_thread.RunAsync(() => results.Add(2)),
@@ -98,4 +102,4 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.MxAccess
results.Count.ShouldBe(3);
}
}
}
}