using System.Collections.Generic; using Opc.Ua; namespace ZB.MOM.WW.ScadaBridge.DataConnectionLayer.Tests.Adapters; /// /// SCOPE: these tests cover ONLY the SDK-level building block the write path /// relies on — that new Variant(collection) wraps a CLR array / list as a /// typed array (ValueRank = OneDimension) without throwing. /// They are NOT an end-to-end test of the runtime write flow: they feed a /// hand-built collection straight into , bypassing the /// InstanceActor decode step that produces that collection. /// /// The END-TO-END flow — a script's canonical JSON list string being DECODED to a /// typed List<T> before the WriteTagRequest reaches the DCL /// (so OPC UA writes an array node, not a String scalar) — is covered by /// InstanceActorTests.InstanceActor_DataSourcedListWrite_SendsTypedArrayToDcl_NotJsonString. /// The runtime hands a /// List<T> (the codec's decode result), which the SDK wraps /// identically to a CLR array — see the List<int> case below. A full /// device round-trip needs a live server and is covered by the live OPC UA smoke /// tests. /// [Trait("Category", "Unit")] public class RealOpcUaClientArrayWriteTests { [Fact] public void Variant_wraps_int_list_as_array_without_throwing() { // The runtime actually hands WriteValueAsync a List (the decode result), // not a raw T[]; assert the SDK wraps it as a typed array all the same. var value = new List { 10, 20, 30 }; var ex = Record.Exception(() => new Variant(value)); Assert.Null(ex); var variant = new Variant(value); Assert.Equal(BuiltInType.Int32, variant.TypeInfo.BuiltInType); Assert.Equal(ValueRanks.OneDimension, variant.TypeInfo.ValueRank); } [Fact] public void Variant_wraps_int_array_without_throwing() { var value = new[] { 10, 20, 30 }; var ex = Record.Exception(() => new Variant(value)); Assert.Null(ex); var variant = new Variant(value); Assert.Equal(BuiltInType.Int32, variant.TypeInfo.BuiltInType); Assert.Equal(ValueRanks.OneDimension, variant.TypeInfo.ValueRank); } [Fact] public void Variant_wraps_double_array_without_throwing() { var value = new[] { 1.5, 2.5, 3.5 }; var ex = Record.Exception(() => new Variant(value)); Assert.Null(ex); var variant = new Variant(value); Assert.Equal(BuiltInType.Double, variant.TypeInfo.BuiltInType); Assert.Equal(ValueRanks.OneDimension, variant.TypeInfo.ValueRank); } [Fact] public void Variant_wraps_string_array_without_throwing() { var value = new[] { "a", "b", "c" }; var ex = Record.Exception(() => new Variant(value)); Assert.Null(ex); var variant = new Variant(value); Assert.Equal(BuiltInType.String, variant.TypeInfo.BuiltInType); Assert.Equal(ValueRanks.OneDimension, variant.TypeInfo.ValueRank); } }