# Copyright (c) 2021 Project CHIP Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

name: Test Cluster Tests

config:
    nodeId: 0x12344321
    cluster: "Unit Testing"
    endpoint: 1

tests:
    - label: "Wait for the commissioned device to be retrieved"
      cluster: "DelayCommands"
      command: "WaitForCommissionee"
      arguments:
          values:
              - name: "nodeId"
                value: nodeId

    - label: "Send Test Command"
      command: "Test"

    - label: "Send Test Not Handled Command"
      command: "TestNotHandled"
      response:
          error: INVALID_COMMAND

    - label: "Send Test Specific Command"
      command: "TestSpecific"
      response:
          values:
              - name: "returnValue"
                value: 7

    - label: "Send Test Add Arguments Command"
      command: "TestAddArguments"
      arguments:
          values:
              - name: "arg1"
                value: 3
              - name: "arg2"
                value: 17
      response:
          values:
              - name: "returnValue"
                value: 20

    - label: "Send failing Test Add Arguments Command"
      command: "TestAddArguments"
      arguments:
          values:
              - name: "arg1"
                value: 250
              - name: "arg2"
                value: 6
      response:
          error: INVALID_COMMAND

    # Tests for Boolean attribute

    - label: "Read attribute BOOLEAN Default Value"
      command: "readAttribute"
      attribute: "boolean"
      response:
          value: 0

    - label: "Write attribute BOOLEAN True"
      command: "writeAttribute"
      attribute: "boolean"
      arguments:
          value: 1

    - label: "Read attribute BOOLEAN True"
      command: "readAttribute"
      attribute: "boolean"
      response:
          value: 1

    - label: "Write attribute BOOLEAN False"
      command: "writeAttribute"
      attribute: "boolean"
      arguments:
          value: 0

    - label: "Read attribute BOOLEAN False"
      command: "readAttribute"
      attribute: "boolean"
      response:
          value: 0

    # Tests for Bitmap8 attribute

    - label: "Read attribute BITMAP8 Default Value"
      command: "readAttribute"
      attribute: "bitmap8"
      response:
          value: 0

    - label: "Write attribute BITMAP8 Max Value"
      command: "writeAttribute"
      attribute: "bitmap8"
      arguments:
          value: 255

    - label: "Read attribute BITMAP8 Max Value"
      command: "readAttribute"
      attribute: "bitmap8"
      response:
          value: 255

    - label: "Write attribute BITMAP8 Min Value"
      command: "writeAttribute"
      attribute: "bitmap8"
      arguments:
          value: 0

    - label: "Read attribute BITMAP8 Min Value"
      command: "readAttribute"
      attribute: "bitmap8"
      response:
          value: 0

    # Tests for Bitmap16 attribute

    - label: "Read attribute BITMAP16 Default Value"
      command: "readAttribute"
      attribute: "bitmap16"
      response:
          value: 0

    - label: "Write attribute BITMAP16 Max Value"
      command: "writeAttribute"
      attribute: "bitmap16"
      arguments:
          value: 65535

    - label: "Read attribute BITMAP16 Max Value"
      command: "readAttribute"
      attribute: "bitmap16"
      response:
          value: 65535

    - label: "Write attribute BITMAP16 Min Value"
      command: "writeAttribute"
      attribute: "bitmap16"
      arguments:
          value: 0

    - label: "Read attribute BITMAP16 Min Value"
      command: "readAttribute"
      attribute: "bitmap16"
      response:
          value: 0

    # Tests for Bitmap32 attribute

    - label: "Read attribute BITMAP32 Default Value"
      command: "readAttribute"
      attribute: "bitmap32"
      response:
          value: 0

    - label: "Write attribute BITMAP32 Max Value"
      command: "writeAttribute"
      attribute: "bitmap32"
      arguments:
          value: 4294967295

    - label: "Read attribute BITMAP32 Max Value"
      command: "readAttribute"
      attribute: "bitmap32"
      response:
          value: 4294967295

    - label: "Write attribute BITMAP32 Min Value"
      command: "writeAttribute"
      attribute: "bitmap32"
      arguments:
          value: 0

    - label: "Read attribute BITMAP32 Min Value"
      command: "readAttribute"
      attribute: "bitmap32"
      response:
          value: 0

    # Tests for Bitmap64 attribute

    - label: "Read attribute BITMAP64 Default Value"
      command: "readAttribute"
      attribute: "bitmap64"
      response:
          value: 0

    - label: "Write attribute BITMAP64 Max Value"
      command: "writeAttribute"
      attribute: "bitmap64"
      arguments:
          value: "18446744073709551615"

    - label: "Read attribute BITMAP64 Max Value"
      command: "readAttribute"
      attribute: "bitmap64"
      response:
          value: "18446744073709551615"

    - label: "Write attribute BITMAP64 Min Value"
      command: "writeAttribute"
      attribute: "bitmap64"
      arguments:
          value: 0

    - label: "Read attribute BITMAP64 Min Value"
      command: "readAttribute"
      attribute: "bitmap64"
      response:
          value: 0

    # Tests for UInt8 attribute

    - label: "Read attribute INT8U Default Value"
      command: "readAttribute"
      attribute: "int8u"
      response:
          value: 0

    - label: "Write attribute INT8U Max Value"
      command: "writeAttribute"
      attribute: "int8u"
      arguments:
          value: 255

    - label: "Read attribute INT8U Max Value"
      command: "readAttribute"
      attribute: "int8u"
      response:
          value: 255

    - label: "Write attribute INT8U Min Value"
      command: "writeAttribute"
      attribute: "int8u"
      arguments:
          value: 0

    - label: "Read attribute INT8U Min Value"
      command: "readAttribute"
      attribute: "int8u"
      response:
          value: 0

    # Tests for UInt16 attribute

    - label: "Read attribute INT16U Default Value"
      command: "readAttribute"
      attribute: "int16u"
      response:
          value: 0

    - label: "Write attribute INT16U Max Value"
      command: "writeAttribute"
      attribute: "int16u"
      arguments:
          value: 65535

    - label: "Read attribute INT16U Max Value"
      command: "readAttribute"
      attribute: "int16u"
      response:
          value: 65535

    - label: "Write attribute INT16U Min Value"
      command: "writeAttribute"
      attribute: "int16u"
      arguments:
          value: 0

    - label: "Read attribute INT16U Min Value"
      command: "readAttribute"
      attribute: "int16u"
      response:
          value: 0

    # Tests for UInt32 attribute

    - label: "Read attribute INT32U Default Value"
      command: "readAttribute"
      attribute: "int32u"
      response:
          value: 0

    - label: "Write attribute INT32U Max Value"
      command: "writeAttribute"
      attribute: "int32u"
      arguments:
          value: 4294967295

    - label: "Read attribute INT32U Max Value"
      command: "readAttribute"
      attribute: "int32u"
      response:
          value: 4294967295

    - label: "Write attribute INT32U Min Value"
      command: "writeAttribute"
      attribute: "int32u"
      arguments:
          value: 0

    - label: "Read attribute INT32U Min Value"
      command: "readAttribute"
      attribute: "int32u"
      response:
          value: 0

    # Tests for UInt64 attribute

    - label: "Read attribute INT64U Default Value"
      command: "readAttribute"
      attribute: "int64u"
      response:
          value: 0

    - label: "Write attribute INT64U Max Value"
      command: "writeAttribute"
      attribute: "int64u"
      arguments:
          value: "18446744073709551615"

    - label: "Read attribute INT64U Max Value"
      command: "readAttribute"
      attribute: "int64u"
      response:
          value: "18446744073709551615"

    - label: "Write attribute INT64U Min Value"
      command: "writeAttribute"
      attribute: "int64u"
      arguments:
          value: 0

    - label: "Read attribute INT64U Min Value"
      command: "readAttribute"
      attribute: "int64u"
      response:
          value: 0

    # Tests for Int8 attribute

    - label: "Read attribute INT8S Default Value"
      command: "readAttribute"
      attribute: "int8s"
      response:
          value: 0

    - label: "Write attribute INT8S Max Value"
      command: "writeAttribute"
      attribute: "int8s"
      arguments:
          value: 127

    - label: "Read attribute INT8S Max Value"
      command: "readAttribute"
      attribute: "int8s"
      response:
          value: 127

    - label: "Write attribute INT8S Min Value"
      command: "writeAttribute"
      attribute: "int8s"
      arguments:
          value: -128

    - label: "Read attribute INT8S Min Value"
      command: "readAttribute"
      attribute: "int8s"
      response:
          value: -128

    - label: "Write attribute INT8S Default Value"
      command: "writeAttribute"
      attribute: "int8s"
      arguments:
          value: 0

    - label: "Read attribute INT8S Default Value"
      command: "readAttribute"
      attribute: "int8s"
      response:
          value: 0

    # Tests for Int16 attribute

    - label: "Read attribute INT16S Default Value"
      command: "readAttribute"
      attribute: "int16s"
      response:
          value: 0

    - label: "Write attribute INT16S Max Value"
      command: "writeAttribute"
      attribute: "int16s"
      arguments:
          value: 32767

    - label: "Read attribute INT16S Max Value"
      command: "readAttribute"
      attribute: "int16s"
      response:
          value: 32767

    - label: "Write attribute INT16S Min Value"
      command: "writeAttribute"
      attribute: "int16s"
      arguments:
          value: -32768

    - label: "Read attribute INT16S Min Value"
      command: "readAttribute"
      attribute: "int16s"
      response:
          value: -32768

    - label: "Write attribute INT16S Default Value"
      command: "writeAttribute"
      attribute: "int16s"
      arguments:
          value: 0

    - label: "Read attribute INT16S Default Value"
      command: "readAttribute"
      attribute: "int16s"
      response:
          value: 0

    # Tests for Int32 attribute

    - label: "Read attribute INT32S Default Value"
      command: "readAttribute"
      attribute: "int32s"
      response:
          value: 0

    - label: "Write attribute INT32S Max Value"
      command: "writeAttribute"
      attribute: "int32s"
      arguments:
          value: 2147483647

    - label: "Read attribute INT32S Max Value"
      command: "readAttribute"
      attribute: "int32s"
      response:
          value: 2147483647

    - label: "Write attribute INT32S Min Value"
      command: "writeAttribute"
      attribute: "int32s"
      arguments:
          value: -2147483648

    - label: "Read attribute INT32S Min Value"
      command: "readAttribute"
      attribute: "int32s"
      response:
          value: -2147483648

    - label: "Write attribute INT32S Default Value"
      command: "writeAttribute"
      attribute: "int32s"
      arguments:
          value: 0

    - label: "Read attribute INT32S Default Value"
      command: "readAttribute"
      attribute: "int32s"
      response:
          value: 0

    # Tests for Int64 attribute

    - label: "Read attribute INT64S Default Value"
      command: "readAttribute"
      attribute: "int64s"
      response:
          value: 0

    - label: "Write attribute INT64S Max Value"
      command: "writeAttribute"
      attribute: "int64s"
      arguments:
          value: "9223372036854775807"

    - label: "Read attribute INT64S Max Value"
      command: "readAttribute"
      attribute: "int64s"
      response:
          value: "9223372036854775807"

    - label: "Write attribute INT64S Min Value"
      command: "writeAttribute"
      attribute: "int64s"
      arguments:
          value: "-9223372036854775807"

    - label: "Read attribute INT64S Min Value"
      command: "readAttribute"
      attribute: "int64s"
      response:
          value: "-9223372036854775807"

    - label: "Write attribute INT64S Default Value"
      command: "writeAttribute"
      attribute: "int64s"
      arguments:
          value: 0

    - label: "Read attribute INT64S Default Value"
      command: "readAttribute"
      attribute: "int64s"
      response:
          value: 0

    # Tests for float attribute

    - label: "Read attribute SINGLE Default Value"
      command: "readAttribute"
      attribute: "float_single"
      response:
          value: 0

    - label: "Write attribute SINGLE medium Value"
      command: "writeAttribute"
      attribute: "float_single"
      arguments:
          value: 0.1

    - label: "Read attribute SINGLE medium Value"
      command: "readAttribute"
      attribute: "float_single"
      response:
          value: 0.1

    - label: "Write attribute SINGLE large Value"
      command: "writeAttribute"
      attribute: "float_single"
      arguments:
          value: 1.7e10

    - label: "Read attribute SINGLE large Value"
      command: "readAttribute"
      attribute: "float_single"
      response:
          value: 1.7e10

    - label: "Write attribute SINGLE small Value"
      command: "writeAttribute"
      attribute: "float_single"
      arguments:
          value: 1.7e-10

    - label: "Read attribute SINGLE small Value"
      command: "readAttribute"
      attribute: "float_single"
      response:
          value: 1.7e-10

    - label: "Write attribute SINGLE Default Value"
      command: "writeAttribute"
      attribute: "float_single"
      arguments:
          value: 0

    - label: "Read attribute SINGLE Default Value"
      command: "readAttribute"
      attribute: "float_single"
      response:
          value: 0

    # Tests for double attribute

    - label: "Read attribute DOUBLE Default Value"
      command: "readAttribute"
      attribute: "float_double"
      response:
          value: 0

    - label: "Write attribute DOUBLE medium Value"
      command: "writeAttribute"
      attribute: "float_double"
      arguments:
          value: 0.1234567890123

    - label: "Read attribute DOUBLE medium Value"
      command: "readAttribute"
      attribute: "float_double"
      response:
          value: 0.1234567890123

    - label: "Write attribute DOUBLE large Value"
      command: "writeAttribute"
      attribute: "float_double"
      arguments:
          value: "1.7e+200"

    - label: "Read attribute DOUBLE large Value"
      command: "readAttribute"
      attribute: "float_double"
      response:
          value: "1.7e+200"

    - label: "Write attribute DOUBLE small Value"
      command: "writeAttribute"
      attribute: "float_double"
      arguments:
          value: 1.7e-200

    - label: "Read attribute DOUBLE small Value"
      command: "readAttribute"
      attribute: "float_double"
      response:
          value: 1.7e-200

    - label: "Write attribute DOUBLE Default Value"
      command: "writeAttribute"
      attribute: "float_double"
      arguments:
          value: 0

    - label: "Read attribute DOUBLE Default Value"
      command: "readAttribute"
      attribute: "float_double"
      response:
          value: 0

    # Tests for Enum8 attribute

    - label: "Read attribute ENUM8 Default Value"
      command: "readAttribute"
      attribute: "enum8"
      response:
          value: 0

    - label: "Write attribute ENUM8 Max Value"
      command: "writeAttribute"
      attribute: "enum8"
      arguments:
          value: 255

    - label: "Read attribute ENUM8 Max Value"
      command: "readAttribute"
      attribute: "enum8"
      response:
          value: 255

    - label: "Write attribute ENUM8 Min Value"
      command: "writeAttribute"
      attribute: "enum8"
      arguments:
          value: 0

    - label: "Read attribute ENUM8 Min Value"
      command: "readAttribute"
      attribute: "enum8"
      response:
          value: 0

    # Tests for Enum16 attribute

    - label: "Read attribute ENUM16 Default Value"
      command: "readAttribute"
      attribute: "enum16"
      response:
          value: 0

    - label: "Write attribute ENUM16 Max Value"
      command: "writeAttribute"
      attribute: "enum16"
      arguments:
          value: 65535

    - label: "Read attribute ENUM16 Max Value"
      command: "readAttribute"
      attribute: "enum16"
      response:
          value: 65535

    - label: "Write attribute ENUM16 Min Value"
      command: "writeAttribute"
      attribute: "enum16"
      arguments:
          value: 0

    - label: "Read attribute ENUM16 Min Value"
      command: "readAttribute"
      attribute: "enum16"
      response:
          value: 0

    # Tests for Octet String attribute

    - label: "Read attribute OCTET_STRING Default Value"
      command: "readAttribute"
      attribute: "octet_string"
      response:
          value: ""

    - label: "Write attribute OCTET_STRING with embedded null"
      command: "writeAttribute"
      attribute: "octet_string"
      arguments:
          value: "Tes\x00ti\x00ng"

    - label: "Read attribute OCTET_STRING with embedded null"
      command: "readAttribute"
      attribute: "octet_string"
      response:
          value: "Tes\x00ti\x00ng"

    - label: "Write attribute OCTET_STRING with hex: format"
      command: "writeAttribute"
      attribute: "octet_string"
      arguments:
          value: "hex:000102030405"

    - label: "Read attribute OCTET_STRING with hex: format"
      command: "readAttribute"
      attribute: "octet_string"
      response:
          value: "hex:000102030405"

    - label: "Write attribute OCTET_STRING with weird chars"
      command: "writeAttribute"
      attribute: "octet_string"
      arguments:
          value: "\r\n\xff\"\xa0"

    - label: "Read attribute OCTET_STRING with weird chars"
      command: "readAttribute"
      attribute: "octet_string"
      response:
          # This is the properly 'hex:...' version of "\r\n\xff\"\xa0"
          value: "hex:0d0aff22a0"

    - label: "Write attribute OCTET_STRING"
      command: "writeAttribute"
      attribute: "octet_string"
      arguments:
          value: "TestValue"

    - label: "Read attribute OCTET_STRING"
      command: "readAttribute"
      attribute: "octet_string"
      response:
          value: "TestValue"

    - label: "Write attribute OCTET_STRING"
      command: "writeAttribute"
      attribute: "octet_string"
      arguments:
          value: "TestValueLongerThan10"
      response:
          error: CONSTRAINT_ERROR

    - label: "Read attribute OCTET_STRING"
      command: "readAttribute"
      attribute: "octet_string"
      response:
          value: "TestValue"

    - label: "Write attribute OCTET_STRING"
      command: "writeAttribute"
      attribute: "octet_string"
      arguments:
          value: ""

    # Tests for Long Octet String attribute

    - label: "Read attribute LONG_OCTET_STRING Default Value"
      command: "readAttribute"
      attribute: "long_octet_string"
      response:
          value: ""

    - label: "Write attribute LONG_OCTET_STRING"
      command: "writeAttribute"
      attribute: "long_octet_string"
      arguments:
          value: "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"

    - label: "Read attribute LONG_OCTET_STRING"
      command: "readAttribute"
      attribute: "long_octet_string"
      response:
          value: "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"

    - label: "Write attribute LONG_OCTET_STRING"
      command: "writeAttribute"
      attribute: "long_octet_string"
      arguments:
          value: ""

    # Tests for Char String attribute

    - label: "Read attribute CHAR_STRING Default Value"
      command: "readAttribute"
      attribute: "char_string"
      response:
          value: ""

    - label: "Write attribute CHAR_STRING"
      command: "writeAttribute"
      attribute: "char_string"
      arguments:
          value: "☉T☉"

    - label: "Read attribute CHAR_STRING"
      command: "readAttribute"
      attribute: "char_string"
      response:
          value: "☉T☉"

    - label: "Write attribute CHAR_STRING - Value too long"
      command: "writeAttribute"
      attribute: "char_string"
      arguments:
          value: "☉TestValueLongerThan10☉"
      response:
          error: CONSTRAINT_ERROR

    - label: "Read attribute CHAR_STRING"
      command: "readAttribute"
      attribute: "char_string"
      response:
          value: "☉T☉"

    - label: "Write attribute CHAR_STRING - Empty"
      command: "writeAttribute"
      attribute: "char_string"
      arguments:
          value: ""

    # Tests for Long Char String attribute

    - label: "Read attribute LONG_CHAR_STRING Default Value"
      command: "readAttribute"
      attribute: "long_char_string"
      response:
          value: ""

    - label: "Write attribute LONG_CHAR_STRING"
      command: "writeAttribute"
      attribute: "long_char_string"
      arguments:
          value: "☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉"

    - label: "Read attribute LONG_CHAR_STRING"
      command: "readAttribute"
      attribute: "long_char_string"
      response:
          value: "☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉"

    - label: "Write attribute LONG_CHAR_STRING"
      command: "writeAttribute"
      attribute: "long_char_string"
      arguments:
          value: ""

    - label: "Read attribute LIST_LONG_OCTET_STRING (for chunked read)"
      command: "readAttribute"
      attribute: "list_long_octet_string"
      response:
          value:
              [
                  "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
                  "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
                  "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
                  "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
              ]

    - label: "Write attribute LIST_LONG_OCTET_STRING (for chunked write)"
      command: "writeAttribute"
      attribute: "list_long_octet_string"
      arguments:
          value:
              [
                  "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
                  "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
                  "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
                  "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
                  "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
              ]

    - label: "Read attribute LIST_LONG_OCTET_STRING (for chunked read)"
      command: "readAttribute"
      attribute: "list_long_octet_string"
      response:
          value:
              [
                  "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
                  "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
                  "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
                  "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
                  "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
              ]

    - label: "Write attribute LIST_LONG_OCTET_STRING (for chunked write)"
      command: "writeAttribute"
      attribute: "list_long_octet_string"
      arguments:
          value:
              [
                  "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
                  "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
                  "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
                  "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
              ]

    # Tests for Epoch Microseconds

    - label: "Read attribute EPOCH_US Default Value"
      command: "readAttribute"
      attribute: "epoch_us"
      response:
          value: 0

    - label: "Write attribute EPOCH_US Max Value"
      command: "writeAttribute"
      attribute: "epoch_us"
      arguments:
          value: "18446744073709551615"

    - label: "Read attribute EPOCH_US Max Value"
      command: "readAttribute"
      attribute: "epoch_us"
      response:
          value: "18446744073709551615"

    - label: "Write attribute EPOCH_US Min Value"
      command: "writeAttribute"
      attribute: "epoch_us"
      arguments:
          value: 0

    - label: "Read attribute EPOCH_US Min Value"
      command: "readAttribute"
      attribute: "epoch_us"
      response:
          value: 0

    # Tests for Epoch Seconds

    - label: "Read attribute EPOCH_S Default Value"
      command: "readAttribute"
      attribute: "epoch_s"
      response:
          value: 0

    - label: "Write attribute EPOCH_S Max Value"
      command: "writeAttribute"
      attribute: "epoch_s"
      arguments:
          value: 4294967295

    - label: "Read attribute EPOCH_S Max Value"
      command: "readAttribute"
      attribute: "epoch_s"
      response:
          value: 4294967295

    - label: "Write attribute EPOCH_S Min Value"
      command: "writeAttribute"
      attribute: "epoch_s"
      arguments:
          value: 0

    - label: "Read attribute EPOCH_S Min Value"
      command: "readAttribute"
      attribute: "epoch_s"
      response:
          value: 0

    # Tests for Unsupported attribute

    - label: "Read attribute UNSUPPORTED"
      command: "readAttribute"
      attribute: "unsupported"
      response:
          error: UNSUPPORTED_ATTRIBUTE

    - label: "Writeattribute UNSUPPORTED"
      command: "writeAttribute"
      attribute: "unsupported"
      arguments:
          value: 0
      response:
          error: UNSUPPORTED_ATTRIBUTE

    - label: "Send Test Command to unsupported endpoint"
      command: "Test"
      endpoint: 200
      response:
          error: UNSUPPORTED_ENDPOINT

    - label: "Send Test Command to unsupported cluster"
      command: "Test"
      endpoint: 0
      response:
          error: UNSUPPORTED_CLUSTER

    # Tests for vendor id

    - label: "Read attribute vendor_id Default Value"
      command: "readAttribute"
      attribute: "vendor_id"
      response:
          value: 0

    - label: "Write attribute vendor_id"
      command: "writeAttribute"
      attribute: "vendor_id"
      arguments:
          value: 17

    - label: "Read attribute vendor_id"
      command: "readAttribute"
      attribute: "vendor_id"
      response:
          value: 17

    - label: "Restore attribute vendor_id"
      command: "writeAttribute"
      attribute: "vendor_id"
      arguments:
          value: 0

    - label: "Send a command with a vendor_id and enum"
      command: "TestEnumsRequest"
      arguments:
          values:
              - name: "arg1"
                value: 20003
              - name: "arg2"
                value: 1
      response:
          values:
              - name: "arg1"
                value: 20003
              - name: "arg2"
                value: 1

    - label: "Send a command with a vendor_id and invalid enum"
      command: "TestEnumsRequest"
      arguments:
          values:
              - name: "arg1"
                value: 20003
              - name: "arg2"
                value: SimpleEnum.UnknownEnumValue
      response:
          # Attempting to echo back the invalid enum value should fail.
          error: FAILURE

    # Tests for Struct

    - label: "Send Test Command With Struct Argument and arg1.b is true"
      command: "TestStructArgumentRequest"
      arguments:
          values:
              - name: "arg1"
                value:
                    {
                        a: 0,
                        b: true,
                        c: 2,
                        d: "octet_string",
                        e: "char_string",
                        f: 1,
                        g: 0,
                        h: 0,
                    }
      response:
          values:
              - name: "value"
                value: true

    - label: "Send Test Command With Struct Argument and arg1.b is false"
      command: "TestStructArgumentRequest"
      arguments:
          values:
              - name: "arg1"
                value:
                    {
                        a: 0,
                        b: false,
                        c: 2,
                        d: "octet_string",
                        e: "char_string",
                        f: 1,
                        g: 0,
                        h: 0,
                    }
      response:
          values:
              - name: "value"
                value: false

    - label:
          "Send Test Command With Nested Struct Argument and arg1.c.b is true"
      command: "TestNestedStructArgumentRequest"
      arguments:
          values:
              - name: "arg1"
                value:
                    {
                        a: 0,
                        b: true,
                        c:
                            {
                                a: 0,
                                b: true,
                                c: 2,
                                d: "octet_string",
                                e: "char_string",
                                f: 1,
                                g: 0,
                                h: 0,
                            },
                    }
      response:
          values:
              - name: "value"
                value: true

    - label: "Send Test Command With Nested Struct Argument arg1.c.b is false"
      command: "TestNestedStructArgumentRequest"
      arguments:
          values:
              - name: "arg1"
                value:
                    {
                        a: 0,
                        b: true,
                        c:
                            {
                                a: 0,
                                b: false,
                                c: 2,
                                d: "octet_string",
                                e: "char_string",
                                f: 1,
                                g: 0,
                                h: 0,
                            },
                    }
      response:
          values:
              - name: "value"
                value: false

    - label:
          "Send Test Command With Nested Struct List Argument and all fields b
          of arg1.d are true"
      command: "TestNestedStructListArgumentRequest"
      arguments:
          values:
              - name: "arg1"
                value:
                    {
                        a: 0,
                        b: true,
                        c:
                            {
                                a: 0,
                                b: true,
                                c: 2,
                                d: "octet_string",
                                e: "char_string",
                                f: 1,
                                g: 0,
                                h: 0,
                            },
                        d:
                            [
                                {
                                    a: 1,
                                    b: true,
                                    c: 3,
                                    d: "nested_octet_string",
                                    e: "nested_char_string",
                                    f: 1,
                                    g: 0,
                                    h: 0,
                                },
                                {
                                    a: 2,
                                    b: true,
                                    c: 3,
                                    d: "nested_octet_string",
                                    e: "nested_char_string",
                                    f: 1,
                                    g: 0,
                                    h: 0,
                                },
                            ],
                        e: [1, 2, 3],
                        f:
                            [
                                "octet_string_1",
                                "octect_string_2",
                                "octet_string_3",
                            ],
                        g: [0, 255],
                    }
      response:
          values:
              - name: "value"
                value: true

    - label:
          "Send Test Command With Nested Struct List Argument and some fields b
          of arg1.d are false"
      command: "TestNestedStructListArgumentRequest"
      arguments:
          values:
              - name: "arg1"
                value:
                    {
                        a: 0,
                        b: true,
                        c:
                            {
                                a: 0,
                                b: true,
                                c: 2,
                                d: "octet_string",
                                e: "char_string",
                                f: 1,
                                g: 0,
                                h: 0,
                            },
                        d:
                            [
                                {
                                    a: 1,
                                    b: true,
                                    c: 3,
                                    d: "nested_octet_string",
                                    e: "nested_char_string",
                                    f: 1,
                                    g: 0,
                                    h: 0,
                                },
                                {
                                    a: 2,
                                    b: false,
                                    c: 3,
                                    d: "nested_octet_string",
                                    e: "nested_char_string",
                                    f: 1,
                                    g: 0,
                                    h: 0,
                                },
                            ],
                        e: [1, 2, 3],
                        f:
                            [
                                "octet_string_1",
                                "octect_string_2",
                                "octet_string_3",
                            ],
                        g: [0, 255],
                    }
      response:
          values:
              - name: "value"
                value: false

    - label: "Send Test Command With Struct Argument and see what we get back"
      command: "SimpleStructEchoRequest"
      arguments:
          values:
              - name: "arg1"
                value:
                    {
                        a: 17,
                        b: false,
                        c: 2,
                        d: "octet_string",
                        e: "char_string",
                        f: 1,
                        g: 0.1,
                        h: 0.1,
                    }
      response:
          values:
              - name: "arg1"
                value:
                    {
                        a: 17,
                        b: false,
                        c: 2,
                        d: "octet_string",
                        e: "char_string",
                        f: 1,
                        g: 0.1,
                        h: 0.1,
                    }

    - label: "Send MEI command in cluster"
      command: "TestDifferentVendorMeiRequest"
      arguments:
          values:
              - name: "arg1"
                value: 76
      response:
          values:
              - name: "arg1"
                value: 76

    # Tests for List

    - label: "Send Test Command With List of INT8U and none of them is set to 0"
      command: "TestListInt8UArgumentRequest"
      arguments:
          values:
              - name: "arg1"
                value: [1, 2, 3, 4, 5, 6, 7, 8, 9]
      response:
          values:
              - name: "value"
                value: true

    - label: "Send Test Command With List of INT8U and one of them is set to 0"
      command: "TestListInt8UArgumentRequest"
      arguments:
          values:
              - name: "arg1"
                value: [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
      response:
          values:
              - name: "value"
                value: false

    - label: "Send Test Command With List of INT8U and get it reversed"
      command: "TestListInt8UReverseRequest"
      arguments:
          values:
              - name: "arg1"
                value: [1, 2, 3, 4, 5, 6, 7, 8, 9]
      response:
          values:
              - name: "arg1"
                value: [9, 8, 7, 6, 5, 4, 3, 2, 1]

    - label:
          "Send Test Command With empty List of INT8U and get an empty list back"
      command: "TestListInt8UReverseRequest"
      arguments:
          values:
              - name: "arg1"
                value: []
      response:
          values:
              - name: "arg1"
                value: []

    - label:
          "Send Test Command With List of Struct Argument and arg1.b of first
          item is true"
      command: "TestListStructArgumentRequest"
      arguments:
          values:
              - name: "arg1"
                value:
                    [
                        {
                            a: 0,
                            b: true,
                            c: 2,
                            d: "first_octet_string",
                            e: "first_char_string",
                            f: 1,
                            g: 0,
                            h: 0,
                        },
                        {
                            a: 1,
                            b: true,
                            c: 3,
                            d: "second_octet_string",
                            e: "second_char_string",
                            f: 1,
                            g: 0,
                            h: 0,
                        },
                    ]
      response:
          values:
              - name: "value"
                value: true

    - label:
          "Send Test Command With List of Struct Argument and arg1.b of first
          item is false"
      command: "TestListStructArgumentRequest"
      arguments:
          values:
              - name: "arg1"
                value:
                    [
                        {
                            a: 1,
                            b: true,
                            c: 3,
                            d: "second_octet_string",
                            e: "second_char_string",
                            f: 1,
                            g: 0,
                            h: 0,
                        },
                        {
                            a: 0,
                            b: false,
                            c: 2,
                            d: "first_octet_string",
                            e: "first_char_string",
                            f: 1,
                            g: 0,
                            h: 0,
                        },
                    ]
      response:
          values:
              - name: "value"
                value: false

    - label:
          "Send Test Command With List of Nested Struct List Argument and all
          fields b of elements of arg1.d are true"
      command: "TestListNestedStructListArgumentRequest"
      arguments:
          values:
              - name: "arg1"
                value:
                    [
                        {
                            a: 0,
                            b: true,
                            c:
                                {
                                    a: 0,
                                    b: true,
                                    c: 2,
                                    d: "octet_string",
                                    e: "char_string",
                                    f: 1,
                                    g: 0,
                                    h: 0,
                                },
                            d:
                                [
                                    {
                                        a: 1,
                                        b: true,
                                        c: 3,
                                        d: "nested_octet_string",
                                        e: "nested_char_string",
                                        f: 1,
                                        g: 0,
                                        h: 0,
                                    },
                                    {
                                        a: 2,
                                        b: true,
                                        c: 3,
                                        d: "nested_octet_string",
                                        e: "nested_char_string",
                                        f: 1,
                                        g: 0,
                                        h: 0,
                                    },
                                ],
                            e: [1, 2, 3],
                            f:
                                [
                                    "octet_string_1",
                                    "octect_string_2",
                                    "octet_string_3",
                                ],
                            g: [0, 255],
                        },
                    ]
      response:
          values:
              - name: "value"
                value: true

    - label:
          "Send Test Command With Nested Struct List Argument and some fields b
          of elements of arg1.d are false"
      command: "TestListNestedStructListArgumentRequest"
      arguments:
          values:
              - name: "arg1"
                value:
                    [
                        {
                            a: 0,
                            b: true,
                            c:
                                {
                                    a: 0,
                                    b: true,
                                    c: 2,
                                    d: "octet_string",
                                    e: "char_string",
                                    f: 1,
                                    g: 0,
                                    h: 0,
                                },
                            d:
                                [
                                    {
                                        a: 1,
                                        b: true,
                                        c: 3,
                                        d: "nested_octet_string",
                                        e: "nested_char_string",
                                        f: 1,
                                        g: 0,
                                        h: 0,
                                    },
                                    {
                                        a: 2,
                                        b: false,
                                        c: 3,
                                        d: "nested_octet_string",
                                        e: "nested_char_string",
                                        f: 1,
                                        g: 0,
                                        h: 0,
                                    },
                                ],
                            e: [1, 2, 3],
                            f:
                                [
                                    "octet_string_1",
                                    "octect_string_2",
                                    "octet_string_3",
                                ],
                            g: [0, 255],
                        },
                    ]
      response:
          values:
              - name: "value"
                value: false

    - label:
          "Write attribute LIST With List of INT8U and none of them is set to 0"
      command: "writeAttribute"
      attribute: "list_int8u"
      arguments:
          value: [1, 2, 3, 4]

    - label: "Read attribute LIST With List of INT8U"
      command: "readAttribute"
      attribute: "list_int8u"
      response:
          value: [1, 2, 3, 4]

    - label: "Write attribute LIST With List of OCTET_STRING"
      command: "writeAttribute"
      attribute: "list_octet_string"
      arguments:
          value: ["Test0", "Test1", "Test2", "Test3"]

    - label: "Read attribute LIST With List of OCTET_STRING"
      command: "readAttribute"
      attribute: "list_octet_string"
      response:
          value: ["Test0", "Test1", "Test2", "Test3"]

    - label: "Write attribute LIST With List of LIST_STRUCT_OCTET_STRING"
      command: "writeAttribute"
      attribute: "list_struct_octet_string"
      arguments:
          value:
              [
                  { member1: 0, member2: "Test0" },
                  { member1: 1, member2: "Test1" },
                  { member1: 2, member2: "Test2" },
                  { member1: 3, member2: "Test3" },
              ]

    - label: "Read attribute LIST With List of LIST_STRUCT_OCTET_STRING"
      command: "readAttribute"
      attribute: "list_struct_octet_string"
      response:
          value:
              [
                  { member1: 0, member2: "Test0" },
                  { member1: 1, member2: "Test1" },
                  { member1: 2, member2: "Test2" },
                  { member1: 3, member2: "Test3" },
              ]

    # Tests for Nullables and Optionals

    - label: "Send Test Command with optional arg set."
      command: "TestNullableOptionalRequest"
      arguments:
          values:
              - name: "arg1"
                value: 5
      response:
          values:
              - name: "wasPresent"
                value: true
              - name: "wasNull"
                value: false
              - name: "value"
                value: 5
              - name: "originalValue"
                value: 5

    - label: "Send Test Command without its optional arg."
      command: "TestNullableOptionalRequest"
      response:
          values:
              - name: "wasPresent"
                value: false

    - label: "Read list of structs containing nullables and optionals"
      command: "readAttribute"
      attribute: "list_nullables_and_optionals_struct"
      response:
          # By default, just one item, with everything default-initialized
          value:
              [
                  {
                      NullableInt: null,
                      NullableString: null,
                      NullableStruct: null,
                      NullableList: null,
                  },
              ]

    - label: "Write list of structs containing nullables and optionals"
      command: "writeAttribute"
      attribute: "list_nullables_and_optionals_struct"
      arguments:
          value:
              [
                  {
                      NullableInt: null,
                      NullableString: null,
                      NullableStruct: null,
                      NullableList: [1, 2],
                  },
              ]

    - label:
          "Read list of structs containing nullables and optionals after writing"
      command: "readAttribute"
      attribute: "list_nullables_and_optionals_struct"
      response:
          value:
              [
                  {
                      NullableInt: null,
                      NullableString: null,
                      NullableStruct: null,
                      NullableList: [1, 2],
                  },
              ]

    # Nullable attributes

    # Tests for nullable Boolean attribute

    - label: "Write attribute NULLABLE_BOOLEAN null"
      command: "writeAttribute"
      attribute: "nullable_boolean"
      arguments:
          value: null

    - label: "Read attribute NULLABLE_BOOLEAN null"
      command: "readAttribute"
      attribute: "nullable_boolean"
      response:
          saveAs: booValueNull
          value: null

    - label: "Write attribute NULLABLE_BOOLEAN True"
      command: "writeAttribute"
      attribute: "nullable_boolean"
      arguments:
          value: true

    - label: "Read attribute NULLABLE_BOOLEAN True"
      command: "readAttribute"
      attribute: "nullable_boolean"
      response:
          value: true

    - label: "Read attribute NULLABLE_BOOLEAN not null"
      command: "readAttribute"
      attribute: "nullable_boolean"
      response:
          constraints:
              notValue: booValueNull

    # Tests for nullable Bitmap8 attribute

    - label: "Write attribute NULLABLE_BITMAP8 Max Value"
      command: "writeAttribute"
      attribute: "nullable_bitmap8"
      arguments:
          value: 254

    - label: "Read attribute NULLABLE_BITMAP8 Max Value"
      command: "readAttribute"
      attribute: "nullable_bitmap8"
      response:
          value: 254

    - label: "Write attribute NULLABLE_BITMAP8 Invalid Value"
      command: "writeAttribute"
      attribute: "nullable_bitmap8"
      arguments:
          value: 255
      response:
          error: CONSTRAINT_ERROR

    - label: "Read attribute NULLABLE_BITMAP8 unchanged Value"
      command: "readAttribute"
      attribute: "nullable_bitmap8"
      response:
          saveAs: nullableValue254
          value: 254

    - label: "Write attribute NULLABLE_BITMAP8 null Value"
      command: "writeAttribute"
      attribute: "nullable_bitmap8"
      arguments:
          value: null

    - label: "Read attribute NULLABLE_BITMAP8 null Value"
      command: "readAttribute"
      attribute: "nullable_bitmap8"
      response:
          value: null

    - label: "Read attribute NULLABLE_BITMAP8 not 254 Value"
      command: "readAttribute"
      attribute: "nullable_bitmap8"
      response:
          constraints:
              notValue: nullableValue254

    # Tests for nullable Bitmap16 attribute

    - label: "Write attribute NULLABLE_BITMAP16 Max Value"
      command: "writeAttribute"
      attribute: "nullable_bitmap16"
      arguments:
          value: 65534

    - label: "Read attribute NULLABLE_BITMAP16 Max Value"
      command: "readAttribute"
      attribute: "nullable_bitmap16"
      response:
          value: 65534

    - label: "Write attribute NULLABLE_BITMAP16 Invalid Value"
      command: "writeAttribute"
      attribute: "nullable_bitmap16"
      arguments:
          value: 65535
      response:
          error: CONSTRAINT_ERROR

    - label: "Read attribute NULLABLE_BITMAP16 unchanged Value"
      command: "readAttribute"
      attribute: "nullable_bitmap16"
      response:
          value: 65534

    - label: "Write attribute NULLABLE_BITMAP16 null Value"
      command: "writeAttribute"
      attribute: "nullable_bitmap16"
      arguments:
          value: null

    - label: "Read attribute NULLABLE_BITMAP16 null Value"
      command: "readAttribute"
      attribute: "nullable_bitmap16"
      response:
          value: null

    # Tests for nullable Bitmap32 attribute

    - label: "Write attribute NULLABLE_BITMAP32 Max Value"
      command: "writeAttribute"
      attribute: "nullable_bitmap32"
      arguments:
          value: 4294967294

    - label: "Read attribute NULLABLE_BITMAP32 Max Value"
      command: "readAttribute"
      attribute: "nullable_bitmap32"
      response:
          value: 4294967294

    - label: "Write attribute NULLABLE_BITMAP32 Invalid Value"
      command: "writeAttribute"
      attribute: "nullable_bitmap32"
      arguments:
          value: 4294967295
      response:
          error: CONSTRAINT_ERROR

    - label: "Read attribute NULLABLE_BITMAP32 unchanged Value"
      command: "readAttribute"
      attribute: "nullable_bitmap32"
      response:
          value: 4294967294

    - label: "Write attribute NULLABLE_BITMAP32 null Value"
      command: "writeAttribute"
      attribute: "nullable_bitmap32"
      arguments:
          value: null

    - label: "Read attribute NULLABLE_BITMAP32 null Value"
      command: "readAttribute"
      attribute: "nullable_bitmap32"
      response:
          value: null

    # Tests for nullable Bitmap64 attribute

    - label: "Write attribute NULLABLE_BITMAP64 Max Value"
      command: "writeAttribute"
      attribute: "nullable_bitmap64"
      arguments:
          value: "18446744073709551614"

    - label: "Read attribute NULLABLE_BITMAP64 Max Value"
      command: "readAttribute"
      attribute: "nullable_bitmap64"
      response:
          value: "18446744073709551614"

    - label: "Write attribute NULLABLE_BITMAP64 Invalid Value"
      command: "writeAttribute"
      attribute: "nullable_bitmap64"
      arguments:
          value: "18446744073709551615"
      response:
          error: CONSTRAINT_ERROR

    - label: "Read attribute NULLABLE_BITMAP64 unchanged Value"
      command: "readAttribute"
      attribute: "nullable_bitmap64"
      response:
          value: "18446744073709551614"

    - label: "Write attribute NULLABLE_BITMAP64 null Value"
      command: "writeAttribute"
      attribute: "nullable_bitmap64"
      arguments:
          value: null

    - label: "Read attribute NULLABLE_BITMAP64 null Value"
      command: "readAttribute"
      attribute: "nullable_bitmap64"
      response:
          value: null

    # Tests for nullable UInt8 attribute

    - label: "Write attribute NULLABLE_INT8U Min Value"
      command: "writeAttribute"
      attribute: "nullable_int8u"
      arguments:
          value: 0

    - label: "Read attribute NULLABLE_INT8U Min Value"
      command: "readAttribute"
      attribute: "nullable_int8u"
      response:
          value: 0

    - label: "Write attribute NULLABLE_INT8U Max Value"
      command: "writeAttribute"
      attribute: "nullable_int8u"
      arguments:
          value: 254

    - label: "Read attribute NULLABLE_INT8U Max Value"
      command: "readAttribute"
      attribute: "nullable_int8u"
      response:
          value: 254

    - label: "Write attribute NULLABLE_INT8U Invalid Value"
      command: "writeAttribute"
      attribute: "nullable_int8u"
      arguments:
          value: 255
      response:
          error: CONSTRAINT_ERROR

    - label: "Read attribute NULLABLE_INT8U unchanged Value"
      command: "readAttribute"
      attribute: "nullable_int8u"
      response:
          value: 254

    - label: "Read attribute NULLABLE_INT8U unchanged Value with constraint"
      command: "readAttribute"
      attribute: "nullable_int8u"
      response:
          constraints:
              notValue: null

    - label: "Write attribute NULLABLE_INT8U null Value"
      command: "writeAttribute"
      attribute: "nullable_int8u"
      arguments:
          value: null

    - label: "Read attribute NULLABLE_INT8U null Value"
      command: "readAttribute"
      attribute: "nullable_int8u"
      response:
          value: null

    - label: "Read attribute NULLABLE_INT8U null Value & range"
      command: "readAttribute"
      attribute: "nullable_int8u"
      response:
          constraints:
              minValue: 0
              maxValue: 254

    - label: "Read attribute NULLABLE_INT8U null Value & not"
      command: "readAttribute"
      attribute: "nullable_int8u"
      response:
          constraints:
              notValue: 254

    - label: "Write attribute NULLABLE_INT8U Value"
      command: "writeAttribute"
      attribute: "nullable_int8u"
      arguments:
          value: 128

    - label: "Read attribute NULLABLE_INT8U Value in range"
      command: "readAttribute"
      attribute: "nullable_int8u"
      response:
          constraints:
              minValue: 0
              maxValue: 254

    - label: "Read attribute NULLABLE_INT8U notValue OK"
      command: "readAttribute"
      attribute: "nullable_int8u"
      response:
          constraints:
              notValue: 129

    # Tests for nullable UInt16 attribute

    - label: "Write attribute NULLABLE_INT16U Min Value"
      command: "writeAttribute"
      attribute: "nullable_int16u"
      arguments:
          value: 0

    - label: "Read attribute NULLABLE_INT16U Min Value"
      command: "readAttribute"
      attribute: "nullable_int16u"
      response:
          value: 0

    - label: "Write attribute NULLABLE_INT16U Max Value"
      command: "writeAttribute"
      attribute: "nullable_int16u"
      arguments:
          value: 65534

    - label: "Read attribute NULLABLE_INT16U Max Value"
      command: "readAttribute"
      attribute: "nullable_int16u"
      response:
          value: 65534

    - label: "Write attribute NULLABLE_INT16U Invalid Value"
      command: "writeAttribute"
      attribute: "nullable_int16u"
      arguments:
          value: 65535
      response:
          error: CONSTRAINT_ERROR

    - label: "Read attribute NULLABLE_INT16U unchanged Value"
      command: "readAttribute"
      attribute: "nullable_int16u"
      response:
          value: 65534

    - label: "Write attribute NULLABLE_INT16U null Value"
      command: "writeAttribute"
      attribute: "nullable_int16u"
      arguments:
          value: null

    - label: "Read attribute NULLABLE_INT16U null Value"
      command: "readAttribute"
      attribute: "nullable_int16u"
      response:
          value: null

    - label: "Read attribute NULLABLE_INT16U null Value & range"
      command: "readAttribute"
      attribute: "nullable_int16u"
      response:
          constraints:
              minValue: 0
              maxValue: 65534

    - label: "Read attribute NULLABLE_INT16U null Value & not"
      command: "readAttribute"
      attribute: "nullable_int16u"
      response:
          constraints:
              notValue: 65534

    - label: "Write attribute NULLABLE_INT16U Value"
      command: "writeAttribute"
      attribute: "nullable_int16u"
      arguments:
          value: 32000

    - label: "Read attribute NULLABLE_INT16U Value in range"
      command: "readAttribute"
      attribute: "nullable_int16u"
      response:
          constraints:
              minValue: 0
              maxValue: 65534

    - label: "Read attribute NULLABLE_INT16U notValue OK"
      command: "readAttribute"
      attribute: "nullable_int16u"
      response:
          constraints:
              notValue: 32001

    # Tests for nullable UInt32 attribute

    - label: "Write attribute NULLABLE_INT32U Min Value"
      command: "writeAttribute"
      attribute: "nullable_int32u"
      arguments:
          value: 0

    - label: "Read attribute NULLABLE_INT32U Min Value"
      command: "readAttribute"
      attribute: "nullable_int32u"
      response:
          value: 0

    - label: "Write attribute NULLABLE_INT32U Max Value"
      command: "writeAttribute"
      attribute: "nullable_int32u"
      arguments:
          value: 4294967294

    - label: "Read attribute NULLABLE_INT32U Max Value"
      command: "readAttribute"
      attribute: "nullable_int32u"
      response:
          value: 4294967294

    - label: "Write attribute NULLABLE_INT32U Invalid Value"
      command: "writeAttribute"
      attribute: "nullable_int32u"
      arguments:
          value: 4294967295
      response:
          error: CONSTRAINT_ERROR

    - label: "Read attribute NULLABLE_INT32U unchanged Value"
      command: "readAttribute"
      attribute: "nullable_int32u"
      response:
          value: 4294967294

    - label: "Write attribute NULLABLE_INT32U null Value"
      command: "writeAttribute"
      attribute: "nullable_int32u"
      arguments:
          value: null

    - label: "Read attribute NULLABLE_INT32U null Value"
      command: "readAttribute"
      attribute: "nullable_int32u"
      response:
          value: null

    - label: "Read attribute NULLABLE_INT32U null Value & range"
      command: "readAttribute"
      attribute: "nullable_int32u"
      response:
          constraints:
              minValue: 0
              maxValue: 4294967294

    - label: "Read attribute NULLABLE_INT32U null Value & not"
      command: "readAttribute"
      attribute: "nullable_int32u"
      response:
          constraints:
              notValue: 4294967294

    - label: "Write attribute NULLABLE_INT32U Value"
      command: "writeAttribute"
      attribute: "nullable_int32u"
      arguments:
          value: 2147483647

    - label: "Read attribute NULLABLE_INT32U Value in range"
      command: "readAttribute"
      attribute: "nullable_int32u"
      response:
          constraints:
              minValue: 0
              maxValue: 4294967294

    - label: "Read attribute NULLABLE_INT32U notValue OK"
      command: "readAttribute"
      attribute: "nullable_int32u"
      response:
          constraints:
              notValue: 2147483648

    # Tests for nullable UInt64 attribute

    - label: "Write attribute NULLABLE_INT64U Min Value"
      command: "writeAttribute"
      attribute: "nullable_int64u"
      arguments:
          value: 0

    - label: "Read attribute NULLABLE_INT64U Min Value"
      command: "readAttribute"
      attribute: "nullable_int64u"
      response:
          value: 0

    - label: "Write attribute NULLABLE_INT64U Max Value"
      command: "writeAttribute"
      attribute: "nullable_int64u"
      arguments:
          value: "18446744073709551614"

    - label: "Read attribute NULLABLE_INT64U Max Value"
      command: "readAttribute"
      attribute: "nullable_int64u"
      response:
          value: "18446744073709551614"

    - label: "Write attribute NULLABLE_INT64U Invalid Value"
      command: "writeAttribute"
      attribute: "nullable_int64u"
      arguments:
          value: "18446744073709551615"
      response:
          error: CONSTRAINT_ERROR

    - label: "Read attribute NULLABLE_INT64U unchanged Value"
      command: "readAttribute"
      attribute: "nullable_int64u"
      response:
          value: "18446744073709551614"

    - label: "Write attribute NULLABLE_INT64U null Value"
      command: "writeAttribute"
      attribute: "nullable_int64u"
      arguments:
          value: null

    - label: "Read attribute NULLABLE_INT64U null Value"
      command: "readAttribute"
      attribute: "nullable_int64u"
      response:
          value: null

    - label: "Read attribute NULLABLE_INT64U null Value & range"
      command: "readAttribute"
      attribute: "nullable_int64u"
      response:
          constraints:
              minValue: 0
              maxValue: "18446744073709551614"

    - label: "Read attribute NULLABLE_INT64U null Value & not"
      command: "readAttribute"
      attribute: "nullable_int64u"
      response:
          constraints:
              notValue: "18446744073709551614"

    - label: "Write attribute NULLABLE_INT64U Value"
      command: "writeAttribute"
      attribute: "nullable_int64u"
      arguments:
          value: "18000000000000000000"

    - label: "Read attribute NULLABLE_INT64U Value in range"
      command: "readAttribute"
      attribute: "nullable_int64u"
      response:
          constraints:
              minValue: 0
              maxValue: "18446744073709551614"

    - label: "Read attribute NULLABLE_INT64U notValue OK"
      command: "readAttribute"
      attribute: "nullable_int64u"
      response:
          constraints:
              notValue: "18000000000000000001"

    # Tests for nullable Int8 attribute

    - label: "Write attribute NULLABLE_INT8S Min Value"
      command: "writeAttribute"
      attribute: "nullable_int8s"
      arguments:
          value: -127

    - label: "Read attribute NULLABLE_INT8S Min Value"
      command: "readAttribute"
      attribute: "nullable_int8s"
      response:
          value: -127

    - label: "Write attribute NULLABLE_INT8S Invalid Value"
      command: "writeAttribute"
      attribute: "nullable_int8s"
      arguments:
          value: -128
      response:
          error: CONSTRAINT_ERROR

    - label: "Read attribute NULLABLE_INT8S unchanged Value"
      command: "readAttribute"
      attribute: "nullable_int8s"
      response:
          value: -127

    - label: "Write attribute NULLABLE_INT8S null Value"
      command: "writeAttribute"
      attribute: "nullable_int8s"
      arguments:
          value: null

    - label: "Read attribute NULLABLE_INT8S null Value"
      command: "readAttribute"
      attribute: "nullable_int8s"
      response:
          value: null

    - label: "Read attribute NULLABLE_INT8S null Value & range"
      command: "readAttribute"
      attribute: "nullable_int8s"
      response:
          constraints:
              minValue: -127
              maxValue: 127

    - label: "Read attribute NULLABLE_INT8S null Value & not"
      command: "readAttribute"
      attribute: "nullable_int8s"
      response:
          constraints:
              notValue: -127

    - label: "Write attribute NULLABLE_INT8S Value"
      command: "writeAttribute"
      attribute: "nullable_int8s"
      arguments:
          value: -127

    - label: "Read attribute NULLABLE_INT8S Value in range"
      command: "readAttribute"
      attribute: "nullable_int8s"
      response:
          constraints:
              minValue: -127
              maxValue: 127

    - label: "Read attribute NULLABLE_INT8S notValue OK"
      command: "readAttribute"
      attribute: "nullable_int8s"
      response:
          constraints:
              notValue: -126

    # Tests for nullable Int16 attribute

    - label: "Write attribute NULLABLE_INT16S Min Value"
      command: "writeAttribute"
      attribute: "nullable_int16s"
      arguments:
          value: -32767

    - label: "Read attribute NULLABLE_INT16S Min Value"
      command: "readAttribute"
      attribute: "nullable_int16s"
      response:
          value: -32767

    - label: "Write attribute NULLABLE_INT16S Invalid Value"
      command: "writeAttribute"
      attribute: "nullable_int16s"
      arguments:
          value: -32768
      response:
          error: CONSTRAINT_ERROR

    - label: "Read attribute NULLABLE_INT16S unchanged Value"
      command: "readAttribute"
      attribute: "nullable_int16s"
      response:
          value: -32767

    - label: "Write attribute NULLABLE_INT16S null Value"
      command: "writeAttribute"
      attribute: "nullable_int16s"
      arguments:
          value: null

    - label: "Read attribute NULLABLE_INT16S null Value"
      command: "readAttribute"
      attribute: "nullable_int16s"
      response:
          value: null

    - label: "Read attribute NULLABLE_INT16S null Value & range"
      command: "readAttribute"
      attribute: "nullable_int16s"
      response:
          constraints:
              minValue: -32767
              maxValue: 32767

    - label: "Read attribute NULLABLE_INT16S null Value & not"
      command: "readAttribute"
      attribute: "nullable_int16s"
      response:
          constraints:
              notValue: -32767

    - label: "Write attribute NULLABLE_INT16S Value"
      command: "writeAttribute"
      attribute: "nullable_int16s"
      arguments:
          value: -32767

    - label: "Read attribute NULLABLE_INT16S Value in range"
      command: "readAttribute"
      attribute: "nullable_int16s"
      response:
          constraints:
              minValue: -32767
              maxValue: 32767

    - label: "Read attribute NULLABLE_INT16S notValue OK"
      command: "readAttribute"
      attribute: "nullable_int16s"
      response:
          constraints:
              notValue: -32766

    # Tests for Int32 attribute

    - label: "Write attribute NULLABLE_INT32S Min Value"
      command: "writeAttribute"
      attribute: "nullable_int32s"
      arguments:
          value: -2147483647

    - label: "Read attribute NULLABLE_INT32S Min Value"
      command: "readAttribute"
      attribute: "nullable_int32s"
      response:
          value: -2147483647

    - label: "Write attribute NULLABLE_INT32S Invalid Value"
      command: "writeAttribute"
      attribute: "nullable_int32s"
      arguments:
          value: -2147483648
      response:
          error: CONSTRAINT_ERROR

    - label: "Read attribute NULLABLE_INT32S unchanged Value"
      command: "readAttribute"
      attribute: "nullable_int32s"
      response:
          value: -2147483647

    - label: "Write attribute NULLABLE_INT32S null Value"
      command: "writeAttribute"
      attribute: "nullable_int32s"
      arguments:
          value: null

    - label: "Read attribute NULLABLE_INT32S null Value"
      command: "readAttribute"
      attribute: "nullable_int32s"
      response:
          value: null

    - label: "Read attribute NULLABLE_INT32S null Value & range"
      command: "readAttribute"
      attribute: "nullable_int32s"
      response:
          constraints:
              minValue: -2147483647
              maxValue: 2147483647

    - label: "Read attribute NULLABLE_INT32S null Value & not"
      command: "readAttribute"
      attribute: "nullable_int32s"
      response:
          constraints:
              notValue: -2147483647

    - label: "Write attribute NULLABLE_INT32S Value"
      command: "writeAttribute"
      attribute: "nullable_int32s"
      arguments:
          value: -2147483647

    - label: "Read attribute NULLABLE_INT32S Value in range"
      command: "readAttribute"
      attribute: "nullable_int32s"
      response:
          constraints:
              minValue: -2147483647
              maxValue: 2147483647

    - label: "Read attribute NULLABLE_INT32S notValue OK"
      command: "readAttribute"
      attribute: "nullable_int32s"
      response:
          constraints:
              notValue: -2147483646

    # Tests for Int64 attribute

    - label: "Write attribute NULLABLE_INT64S Min Value"
      command: "writeAttribute"
      attribute: "nullable_int64s"
      arguments:
          value: "-9223372036854775807"

    - label: "Read attribute NULLABLE_INT64S Min Value"
      command: "readAttribute"
      attribute: "nullable_int64s"
      response:
          value: "-9223372036854775807"

    - label: "Write attribute NULLABLE_INT64S Invalid Value"
      command: "writeAttribute"
      attribute: "nullable_int64s"
      arguments:
          # This is a nasty hack: -9223372036854775808 is not a valid way to
          # write a long long in C++, leading to warnings.  So this tries to
          # work around that.
          value: "-9223372036854775807LL - 1"
      response:
          error: CONSTRAINT_ERROR

    - label: "Read attribute NULLABLE_INT64S unchanged Value"
      command: "readAttribute"
      attribute: "nullable_int64s"
      response:
          value: "-9223372036854775807"

    - label: "Write attribute NULLABLE_INT64S null Value"
      command: "writeAttribute"
      attribute: "nullable_int64s"
      arguments:
          value: null

    - label: "Read attribute NULLABLE_INT64S null Value"
      command: "readAttribute"
      attribute: "nullable_int64s"
      response:
          value: null

    - label: "Read attribute NULLABLE_INT64S null Value & range"
      command: "readAttribute"
      attribute: "nullable_int64s"
      response:
          constraints:
              minValue: "-9223372036854775807"
              maxValue: "9223372036854775807"

    - label: "Read attribute NULLABLE_INT64S null Value & not"
      command: "readAttribute"
      attribute: "nullable_int64s"
      response:
          constraints:
              notValue: "-9223372036854775807"

    - label: "Write attribute NULLABLE_INT64S Value"
      command: "writeAttribute"
      attribute: "nullable_int64s"
      arguments:
          value: "-9223372036854775807"

    - label: "Read attribute NULLABLE_INT64S Value in range"
      command: "readAttribute"
      attribute: "nullable_int64s"
      response:
          constraints:
              minValue: "-9223372036854775807"
              maxValue: "9223372036854775807"

    - label: "Read attribute NULLABLE_INT64S notValue OK"
      command: "readAttribute"
      attribute: "nullable_int64s"
      response:
          constraints:
              notValue: "-9223372036854775806"

    # Tests for float attribute

    - label: "Write attribute NULLABLE_SINGLE medium Value"
      command: "writeAttribute"
      attribute: "nullable_float_single"
      arguments:
          value: 0.1

    - label: "Read attribute NULLABLE_SINGLE medium Value"
      command: "readAttribute"
      attribute: "nullable_float_single"
      response:
          value: 0.1

    - label: "Write attribute NULLABLE_SINGLE largest Value"
      command: "writeAttribute"
      attribute: "nullable_float_single"
      arguments:
          value: Infinity

    - label: "Read attribute NULLABLE_SINGLE largest Value"
      command: "readAttribute"
      attribute: "nullable_float_single"
      response:
          value: Infinity

    - label: "Write attribute NULLABLE_SINGLE smallest Value"
      command: "writeAttribute"
      attribute: "nullable_float_single"
      arguments:
          value: -Infinity

    - label: "Read attribute NULLABLE_SINGLE smallest Value"
      command: "readAttribute"
      attribute: "nullable_float_single"
      response:
          value: -Infinity

    - label: "Write attribute NULLABLE_SINGLE null Value"
      command: "writeAttribute"
      attribute: "nullable_float_single"
      arguments:
          value: null

    - label: "Read attribute NULLABLE_SINGLE null Value"
      command: "readAttribute"
      attribute: "nullable_float_single"
      response:
          value: null

    - label: "Write attribute NULLABLE_SINGLE 0 Value"
      command: "writeAttribute"
      attribute: "nullable_float_single"
      arguments:
          value: 0

    - label: "Read attribute NULLABLE_SINGLE 0 Value"
      command: "readAttribute"
      attribute: "nullable_float_single"
      response:
          value: 0

    # Tests for double attribute

    - label: "Write attribute NULLABLE_DOUBLE medium Value"
      command: "writeAttribute"
      attribute: "nullable_float_double"
      arguments:
          value: 0.1234567890123

    - label: "Read attribute NULLABLE_DOUBLE medium Value"
      command: "readAttribute"
      attribute: "nullable_float_double"
      response:
          value: 0.1234567890123

    - label: "Write attribute NULLABLE_DOUBLE largest Value"
      command: "writeAttribute"
      attribute: "nullable_float_double"
      arguments:
          value: Infinity

    - label: "Read attribute NULLABLE_DOUBLE largest Value"
      command: "readAttribute"
      attribute: "nullable_float_double"
      response:
          value: Infinity

    - label: "Write attribute NULLABLE_DOUBLE smallest Value"
      command: "writeAttribute"
      attribute: "nullable_float_double"
      arguments:
          value: -Infinity

    - label: "Read attribute NULLABLE_DOUBLE smallest Value"
      command: "readAttribute"
      attribute: "nullable_float_double"
      response:
          value: -Infinity

    - label: "Write attribute NULLABLE_DOUBLE null Value"
      command: "writeAttribute"
      attribute: "nullable_float_double"
      arguments:
          value: null

    - label: "Read attribute NULLABLE_DOUBLE null Value"
      command: "readAttribute"
      attribute: "nullable_float_double"
      response:
          value: null

    - label: "Write attribute NULLABLE_DOUBLE 0 Value"
      command: "writeAttribute"
      attribute: "nullable_float_double"
      arguments:
          value: 0

    - label: "Read attribute NULLABLE_DOUBLE 0 Value"
      command: "readAttribute"
      attribute: "nullable_float_double"
      response:
          value: 0

    # Tests for Enum8 attribute

    - label: "Write attribute NULLABLE_ENUM8 Min Value"
      command: "writeAttribute"
      attribute: "nullable_enum8"
      arguments:
          value: 0

    - label: "Read attribute NULLABLE_ENUM8 Min Value"
      command: "readAttribute"
      attribute: "nullable_enum8"
      response:
          value: 0

    - label: "Write attribute NULLABLE_ENUM8 Max Value"
      command: "writeAttribute"
      attribute: "nullable_enum8"
      arguments:
          value: 254

    - label: "Read attribute NULLABLE_ENUM8 Max Value"
      command: "readAttribute"
      attribute: "nullable_enum8"
      response:
          value: 254

    - label: "Write attribute NULLABLE_ENUM8 Invalid Value"
      command: "writeAttribute"
      attribute: "nullable_enum8"
      arguments:
          value: 255
      response:
          error: CONSTRAINT_ERROR

    - label: "Read attribute NULLABLE_ENUM8 unchanged Value"
      command: "readAttribute"
      attribute: "nullable_enum8"
      response:
          value: 254

    - label: "Write attribute NULLABLE_ENUM8 null Value"
      command: "writeAttribute"
      attribute: "nullable_enum8"
      arguments:
          value: null

    - label: "Read attribute NULLABLE_ENUM8 null Value"
      command: "readAttribute"
      attribute: "nullable_enum8"
      response:
          value: null

    # Tests for Enum16 attribute

    - label: "Write attribute NULLABLE_ENUM16 Min Value"
      command: "writeAttribute"
      attribute: "nullable_enum16"
      arguments:
          value: 0

    - label: "Read attribute NULLABLE_ENUM16 Min Value"
      command: "readAttribute"
      attribute: "nullable_enum16"
      response:
          value: 0

    - label: "Write attribute NULLABLE_ENUM16 Max Value"
      command: "writeAttribute"
      attribute: "nullable_enum16"
      arguments:
          value: 65534

    - label: "Read attribute NULLABLE_ENUM16 Max Value"
      command: "readAttribute"
      attribute: "nullable_enum16"
      response:
          value: 65534

    - label: "Write attribute NULLABLE_ENUM16 Invalid Value"
      command: "writeAttribute"
      attribute: "nullable_enum16"
      arguments:
          value: 65535
      response:
          error: CONSTRAINT_ERROR

    - label: "Read attribute NULLABLE_ENUM16 unchanged Value"
      command: "readAttribute"
      attribute: "nullable_enum16"
      response:
          value: 65534

    - label: "Write attribute NULLABLE_ENUM16 null Value"
      command: "writeAttribute"
      attribute: "nullable_enum16"
      arguments:
          value: null

    - label: "Read attribute NULLABLE_ENUM16 null Value"
      command: "readAttribute"
      attribute: "nullable_enum16"
      response:
          value: null

    # Tests for named enum attribute

    - label: "Write attribute NULLABLE_SIMPLE_ENUM Min Value"
      command: "writeAttribute"
      attribute: "nullable_enum_attr"
      arguments:
          value: 0

    - label: "Read attribute NULLABLE_SIMPLE_ENUM Min Value"
      command: "readAttribute"
      attribute: "nullable_enum_attr"
      response:
          value: 0

    - label: "Write attribute NULLABLE_SIMPLE_ENUM Max Value"
      command: "writeAttribute"
      attribute: "nullable_enum_attr"
      arguments:
          value: 3

    - label: "Read attribute NULLABLE_SIMPLE_ENUM Max Value"
      command: "readAttribute"
      attribute: "nullable_enum_attr"
      response:
          value: 3

    - label: "Write attribute NULLABLE_SIMPLE_ENUM Invalid Value"
      command: "writeAttribute"
      attribute: "nullable_enum_attr"
      arguments:
          value: SimpleEnum.UnknownEnumValue(255)
      response:
          error: CONSTRAINT_ERROR

    - label: "Read attribute NULLABLE_SIMPLE_ENUM unchanged Value"
      command: "readAttribute"
      attribute: "nullable_enum_attr"
      response:
          saveAs: nullableEnumAttr3
          value: 3

    - label: "Write attribute NULLABLE_SIMPLE_ENUM null Value"
      command: "writeAttribute"
      attribute: "nullable_enum_attr"
      arguments:
          value: null

    - label: "Read attribute NULLABLE_SIMPLE_ENUM null Value"
      command: "readAttribute"
      attribute: "nullable_enum_attr"
      response:
          value: null

    - label: "Read attribute NULLABLE_SIMPLE_ENUM not 3 Value"
      command: "readAttribute"
      attribute: "nullable_enum_attr"
      response:
          constraints:
              notValue: nullableEnumAttr3

    # Tests for Octet String attribute

    - label: "Read attribute NULLABLE_OCTET_STRING Default Value"
      command: "readAttribute"
      attribute: "nullable_octet_string"
      response:
          value: ""

    - label: "Write attribute NULLABLE_OCTET_STRING"
      command: "writeAttribute"
      attribute: "nullable_octet_string"
      arguments:
          value: "TestValue"

    - label: "Read attribute NULLABLE_OCTET_STRING"
      command: "readAttribute"
      attribute: "nullable_octet_string"
      response:
          saveAs: nullableOctetStrTestValue
          value: "TestValue"

    - label: "Write attribute NULLABLE_OCTET_STRING"
      command: "writeAttribute"
      attribute: "nullable_octet_string"
      arguments:
          value: null

    - label: "Read attribute NULLABLE_OCTET_STRING"
      command: "readAttribute"
      attribute: "nullable_octet_string"
      response:
          value: null

    - label: "Write attribute NULLABLE_OCTET_STRING"
      command: "writeAttribute"
      attribute: "nullable_octet_string"
      arguments:
          value: ""

    - label: "Read attribute NULLABLE_OCTET_STRING"
      command: "readAttribute"
      attribute: "nullable_octet_string"
      response:
          value: ""

    - label: "Read attribute NULLABLE_OCTET_STRING not TestValue"
      command: "readAttribute"
      attribute: "nullable_octet_string"
      response:
          constraints:
              notValue: nullableOctetStrTestValue

    # Tests for Nullable Char String attribute

    - label: "Read attribute NULLABLE_CHAR_STRING Default Value"
      command: "readAttribute"
      attribute: "nullable_char_string"
      response:
          value: ""

    - label: "Write attribute NULLABLE_CHAR_STRING"
      command: "writeAttribute"
      attribute: "nullable_char_string"
      arguments:
          value: "☉T☉"

    - label: "Read attribute NULLABLE_CHAR_STRING"
      command: "readAttribute"
      attribute: "nullable_char_string"
      response:
          saveAs: nullableCharStringSave
          value: "☉T☉"

    - label: "Read attribute NULLABLE_CHAR_STRING"
      command: "readAttribute"
      attribute: "nullable_char_string"
      response:
          value: nullableCharStringSave

    - label: "Write attribute NULLABLE_CHAR_STRING - Value too long"
      command: "writeAttribute"
      attribute: "nullable_char_string"
      arguments:
          value: null

    - label: "Read attribute NULLABLE_CHAR_STRING"
      command: "readAttribute"
      attribute: "nullable_char_string"
      response:
          value: null

    - label: "Write attribute NULLABLE_CHAR_STRING - Empty"
      command: "writeAttribute"
      attribute: "nullable_char_string"
      arguments:
          value: ""

    - label: "Read attribute NULLABLE_CHAR_STRING"
      command: "readAttribute"
      attribute: "nullable_char_string"
      response:
          value: ""

    - label: "Read attribute NULLABLE_CHAR_STRING not ☉T☉"
      command: "readAttribute"
      attribute: "nullable_char_string"
      response:
          constraints:
              notValue: nullableCharStringSave

    - label: "Read attribute from nonexistent endpoint."
      endpoint: 200
      command: "readAttribute"
      attribute: "list_int8u"
      response:
          error: UNSUPPORTED_ENDPOINT

    - label: "Read attribute from nonexistent cluster."
      endpoint: 0
      command: "readAttribute"
      attribute: "list_int8u"
      response:
          error: UNSUPPORTED_CLUSTER

    - label: "Write attribute NULLABLE_CHAR_STRING - Value starting with null"
      command: "writeAttribute"
      attribute: "nullable_char_string"
      arguments:
          value: "nulla"

    - label: "Read attribute NULLABLE_CHAR_STRING"
      command: "readAttribute"
      attribute: "nullable_char_string"
      response:
          value: "nulla"

    # Tests for command with optional arguments
    - label:
          "Send a command that takes an optional parameter but do not set it."
      command: "TestSimpleOptionalArgumentRequest"
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Send a command that takes an optional parameter but do not set it."
      command: "TestSimpleOptionalArgumentRequest"
      arguments:
          values:
              - name: "arg1"
                value: 1

    # Tests for subscription to a complex attribute
    - label: "Subscribe to list attribute"
      command: "subscribeAttribute"
      attribute: "list_int8u"
      minInterval: 2
      maxInterval: 5
      response:
          value: [1, 2, 3, 4]

    - label: "Write subscribed-to list attribute"
      command: "writeAttribute"
      attribute: "list_int8u"
      arguments:
          value: [5, 6, 7, 8]

    - label: "Check for list attribute report"
      command: "waitForReport"
      attribute: "list_int8u"
      response:
          value: [5, 6, 7, 8]

    # Tests for range-checking on the server.
    - label: "Read range-restricted unsigned 8-bit integer"
      command: "readAttribute"
      attribute: "range_restricted_int8u"
      response:
          value: 70 # That's the default.

    - label: "Write min value to a range-restricted unsigned 8-bit integer"
      command: "writeAttribute"
      attribute: "range_restricted_int8u"
      arguments:
          value: 0
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Write just-below-range value to a range-restricted unsigned 8-bit
          integer"
      command: "writeAttribute"
      attribute: "range_restricted_int8u"
      arguments:
          value: 19
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Write just-above-range value to a range-restricted unsigned 8-bit
          integer"
      command: "writeAttribute"
      attribute: "range_restricted_int8u"
      arguments:
          value: 101
      response:
          error: CONSTRAINT_ERROR

    - label: "Write max value to a range-restricted unsigned 8-bit integer"
      command: "writeAttribute"
      attribute: "range_restricted_int8u"
      arguments:
          value: 255
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Verify range-restricted unsigned 8-bit integer value has not changed"
      command: "readAttribute"
      attribute: "range_restricted_int8u"
      response:
          value: 70

    - label:
          "Write min valid value to a range-restricted unsigned 8-bit integer"
      command: "writeAttribute"
      attribute: "range_restricted_int8u"
      arguments:
          value: 20

    - label:
          "Verify range-restricted unsigned 8-bit integer value is at min valid"
      command: "readAttribute"
      attribute: "range_restricted_int8u"
      response:
          value: 20

    - label:
          "Write max valid value to a range-restricted unsigned 8-bit integer"
      command: "writeAttribute"
      attribute: "range_restricted_int8u"
      arguments:
          value: 100

    - label:
          "Verify range-restricted unsigned 8-bit integer value is at max valid"
      command: "readAttribute"
      attribute: "range_restricted_int8u"
      response:
          value: 100

    - label:
          "Write middle valid value to a range-restricted unsigned 8-bit integer"
      command: "writeAttribute"
      attribute: "range_restricted_int8u"
      arguments:
          value: 50

    - label:
          "Verify range-restricted unsigned 8-bit integer value is at mid valid"
      command: "readAttribute"
      attribute: "range_restricted_int8u"
      response:
          value: 50

    - label: "Read range-restricted unsigned 16-bit integer"
      command: "readAttribute"
      attribute: "range_restricted_int16u"
      response:
          value: 200 # That's the default.

    - label: "Write min value to a range-restricted unsigned 16-bit integer"
      command: "writeAttribute"
      attribute: "range_restricted_int16u"
      arguments:
          value: 0
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Write just-below-range value to a range-restricted unsigned 16-bit
          integer"
      command: "writeAttribute"
      attribute: "range_restricted_int16u"
      arguments:
          value: 99
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Write just-above-range value to a range-restricted unsigned 16-bit
          integer"
      command: "writeAttribute"
      attribute: "range_restricted_int16u"
      arguments:
          value: 1001
      response:
          error: CONSTRAINT_ERROR

    - label: "Write max value to a range-restricted unsigned 16-bit integer"
      command: "writeAttribute"
      attribute: "range_restricted_int16u"
      arguments:
          value: 65535
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Verify range-restricted unsigned 16-bit integer value has not changed"
      command: "readAttribute"
      attribute: "range_restricted_int16u"
      response:
          value: 200

    - label:
          "Write min valid value to a range-restricted unsigned 16-bit integer"
      command: "writeAttribute"
      attribute: "range_restricted_int16u"
      arguments:
          value: 100

    - label:
          "Verify range-restricted unsigned 16-bit integer value is at min valid"
      command: "readAttribute"
      attribute: "range_restricted_int16u"
      response:
          value: 100

    - label:
          "Write max valid value to a range-restricted unsigned 16-bit integer"
      command: "writeAttribute"
      attribute: "range_restricted_int16u"
      arguments:
          value: 1000

    - label:
          "Verify range-restricted unsigned 16-bit integer value is at max valid"
      command: "readAttribute"
      attribute: "range_restricted_int16u"
      response:
          value: 1000

    - label:
          "Write middle valid value to a range-restricted unsigned 16-bit
          integer"
      command: "writeAttribute"
      attribute: "range_restricted_int16u"
      arguments:
          value: 500

    - label:
          "Verify range-restricted unsigned 16-bit integer value is at mid valid"
      command: "readAttribute"
      attribute: "range_restricted_int16u"
      response:
          value: 500

    - label: "Read range-restricted signed 8-bit integer"
      command: "readAttribute"
      attribute: "range_restricted_int8s"
      response:
          value: -20

    - label: "Write min value to a range-restricted signed 8-bit integer"
      command: "writeAttribute"
      attribute: "range_restricted_int8s"
      arguments:
          value: -128
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Write just-below-range value to a range-restricted signed 8-bit
          integer"
      command: "writeAttribute"
      attribute: "range_restricted_int8s"
      arguments:
          value: -41
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Write just-above-range value to a range-restricted signed 8-bit
          integer"
      command: "writeAttribute"
      attribute: "range_restricted_int8s"
      arguments:
          value: 51
      response:
          error: CONSTRAINT_ERROR

    - label: "Write max value to a range-restricted signed 8-bit integer"
      command: "writeAttribute"
      attribute: "range_restricted_int8s"
      arguments:
          value: 127
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Verify range-restricted signed 8-bit integer value has not changed"
      command: "readAttribute"
      attribute: "range_restricted_int8s"
      response:
          value: -20

    - label: "Write min valid value to a range-restricted signed 8-bit integer"
      command: "writeAttribute"
      attribute: "range_restricted_int8s"
      arguments:
          value: -40

    - label:
          "Verify range-restricted signed 8-bit integer value is at min valid"
      command: "readAttribute"
      attribute: "range_restricted_int8s"
      response:
          value: -40

    - label: "Write max valid value to a range-restricted signed 8-bit integer"
      command: "writeAttribute"
      attribute: "range_restricted_int8s"
      arguments:
          value: 50

    - label:
          "Verify range-restricted signed 8-bit integer value is at max valid"
      command: "readAttribute"
      attribute: "range_restricted_int8s"
      response:
          value: 50

    - label:
          "Write middle valid value to a range-restricted signed 8-bit integer"
      command: "writeAttribute"
      attribute: "range_restricted_int8s"
      arguments:
          value: 6

    - label:
          "Verify range-restricted signed 8-bit integer value is at mid valid"
      command: "readAttribute"
      attribute: "range_restricted_int8s"
      response:
          value: 6

    - label: "Read range-restricted signed 16-bit integer"
      command: "readAttribute"
      attribute: "range_restricted_int16s"
      response:
          value: -100

    - label: "Write min value to a range-restricted signed 16-bit integer"
      command: "writeAttribute"
      attribute: "range_restricted_int16s"
      arguments:
          value: -32768
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Write just-below-range value to a range-restricted signed 16-bit
          integer"
      command: "writeAttribute"
      attribute: "range_restricted_int16s"
      arguments:
          value: -151
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Write just-above-range value to a range-restricted signed 16-bit
          integer"
      command: "writeAttribute"
      attribute: "range_restricted_int16s"
      arguments:
          value: 201
      response:
          error: CONSTRAINT_ERROR

    - label: "Write max value to a range-restricted signed 16-bit integer"
      command: "writeAttribute"
      attribute: "range_restricted_int16s"
      arguments:
          value: 32767
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Verify range-restricted signed 16-bit integer value has not changed"
      command: "readAttribute"
      attribute: "range_restricted_int16s"
      response:
          value: -100

    - label: "Write min valid value to a range-restricted signed 16-bit integer"
      command: "writeAttribute"
      attribute: "range_restricted_int16s"
      arguments:
          value: -150

    - label:
          "Verify range-restricted signed 16-bit integer value is at min valid"
      command: "readAttribute"
      attribute: "range_restricted_int16s"
      response:
          value: -150

    - label: "Write max valid value to a range-restricted signed 16-bit integer"
      command: "writeAttribute"
      attribute: "range_restricted_int16s"
      arguments:
          value: 200

    - label:
          "Verify range-restricted signed 16-bit integer value is at max valid"
      command: "readAttribute"
      attribute: "range_restricted_int16s"
      response:
          value: 200

    - label:
          "Write middle valid value to a range-restricted signed 16-bit integer"
      command: "writeAttribute"
      attribute: "range_restricted_int16s"
      arguments:
          value: 7

    - label:
          "Verify range-restricted signed 16-bit integer value is at mid valid"
      command: "readAttribute"
      attribute: "range_restricted_int16s"
      response:
          value: 7

    # Tests for range-checking for nullable attributes on the server.
    - label: "Read nullable range-restricted unsigned 8-bit integer"
      command: "readAttribute"
      attribute: "nullable_range_restricted_int8u"
      response:
          value: 70 # That's the default.

    - label:
          "Write min value to a nullable range-restricted unsigned 8-bit integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int8u"
      arguments:
          value: 0
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Write just-below-range value to a nullable range-restricted unsigned
          8-bit integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int8u"
      arguments:
          value: 19
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Write just-above-range value to a nullable range-restricted unsigned
          8-bit integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int8u"
      arguments:
          value: 101
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Write max value to a nullable range-restricted unsigned 8-bit integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int8u"
      arguments:
          value: 254
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Verify nullable range-restricted unsigned 8-bit integer value has not
          changed"
      command: "readAttribute"
      attribute: "nullable_range_restricted_int8u"
      response:
          value: 70

    - label:
          "Write min valid value to a nullable range-restricted unsigned 8-bit
          integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int8u"
      arguments:
          value: 20

    - label:
          "Verify nullable range-restricted unsigned 8-bit integer value is at
          min valid"
      command: "readAttribute"
      attribute: "nullable_range_restricted_int8u"
      response:
          value: 20

    - label:
          "Write max valid value to a nullable range-restricted unsigned 8-bit
          integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int8u"
      arguments:
          value: 100

    - label:
          "Verify nullable range-restricted unsigned 8-bit integer value is at
          max valid"
      command: "readAttribute"
      attribute: "nullable_range_restricted_int8u"
      response:
          value: 100

    - label:
          "Write middle valid value to a nullable range-restricted unsigned
          8-bit integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int8u"
      arguments:
          value: 50

    - label:
          "Verify nullable range-restricted unsigned 8-bit integer value is at
          mid valid"
      command: "readAttribute"
      attribute: "nullable_range_restricted_int8u"
      response:
          value: 50

    - label:
          "Write null value to a nullable range-restricted unsigned 8-bit
          integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int8u"
      arguments:
          value: null

    - label:
          "Verify nullable range-restricted unsigned 8-bit integer value is null"
      command: "readAttribute"
      attribute: "nullable_range_restricted_int8u"
      response:
          value: null

    - label: "Read nullable range-restricted unsigned 16-bit integer"
      command: "readAttribute"
      attribute: "nullable_range_restricted_int16u"
      response:
          value: 200 # That's the default.

    - label:
          "Write min value to a nullable range-restricted unsigned 16-bit
          integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int16u"
      arguments:
          value: 0
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Write just-below-range value to a nullable range-restricted unsigned
          16-bit integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int16u"
      arguments:
          value: 99
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Write just-above-range value to a nullable range-restricted unsigned
          16-bit integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int16u"
      arguments:
          value: 1001
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Write max value to a nullable range-restricted unsigned 16-bit
          integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int16u"
      arguments:
          value: 65534
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Verify nullable range-restricted unsigned 16-bit integer value has
          not changed"
      command: "readAttribute"
      attribute: "nullable_range_restricted_int16u"
      response:
          value: 200

    - label:
          "Write min valid value to a nullable range-restricted unsigned 16-bit
          integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int16u"
      arguments:
          value: 100

    - label:
          "Verify nullable range-restricted unsigned 16-bit integer value is at
          min valid"
      command: "readAttribute"
      attribute: "nullable_range_restricted_int16u"
      response:
          value: 100

    - label:
          "Write max valid value to a nullable range-restricted unsigned 16-bit
          integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int16u"
      arguments:
          value: 1000

    - label:
          "Verify nullable range-restricted unsigned 16-bit integer value is at
          max valid"
      command: "readAttribute"
      attribute: "nullable_range_restricted_int16u"
      response:
          value: 1000

    - label:
          "Write middle valid value to a nullable range-restricted unsigned
          16-bit integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int16u"
      arguments:
          value: 500

    - label:
          "Verify nullable range-restricted unsigned 16-bit integer value is at
          mid valid"
      command: "readAttribute"
      attribute: "nullable_range_restricted_int16u"
      response:
          value: 500

    - label:
          "Write null value to a nullable range-restricted unsigned 16-bit
          integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int16u"
      arguments:
          value: null

    - label:
          "Verify nullable range-restricted unsigned 16-bit integer value is
          null"
      command: "readAttribute"
      attribute: "nullable_range_restricted_int16u"
      response:
          value: null

    - label: "Read nullable range-restricted signed 8-bit integer"
      command: "readAttribute"
      attribute: "nullable_range_restricted_int8s"
      response:
          value: -20

    - label:
          "Write min value to a nullable range-restricted signed 8-bit integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int8s"
      arguments:
          value: -127
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Write just-below-range value to a nullable range-restricted signed
          8-bit integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int8s"
      arguments:
          value: -41
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Write just-above-range value to a nullable range-restricted signed
          8-bit integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int8s"
      arguments:
          value: 51
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Write max value to a nullable range-restricted signed 8-bit integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int8s"
      arguments:
          value: 127
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Verify nullable range-restricted signed 8-bit integer value has not
          changed"
      command: "readAttribute"
      attribute: "nullable_range_restricted_int8s"
      response:
          value: -20

    - label:
          "Write min valid value to a nullable range-restricted signed 8-bit
          integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int8s"
      arguments:
          value: -40

    - label:
          "Verify nullable range-restricted signed 8-bit integer value is at min
          valid"
      command: "readAttribute"
      attribute: "nullable_range_restricted_int8s"
      response:
          value: -40

    - label:
          "Write max valid value to a nullable range-restricted signed 8-bit
          integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int8s"
      arguments:
          value: 50

    - label:
          "Verify nullable range-restricted signed 8-bit integer value is at max
          valid"
      command: "readAttribute"
      attribute: "nullable_range_restricted_int8s"
      response:
          value: 50

    - label:
          "Write middle valid value to a nullable range-restricted signed 8-bit
          integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int8s"
      arguments:
          value: 6

    - label:
          "Verify nullable range-restricted signed 8-bit integer value is at mid
          valid"
      command: "readAttribute"
      attribute: "nullable_range_restricted_int8s"
      response:
          value: 6

    - label:
          "Write null value to a nullable range-restricted signed 8-bit integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int8s"
      arguments:
          value: null

    - label:
          "Verify nullable range-restricted signed 8-bit integer value is at
          null"
      command: "readAttribute"
      attribute: "nullable_range_restricted_int8s"
      response:
          value: null

    - label: "Read nullable range-restricted signed 16-bit integer"
      command: "readAttribute"
      attribute: "nullable_range_restricted_int16s"
      response:
          value: -100

    - label:
          "Write min value to a nullable range-restricted signed 16-bit integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int16s"
      arguments:
          value: -32767
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Write just-below-range value to a nullable range-restricted signed
          16-bit integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int16s"
      arguments:
          value: -151
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Write just-above-range value to a nullable range-restricted signed
          16-bit integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int16s"
      arguments:
          value: 201
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Write max value to a nullable range-restricted signed 16-bit integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int16s"
      arguments:
          value: 32767
      response:
          error: CONSTRAINT_ERROR

    - label:
          "Verify nullable range-restricted signed 16-bit integer value has not
          changed"
      command: "readAttribute"
      attribute: "nullable_range_restricted_int16s"
      response:
          value: -100

    - label:
          "Write min valid value to a nullable range-restricted signed 16-bit
          integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int16s"
      arguments:
          value: -150

    - label:
          "Verify nullable range-restricted signed 16-bit integer value is at
          min valid"
      command: "readAttribute"
      attribute: "nullable_range_restricted_int16s"
      response:
          value: -150

    - label:
          "Write max valid value to a nullable range-restricted signed 16-bit
          integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int16s"
      arguments:
          value: 200

    - label:
          "Verify nullable range-restricted signed 16-bit integer value is at
          max valid"
      command: "readAttribute"
      attribute: "nullable_range_restricted_int16s"
      response:
          value: 200

    - label:
          "Write middle valid value to a nullable range-restricted signed 16-bit
          integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int16s"
      arguments:
          value: 7

    - label:
          "Verify nullable range-restricted signed 16-bit integer value is at
          mid valid"
      command: "readAttribute"
      attribute: "nullable_range_restricted_int16s"
      response:
          value: 7

    - label:
          "Write null value to a nullable range-restricted signed 16-bit integer"
      command: "writeAttribute"
      attribute: "nullable_range_restricted_int16s"
      arguments:
          value: null

    - label:
          "Verify nullable range-restricted signed 16-bit integer value is null"
      command: "readAttribute"
      attribute: "nullable_range_restricted_int16s"
      response:
          value: null

    - label: "Write attribute that returns general status on write"
      command: "writeAttribute"
      attribute: "general_error_boolean"
      arguments:
          value: false
      response:
          error: INVALID_DATA_TYPE

    - label: "Write attribute that returns cluster-specific status on write"
      command: "writeAttribute"
      attribute: "cluster_error_boolean"
      arguments:
          value: false
      response:
          # TODO: We don't have a way to represent cluster-specific status
          # here yet.
          error: FAILURE

    - label: "Read attribute that returns general status on read"
      command: "readAttribute"
      attribute: "general_error_boolean"
      response:
          error: INVALID_DATA_TYPE

    - label: "read attribute that returns cluster-specific status on read"
      command: "readAttribute"
      attribute: "cluster_error_boolean"
      response:
          # TODO: We don't have a way to represent cluster-specific status
          # here yet.
          error: FAILURE

    - label: "Write different vendor MEI attribute"
      command: "writeAttribute"
      attribute: "mei_int8u"
      arguments:
          value: 201

    - label: "Verify different vendor MEI attribute"
      command: "readAttribute"
      attribute: "mei_int8u"
      response:
          value: 201

    - label: "Validate AcceptedCommandList attribute"
      command: "readAttribute"
      attribute: "AcceptedCommandList"
      response:
          value:
              [
                  0,
                  1,
                  2,
                  4,
                  7,
                  8,
                  9,
                  10,
                  11,
                  12,
                  13,
                  14,
                  15,
                  17,
                  18,
                  19,
                  20,
                  21,
                  22,
                  23,
                  24,
                  25,
                  4294049962,
              ]

    - label: "Validate GeneratedCommandList attribute"
      command: "readAttribute"
      attribute: "GeneratedCommandList"
      response:
          value: [0, 1, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 4294049979]

    - label: "Validate presence of MEI attribute"
      command: "readAttribute"
      attribute: "AttributeList"
      response:
          constraints:
              contains: [4294070017]

    # Struct-typed attribute
    - label: "Write struct-typed attribute"
      command: "writeAttribute"
      attribute: "struct_attr"
      arguments:
          value:
              {
                  a: 5,
                  b: true,
                  c: 2,
                  d: "abc",
                  e: "",
                  f: 17,
                  g: 1.5,
                  h: 3.14159265358979,
              }

    - label: "Read struct-typed attribute"
      command: "readAttribute"
      attribute: "struct_attr"
      response:
          value:
              {
                  a: 5,
                  b: true,
                  c: 2,
                  d: "abc",
                  e: "",
                  f: 17,
                  g: 1.5,
                  h: 3.14159265358979,
              }

    # Globals testing
    - label: "Write global-struct-typed attribute"
      command: "writeAttribute"
      attribute: "global_struct"
      arguments:
          value:
              {
                  Name: "",
                  MyBitmap: 0x02,
                  MyEnum: TestGlobalEnum.SomeOtherValue,
              }

    - label: "Read global-struct-typed attribute"
      command: "readAttribute"
      attribute: "global_struct"
      response:
          value: {
                  # Purposefully using non-symbolic values to make sure things work right.
                  Name: "",
                  MyBitmap: 0x02,
                  MyEnum: 1,
              }

    - label: "Write nullable global-struct-typed attribute"
      command: "writeAttribute"
      attribute: "nullable_global_struct"
      arguments:
          value: { Name: "", MyBitmap: 0x01, MyEnum: TestGlobalEnum.SomeValue }

    - label: "Read nullable global-struct-typed attribute"
      command: "readAttribute"
      attribute: "nullable_global_struct"
      response:
          value: { Name: "", MyBitmap: 0x01, MyEnum: 0 }

    - label: "Write nullable global-struct-typed attribute as null"
      command: "writeAttribute"
      attribute: "nullable_global_struct"
      arguments:
          value: null

    - label: "Read nullable global-struct-typed attribute a second time"
      command: "readAttribute"
      attribute: "nullable_global_struct"
      response:
          value: null

    - label: "Send a command with global types"
      command: "GlobalEchoRequest"
      arguments:
          values:
              - name: "field1"
                value:
                    {
                        Name: "",
                        MyBitmap: 0x02,
                        MyEnum: TestGlobalEnum.FinalValue,
                    }
              - name: "field2"
                value: TestGlobalEnum.SomeOtherValue
      response:
          values:
              - name: "field1"
                value:
                    {
                        Name: "",
                        MyBitmap: 0x02,
                        MyEnum: TestGlobalEnum.FinalValue,
                    }
              - name: "field2"
                value: TestGlobalEnum.SomeOtherValue
