public void ArraySubRangeIndexRangeValidationTest()
        {
            // Test with String array
            WriteValue writeValue = new WriteValue()
            {
                AttributeId = Attributes.Value,
                NodeId      = new NodeId(4000, 8),
                Value       = new DataValue(new Variant(new string[] { "ha" })),
                IndexRange  = "0,1:2"
            };

            Assert.AreEqual(BuiltInType.String, writeValue.Value.WrappedValue.TypeInfo.BuiltInType);
            Assert.True(ServiceResult.IsGood(WriteValue.Validate(writeValue)), "WriteValue.Validate result was not Good");

            // Test with ByteString array
            writeValue.Value = new DataValue(new Variant(new byte[][] { new byte[] { 0x22, 0x21 } }));
            Assert.AreEqual(BuiltInType.ByteString, writeValue.Value.WrappedValue.TypeInfo.BuiltInType);
            Assert.True(ServiceResult.IsGood(WriteValue.Validate(writeValue)), "WriteValue.Validate result was not Good");

            // Negative test with Int32 array
            writeValue.Value = new DataValue(new Variant(new int[] { 1, 2 }));
            Assert.AreEqual(BuiltInType.Int32, writeValue.Value.WrappedValue.TypeInfo.BuiltInType);
            ServiceResult validateResult = WriteValue.Validate(writeValue);

            Assert.True(ServiceResult.IsBad(validateResult), "WriteValue.Validate result was not Good");
            Assert.AreEqual(new StatusCode(StatusCodes.BadTypeMismatch), validateResult.StatusCode);
        }
        public void ArrayIndexRangeValidationTest()
        {
            // Positive test
            WriteValue writeValue = new WriteValue()
            {
                AttributeId = Attributes.Value,
                NodeId      = new NodeId(4000, 8),
                Value       = new DataValue(new Variant(new int[] { 1, 2, 3, 4, 5 })),
                IndexRange  = "0:4"
            };

            Assert.True(ServiceResult.IsGood(WriteValue.Validate(writeValue)), "WriteValue.Validate result was not Good");

            // Test with range that does not match the length of the array
            writeValue.IndexRange = "0:5";
            ServiceResult validateResult = WriteValue.Validate(writeValue);

            Assert.True(ServiceResult.IsBad(validateResult), "WriteValue.Validate result was not Bad");
            Assert.AreEqual(new StatusCode(StatusCodes.BadIndexRangeNoData), validateResult.StatusCode);
        }
        public void MatrixIndexRangeValidationTest()
        {
            int[,] int3x3Matrix = new int[, ]
            {
                { 1, 2, 3 },
                { 4, 5, 6 },
                { 7, 8, 9 },
            };

            Matrix matrix = new Matrix(int3x3Matrix, BuiltInType.Int32);

            // Positive test
            WriteValue writeValue = new WriteValue()
            {
                AttributeId = Attributes.Value,
                NodeId      = new NodeId(4000, 8),
                Value       = new DataValue(new Variant(matrix)),
                IndexRange  = "1,1"
            };

            Assert.True(ServiceResult.IsGood(WriteValue.Validate(writeValue)), "WriteValue.Validate result was not Good");

            // Test that Matrix value is not allowed when IndexRange is for one-dimensional array
            writeValue.IndexRange = "1";
            ServiceResult validateResult = WriteValue.Validate(writeValue);

            Assert.True(ServiceResult.IsBad(validateResult), "WriteValue.Validate result was not Bad");
            Assert.AreEqual(new StatusCode(StatusCodes.BadTypeMismatch), validateResult.StatusCode);

            // Test that Matrix value is allowed when IndexRange is not specified
            writeValue.IndexRange = null;
            Assert.True(ServiceResult.IsGood(WriteValue.Validate(writeValue)), "WriteValue.Validate result was not Good");

            // Test that multidimensional IndexRange is not allowed for scalar variable
            writeValue.Value      = new DataValue(new Variant(1));
            writeValue.IndexRange = "1,1";
            validateResult        = WriteValue.Validate(writeValue);
            Assert.True(ServiceResult.IsBad(validateResult), "WriteValue.Validate result was not Bad");
            Assert.AreEqual(new StatusCode(StatusCodes.BadTypeMismatch), validateResult.StatusCode);
        }