{{#if isOptional}}
  {{! This just means we expect a non-nil value.  Go ahead and check the value,
      stripping the optionality off. }}
  {{>check_test_value actual=actual expected=expected cluster=cluster isOptional=false}}
{{else if isNullable}}
  {{#if (isLiteralNull expected)}}
    VerifyOrReturn(CheckValueNull("{{label}}", {{actual}}));
  {{else}}
    {{#if (chip_tests_variables_has expected)}}
      {{! Expected value is also a nullable. }}
      if ({{expected}} == nil) {
        VerifyOrReturn(CheckValueNull("{{label}}", {{actual}}));
      } else {
    {{/if}}
    VerifyOrReturn(CheckValueNonNull("{{label}}", {{actual}}));
    {{>check_test_value actual=actual expected=expected cluster=cluster isNullable=false}}
    {{#if (chip_tests_variables_has expected)}}
    }
    {{/if}}
  {{/if}}
{{else if isArray}}
    VerifyOrReturn(CheckValue("{{label}}", [{{actual}} count], static_cast<uint32_t>({{expected.length}})));
    {{#each expected}}
      {{>check_test_value actual=(concat ../actual "[" @index "]") expected=this cluster=../cluster isArray=false type=../type parent=../parent}}
    {{/each}}
{{else}}
  {{#if_is_struct type}}
    {{! Iterate over the actual types in the struct, so we pick up the right
        type/optionality/nullability information for them for our recursive
        call. }}
    {{#zcl_struct_items_by_struct_and_cluster_name type cluster}}
      {{#if (hasProperty ../expected label)}}
        {{>check_test_value actual=(concat "((MTR" (asUpperCamelCase ../cluster) "Cluster" (asUpperCamelCase ../type) " *)" ../actual ")." (asStructPropertyName label)) expected=(lookup ../expected label) cluster=../cluster}}
      {{/if}}
    {{/zcl_struct_items_by_struct_and_cluster_name}}
    {{! Maybe we should add a check for properties in the expected object (other
        than "global") that are not present in the struct ? }}
  {{else}}
    VerifyOrReturn(CheckValue{{#if (isString type)}}AsString{{/if}}("{{label}}", {{actual}},
      {{~#if (chip_tests_variables_has expected)}}{{expected}}
      {{~else if (chip_tests_config_has expected)}}
        m{{asUpperCamelCase expected}}.HasValue() ?
        {{#if (isCharString type)}}
          [[NSString alloc] initWithBytes:m{{asUpperCamelCase expected}}.Value().data() length:m{{asUpperCamelCase expected}}.Value().size() encoding:NSUTF8StringEncoding] : @"{{chip_tests_config_get_default_value expected}}"
        {{else if (isOctetString type)}}
          [NSData dataWithBytes:m{{asUpperCamelCase expected}}.Value().data() length:m{{asUpperCamelCase expected}}.Value().size()] : {{> octetStringValue value=(chip_tests_config_get_default_value expected)}}
        {{else}}
          m{{asUpperCamelCase expected}}.Value() : {{asTypedExpressionFromObjectiveC (chip_tests_config_get_default_value expected) type}}
        {{/if}}
      {{~else if (isOctetString type)}}
        {{> octetStringValue value=expected}}
      {{~else if (isCharString type)}}@"{{expected}}"
      {{~else}}{{asTypedExpressionFromObjectiveC expected type}}
      {{~/if}}));
  {{/if_is_struct}}
{{/if}}
