{{#if isOptional}}
  {{! Just go ahead and assign to the value, stripping the optionality bit off.  }}
  {{>test_value target=target definedValue=definedValue cluster=cluster isOptional=false depth=(incrementDepth depth)}}
{{else if isNullable}}
  {{#if (isLiteralNull definedValue)}}
    {{target}} = nil;
  {{else}}
    {{>test_value target=target definedValue=definedValue cluster=cluster isNullable=false depth=(incrementDepth depth)}}
  {{/if}}
{{else if isArray}}
  {{ensureIsArray definedValue~}}
  {
    NSMutableArray * temp_{{depth}} = [[NSMutableArray alloc] init];
    {{#each definedValue}}
      {{>test_value target=(concat "temp_" ../depth "[" @index "]") definedValue=this cluster=../cluster depth=(incrementDepth ../depth) type=../type isArray=false parent=../parent}}
    {{/each}}
    {{target}} = temp_{{depth}};
  }
{{else}}
  {{#if_is_struct type}}
    {{target}} = [[MTR{{asUpperCamelCase cluster}}Cluster{{asUpperCamelCase type}} alloc] init];
    {{#zcl_struct_items_by_struct_and_cluster_name type cluster}}
      {{#if_include_struct_item_value ../definedValue name}}
        {{! target may be some place where we lost type information (e.g. an
            id), so add explicit cast when trying to assign to our
            properties. }}
        {{>test_value target=(concat "((MTR" (asUpperCamelCase ../cluster) "Cluster" (asUpperCamelCase ../type) " *)" ../target ")." (asStructPropertyName label)) definedValue=(lookup ../definedValue name) cluster=../cluster depth=(incrementDepth ../depth)}}
      {{/if_include_struct_item_value}}
    {{/zcl_struct_items_by_struct_and_cluster_name}}

  {{else}}
    {{target}} =
    {{#if (chip_tests_variables_has definedValue)}}
      [{{definedValue}} copy];
    {{else if (chip_tests_config_has definedValue)}}
      m{{asUpperCamelCase definedValue}}.HasValue() ?
      {{#if (isCharString type)}}
        [[NSString alloc] initWithBytes:m{{asUpperCamelCase definedValue}}.Value().data() length:m{{asUpperCamelCase definedValue}}.Value().size() encoding:NSUTF8StringEncoding] : @"{{chip_tests_config_get_default_value definedValue}}";
      {{else if (isOctetString type)}}
        [NSData dataWithBytes:m{{asUpperCamelCase definedValue}}.Value().data() length:m{{asUpperCamelCase definedValue}}.Value().size()] : {{> octetStringValue value=(chip_tests_config_get_default_value definedValue)}};
      {{else}}
        [NSNumber numberWith{{asObjectiveCNumberType definedValue type false}}:m{{asUpperCamelCase definedValue}}.Value()] :
        [NSNumber numberWith{{asObjectiveCNumberType definedValue type false}}:{{asTypedExpressionFromObjectiveC (chip_tests_config_get_default_value definedValue) type}}];
      {{/if}}
    {{else}}
      {{#if (isCharString type)}}
        @"{{definedValue}}";
      {{else if (isOctetString type)}}
        {{> octetStringValue value=definedValue}};
      {{else}}
        [NSNumber numberWith{{asObjectiveCNumberType definedValue type false}}:{{asTypedExpressionFromObjectiveC definedValue type}}];
      {{/if}}
    {{/if}}
  {{/if_is_struct}}
{{/if}}
