using Shouldly; using Xunit; using ZB.MOM.WW.OtOpcUa.Commons.OpcUa; namespace ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests; public sealed class DeferredServiceLevelPublisherTests { /// Verifies that publish before SetInner is a safe no-op. [Fact] public void Publish_before_SetInner_is_a_safe_noop() { var deferred = new DeferredServiceLevelPublisher(); Should.NotThrow(() => deferred.Publish(123)); } /// Verifies that publish after SetInner routes to the inner publisher. [Fact] public void Publish_after_SetInner_routes_to_the_inner() { var recording = new RecordingPublisher(); var deferred = new DeferredServiceLevelPublisher(); deferred.SetInner(recording); deferred.Publish(200); recording.LastValue.ShouldBe((byte)200); } /// Verifies that SetInner with null reverts to the null publisher. [Fact] public void SetInner_null_reverts_to_Null_publisher() { var recording = new RecordingPublisher(); var deferred = new DeferredServiceLevelPublisher(); deferred.SetInner(recording); deferred.Publish(50); deferred.SetInner(null); deferred.Publish(99); recording.LastValue.ShouldBe((byte)50, "writes after SetInner(null) must not reach the previous inner"); } private sealed class RecordingPublisher : IServiceLevelPublisher { /// Gets the last published service level value. public byte? LastValue { get; private set; } /// Publishes a service level value. /// The service level to publish. public void Publish(byte serviceLevel) => LastValue = serviceLevel; } }