Skip to content

Commit 288f02f

Browse files
marcschierCopilot
andauthored
Allow status code variant creation from uint (OPCFoundation#3472)
* Allow status code variant creation from uint * Initial plan * Add comprehensive tests for StatusCode variant creation from uint Co-authored-by: marcschier <11168470+marcschier@users.noreply.github.com> * Remove redundant assertions in StatusCode variant tests Co-authored-by: marcschier <11168470+marcschier@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: marcschier <11168470+marcschier@users.noreply.github.com>
1 parent 21949f8 commit 288f02f

File tree

2 files changed

+106
-0
lines changed

2 files changed

+106
-0
lines changed

Stack/Opc.Ua.Types/BuiltIn/Variant.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2354,6 +2354,14 @@ private void SetScalar(object value, TypeInfo typeInfo)
23542354
m_value = ((Variant)value).Value;
23552355
TypeInfo = TypeInfo.Construct(m_value);
23562356
return;
2357+
case BuiltInType.StatusCode:
2358+
if (value is uint code)
2359+
{
2360+
m_value = new StatusCode(code);
2361+
return;
2362+
}
2363+
m_value = value;
2364+
return;
23572365
// just save the value.
23582366
case >= BuiltInType.Null and <= BuiltInType.Enumeration:
23592367
m_value = value;
@@ -2408,6 +2416,19 @@ private void SetArray(Array array, TypeInfo typeInfo)
24082416
return;
24092417
}
24102418

2419+
m_value = array;
2420+
return;
2421+
case BuiltInType.StatusCode:
2422+
if (array is uint[] codes)
2423+
{
2424+
var statusCodes = new StatusCode[codes.Length];
2425+
for (int ii = 0; ii < codes.Length; ii++)
2426+
{
2427+
statusCodes[ii] = new StatusCode(codes[ii]);
2428+
}
2429+
m_value = statusCodes;
2430+
return;
2431+
}
24112432
m_value = array;
24122433
return;
24132434
// convert encodeables to extension objects.

Tests/Opc.Ua.Core.Tests/Types/BuiltIn/BuiltInTests.cs

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,91 @@ public void VariantFromEnumArray()
204204
// Variant variant6 = new Variant(daysdays);
205205
}
206206

207+
/// <summary>
208+
/// Initialize Variant from uint with StatusCode TypeInfo.
209+
/// Tests that a Variant created from uint with StatusCode TypeInfo
210+
/// can be properly cast to StatusCode.
211+
/// </summary>
212+
[Test]
213+
public void VariantFromUIntWithStatusCodeTypeInfo()
214+
{
215+
// Test scalar StatusCode creation from uint
216+
uint statusCodeValue = StatusCodes.Good;
217+
var variant = new Variant(statusCodeValue, TypeInfo.Scalars.StatusCode);
218+
219+
Assert.AreEqual(BuiltInType.StatusCode, variant.TypeInfo.BuiltInType);
220+
Assert.NotNull(variant.Value);
221+
222+
// Cast the Value to StatusCode
223+
StatusCode statusCode = (StatusCode)variant.Value;
224+
Assert.AreEqual(StatusCodes.Good, statusCode.Code);
225+
226+
// Test with different status code values
227+
uint badNodeIdValue = StatusCodes.BadNodeIdInvalid;
228+
var variant2 = new Variant(badNodeIdValue, TypeInfo.Scalars.StatusCode);
229+
230+
Assert.AreEqual(BuiltInType.StatusCode, variant2.TypeInfo.BuiltInType);
231+
StatusCode statusCode2 = (StatusCode)variant2.Value;
232+
Assert.AreEqual(StatusCodes.BadNodeIdInvalid, statusCode2.Code);
233+
234+
// Test with custom status code value
235+
uint customValue = 0x80AB0000;
236+
var variant3 = new Variant(customValue, TypeInfo.Scalars.StatusCode);
237+
238+
Assert.AreEqual(BuiltInType.StatusCode, variant3.TypeInfo.BuiltInType);
239+
StatusCode statusCode3 = (StatusCode)variant3.Value;
240+
Assert.AreEqual(customValue, statusCode3.Code);
241+
}
242+
243+
/// <summary>
244+
/// Initialize Variant from uint array with StatusCode TypeInfo.
245+
/// Tests that a Variant created from uint[] with StatusCode TypeInfo
246+
/// can be properly cast to StatusCode[].
247+
/// </summary>
248+
[Test]
249+
public void VariantFromUIntArrayWithStatusCodeTypeInfo()
250+
{
251+
// Test array StatusCode creation from uint[]
252+
uint[] statusCodeValues = [
253+
StatusCodes.Good,
254+
StatusCodes.BadNodeIdInvalid,
255+
StatusCodes.BadUnexpectedError,
256+
StatusCodes.BadInternalError
257+
];
258+
259+
var variant = new Variant(statusCodeValues, TypeInfo.Arrays.StatusCode);
260+
261+
Assert.AreEqual(BuiltInType.StatusCode, variant.TypeInfo.BuiltInType);
262+
Assert.NotNull(variant.Value);
263+
Assert.IsTrue(variant.Value is StatusCode[]);
264+
265+
// Cast the Value to StatusCode array
266+
StatusCode[] statusCodes = (StatusCode[])variant.Value;
267+
Assert.AreEqual(statusCodeValues.Length, statusCodes.Length);
268+
269+
for (int i = 0; i < statusCodeValues.Length; i++)
270+
{
271+
Assert.AreEqual(statusCodeValues[i], statusCodes[i].Code);
272+
}
273+
274+
// Test empty array
275+
uint[] emptyArray = [];
276+
var variant2 = new Variant(emptyArray, TypeInfo.Arrays.StatusCode);
277+
278+
Assert.AreEqual(BuiltInType.StatusCode, variant2.TypeInfo.BuiltInType);
279+
StatusCode[] emptyStatusCodes = (StatusCode[])variant2.Value;
280+
Assert.AreEqual(0, emptyStatusCodes.Length);
281+
282+
// Test single element array
283+
uint[] singleElement = [StatusCodes.BadTimeout];
284+
var variant3 = new Variant(singleElement, TypeInfo.Arrays.StatusCode);
285+
286+
Assert.AreEqual(BuiltInType.StatusCode, variant3.TypeInfo.BuiltInType);
287+
StatusCode[] singleStatusCode = (StatusCode[])variant3.Value;
288+
Assert.AreEqual(1, singleStatusCode.Length);
289+
Assert.AreEqual(StatusCodes.BadTimeout, singleStatusCode[0].Code);
290+
}
291+
207292
/// <summary>
208293
/// Validate ExtensionObject special cases and constructors.
209294
/// </summary>

0 commit comments

Comments
 (0)