using Opc.Ua; using Shouldly; using Xunit; using ZB.MOM.WW.OtOpcUa.Client.Shared.Helpers; namespace ZB.MOM.WW.OtOpcUa.Client.Shared.Tests.Helpers; public class HistoryReadStatusTests { /// A refused read must surface, carrying the status code, rather than read as an empty result. /// The Bad per-node status code. [Theory] [InlineData(StatusCodes.BadHistoryOperationUnsupported)] [InlineData(StatusCodes.BadUserAccessDenied)] [InlineData(StatusCodes.BadNodeIdUnknown)] [InlineData(StatusCodes.BadTimeout)] public void Bad_status_throws_ServiceResultException_with_the_code(uint code) { var ex = Should.Throw( () => HistoryReadStatus.ThrowIfRefused(new StatusCode(code), new NodeId("n", 2))); ex.StatusCode.ShouldBe(code); ex.Message.ShouldContain("ns=2;s=n"); } /// Good, GoodNoData, Uncertain and BadNoData are all non-refusals (the window may simply be empty). /// The non-refusal status code. [Theory] [InlineData(StatusCodes.Good)] [InlineData(StatusCodes.GoodNoData)] [InlineData(StatusCodes.GoodMoreData)] [InlineData(StatusCodes.UncertainNoCommunicationLastUsableValue)] [InlineData(StatusCodes.BadNoData)] public void Non_refusal_status_does_not_throw(uint code) { Should.NotThrow(() => HistoryReadStatus.ThrowIfRefused(new StatusCode(code), new NodeId("n", 2))); } }