diff --git a/Stack/Opc.Ua.Types/BuiltIn/Variant.cs b/Stack/Opc.Ua.Types/BuiltIn/Variant.cs index 30fc7ccee..549d6b331 100644 --- a/Stack/Opc.Ua.Types/BuiltIn/Variant.cs +++ b/Stack/Opc.Ua.Types/BuiltIn/Variant.cs @@ -2354,6 +2354,14 @@ private void SetScalar(object value, TypeInfo typeInfo) m_value = ((Variant)value).Value; TypeInfo = TypeInfo.Construct(m_value); return; + case BuiltInType.StatusCode: + if (value is uint code) + { + m_value = new StatusCode(code); + return; + } + m_value = value; + return; // just save the value. case >= BuiltInType.Null and <= BuiltInType.Enumeration: m_value = value; @@ -2408,6 +2416,19 @@ private void SetArray(Array array, TypeInfo typeInfo) return; } + m_value = array; + return; + case BuiltInType.StatusCode: + if (array is uint[] codes) + { + var statusCodes = new StatusCode[codes.Length]; + for (int ii = 0; ii < codes.Length; ii++) + { + statusCodes[ii] = new StatusCode(codes[ii]); + } + m_value = statusCodes; + return; + } m_value = array; return; // convert encodeables to extension objects. diff --git a/Tests/Opc.Ua.Core.Tests/Types/BuiltIn/BuiltInTests.cs b/Tests/Opc.Ua.Core.Tests/Types/BuiltIn/BuiltInTests.cs index 6d3a6f3ff..049711f45 100644 --- a/Tests/Opc.Ua.Core.Tests/Types/BuiltIn/BuiltInTests.cs +++ b/Tests/Opc.Ua.Core.Tests/Types/BuiltIn/BuiltInTests.cs @@ -204,6 +204,91 @@ public void VariantFromEnumArray() // Variant variant6 = new Variant(daysdays); } + /// + /// Initialize Variant from uint with StatusCode TypeInfo. + /// Tests that a Variant created from uint with StatusCode TypeInfo + /// can be properly cast to StatusCode. + /// + [Test] + public void VariantFromUIntWithStatusCodeTypeInfo() + { + // Test scalar StatusCode creation from uint + uint statusCodeValue = StatusCodes.Good; + var variant = new Variant(statusCodeValue, TypeInfo.Scalars.StatusCode); + + Assert.AreEqual(BuiltInType.StatusCode, variant.TypeInfo.BuiltInType); + Assert.NotNull(variant.Value); + + // Cast the Value to StatusCode + StatusCode statusCode = (StatusCode)variant.Value; + Assert.AreEqual(StatusCodes.Good, statusCode.Code); + + // Test with different status code values + uint badNodeIdValue = StatusCodes.BadNodeIdInvalid; + var variant2 = new Variant(badNodeIdValue, TypeInfo.Scalars.StatusCode); + + Assert.AreEqual(BuiltInType.StatusCode, variant2.TypeInfo.BuiltInType); + StatusCode statusCode2 = (StatusCode)variant2.Value; + Assert.AreEqual(StatusCodes.BadNodeIdInvalid, statusCode2.Code); + + // Test with custom status code value + uint customValue = 0x80AB0000; + var variant3 = new Variant(customValue, TypeInfo.Scalars.StatusCode); + + Assert.AreEqual(BuiltInType.StatusCode, variant3.TypeInfo.BuiltInType); + StatusCode statusCode3 = (StatusCode)variant3.Value; + Assert.AreEqual(customValue, statusCode3.Code); + } + + /// + /// Initialize Variant from uint array with StatusCode TypeInfo. + /// Tests that a Variant created from uint[] with StatusCode TypeInfo + /// can be properly cast to StatusCode[]. + /// + [Test] + public void VariantFromUIntArrayWithStatusCodeTypeInfo() + { + // Test array StatusCode creation from uint[] + uint[] statusCodeValues = [ + StatusCodes.Good, + StatusCodes.BadNodeIdInvalid, + StatusCodes.BadUnexpectedError, + StatusCodes.BadInternalError + ]; + + var variant = new Variant(statusCodeValues, TypeInfo.Arrays.StatusCode); + + Assert.AreEqual(BuiltInType.StatusCode, variant.TypeInfo.BuiltInType); + Assert.NotNull(variant.Value); + Assert.IsTrue(variant.Value is StatusCode[]); + + // Cast the Value to StatusCode array + StatusCode[] statusCodes = (StatusCode[])variant.Value; + Assert.AreEqual(statusCodeValues.Length, statusCodes.Length); + + for (int i = 0; i < statusCodeValues.Length; i++) + { + Assert.AreEqual(statusCodeValues[i], statusCodes[i].Code); + } + + // Test empty array + uint[] emptyArray = []; + var variant2 = new Variant(emptyArray, TypeInfo.Arrays.StatusCode); + + Assert.AreEqual(BuiltInType.StatusCode, variant2.TypeInfo.BuiltInType); + StatusCode[] emptyStatusCodes = (StatusCode[])variant2.Value; + Assert.AreEqual(0, emptyStatusCodes.Length); + + // Test single element array + uint[] singleElement = [StatusCodes.BadTimeout]; + var variant3 = new Variant(singleElement, TypeInfo.Arrays.StatusCode); + + Assert.AreEqual(BuiltInType.StatusCode, variant3.TypeInfo.BuiltInType); + StatusCode[] singleStatusCode = (StatusCode[])variant3.Value; + Assert.AreEqual(1, singleStatusCode.Length); + Assert.AreEqual(StatusCodes.BadTimeout, singleStatusCode[0].Code); + } + /// /// Validate ExtensionObject special cases and constructors. ///